export function get ( key ) { return key ? this._state[ key ] : this._state; } export function fire ( eventName, data ) { var handlers = eventName in this._handlers && this._handlers[ eventName ].slice(); if ( !handlers ) return; for ( var i = 0; i < handlers.length; i += 1 ) { handlers[i].call( this, data ); } } export function observe ( key, callback, options ) { var group = ( options && options.defer ) ? this._observers.pre : this._observers.post; ( group[ key ] || ( group[ key ] = [] ) ).push( callback ); if ( !options || options.init !== false ) { callback.__calling = true; callback.call( this, this._state[ key ] ); callback.__calling = false; } return { cancel: function () { var index = group[ key ].indexOf( callback ); if ( ~index ) group[ key ].splice( index, 1 ); } }; } export function on ( eventName, handler ) { var handlers = this._handlers[ eventName ] || ( this._handlers[ eventName ] = [] ); handlers.push( handler ); return { cancel: function () { var index = handlers.indexOf( handler ); if ( ~index ) handlers.splice( index, 1 ); } }; } export function set ( newState ) { this._set( newState ); ( this._root || this )._flush(); } export function _flush () { if ( !this._renderHooks ) return; while ( this._renderHooks.length ) { var hook = this._renderHooks.pop(); hook.fn.call( hook.context ); } }