Posted on 16/11/2010. By Pete Otaqui.
/** * EventEmitter Mixin * * Designed to be used in conjunction with a mixin "augment" function, * such as http://chamnapchhorn.blogspot.com/2009/05/javascript-mixins.html * * @usage augment(MyClass, EventEmitter); * my_inst = new MyClass(); * my_inst.on('someEvent', function(e){ console.dir(e); }); * my_inst.trigger('someEvent', {eventProp:'value'}); */ var EventEmitter = function() {}; EventEmitter.prototype.on = function(name, callback, context) { if ( !context ) context = this; if ( !this._listeners ) this._listeners = {}; if ( !this._listeners[name] ) this._listeners[name] = []; var f = function(e) { callback.apply(context, [e]); }; this._listeners[name].push(f); }; EventEmitter.prototype.trigger = function(name, event) { if ( !this._listeners ) this._listeners = {}; if ( !this._listeners[name] ) return; var i = this._listeners[name].length; while ( i-- ) this._listeners[name][i](event); }; EventEmitter.prototype.removeListener = function(name, callback) { if ( !this._listeners ) this._listeners = {}; if ( !this._listeners[name] ) return; var i = this._listeners[name].length; while ( i-- ) { if ( this._listeners[name][i] === callback ) { this._listeners[name].splice(i, 1); } } };