| // Generated by CoffeeScript 1.6.3 | 
| var Emitter, array; | 
|   | 
| array = require('./array'); | 
|   | 
| module.exports = Emitter = (function() { | 
|   function Emitter() { | 
|     this._listeners = {}; | 
|     this._listenersForAnyEvent = []; | 
|     this._disabledEmitters = {}; | 
|   } | 
|   | 
|   Emitter.prototype.on = function(eventName, listener) { | 
|     if (this._listeners[eventName] == null) { | 
|       this._listeners[eventName] = []; | 
|     } | 
|     this._listeners[eventName].push(listener); | 
|     return this; | 
|   }; | 
|   | 
|   Emitter.prototype.once = function(eventName, listener) { | 
|     var cb, ran, | 
|       _this = this; | 
|     ran = false; | 
|     cb = function() { | 
|       if (ran) { | 
|         return; | 
|       } | 
|       ran = true; | 
|       listener(); | 
|       return setTimeout(function() { | 
|         return _this.removeEvent(eventName, cb); | 
|       }, 0); | 
|     }; | 
|     this.on(eventName, cb); | 
|     return this; | 
|   }; | 
|   | 
|   Emitter.prototype.onAnyEvent = function(listener) { | 
|     this._listenersForAnyEvent.push(listener); | 
|     return this; | 
|   }; | 
|   | 
|   Emitter.prototype.removeEvent = function(eventName, listener) { | 
|     if (this._listeners[eventName] == null) { | 
|       return this; | 
|     } | 
|     array.pluckOneItem(this._listeners[eventName], listener); | 
|     return this; | 
|   }; | 
|   | 
|   Emitter.prototype.removeListeners = function(eventName) { | 
|     if (this._listeners[eventName] == null) { | 
|       return this; | 
|     } | 
|     this._listeners[eventName].length = 0; | 
|     return this; | 
|   }; | 
|   | 
|   Emitter.prototype.removeAllListeners = function() { | 
|     var listeners, name, _ref; | 
|     _ref = this._listeners; | 
|     for (name in _ref) { | 
|       listeners = _ref[name]; | 
|       listeners.length = 0; | 
|     } | 
|     return this; | 
|   }; | 
|   | 
|   Emitter.prototype._emit = function(eventName, data) { | 
|     var listener, _i, _j, _len, _len1, _ref, _ref1; | 
|     _ref = this._listenersForAnyEvent; | 
|     for (_i = 0, _len = _ref.length; _i < _len; _i++) { | 
|       listener = _ref[_i]; | 
|       listener.call(this, data, eventName); | 
|     } | 
|     if (this._listeners[eventName] == null) { | 
|       return; | 
|     } | 
|     _ref1 = this._listeners[eventName]; | 
|     for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { | 
|       listener = _ref1[_j]; | 
|       listener.call(this, data); | 
|     } | 
|   }; | 
|   | 
|   Emitter.prototype._throttleEmitterMethod = function(fnName, time) { | 
|     var lastCallArgs, originalFn, pend, pending, runIt, timer, | 
|       _this = this; | 
|     if (time == null) { | 
|       time = 1000; | 
|     } | 
|     originalFn = this[fnName]; | 
|     if (typeof originalFn !== 'function') { | 
|       throw Error("this class does not have a method called '" + fnName + "'"); | 
|     } | 
|     lastCallArgs = null; | 
|     pending = false; | 
|     timer = null; | 
|     this[fnName] = function() { | 
|       lastCallArgs = arguments; | 
|       return pend(); | 
|     }; | 
|     pend = function() { | 
|       if (pending) { | 
|         clearTimeout(timer); | 
|       } | 
|       timer = setTimeout(runIt, time); | 
|       return pending = true; | 
|     }; | 
|     return runIt = function() { | 
|       pending = false; | 
|       return originalFn.apply(_this, lastCallArgs); | 
|     }; | 
|   }; | 
|   | 
|   Emitter.prototype._disableEmitter = function(fnName) { | 
|     if (this._disabledEmitters[fnName] != null) { | 
|       throw Error("" + fnName + " is already a disabled emitter"); | 
|     } | 
|     this._disabledEmitters[fnName] = this[fnName]; | 
|     return this[fnName] = function() {}; | 
|   }; | 
|   | 
|   Emitter.prototype._enableEmitter = function(fnName) { | 
|     var fn; | 
|     fn = this._disabledEmitters[fnName]; | 
|     if (fn == null) { | 
|       throw Error("" + fnName + " is not a disabled emitter"); | 
|     } | 
|     this[fnName] = fn; | 
|     return delete this._disabledEmitters[fnName]; | 
|   }; | 
|   | 
|   return Emitter; | 
|   | 
| })(); |