| 'use strict'; | 
|   | 
| function EventPubSub() { | 
|     this._events_={}; | 
|     this.publish=this.trigger=this.emit=emit; | 
|     this.subscribe=this.on=on; | 
|     this.once=once; | 
|     this.unSubscribe=this.off=off; | 
|     this.emit$=emit$; | 
|   | 
|     function on(type,handler,once){ | 
|         if(!handler){ | 
|             throw new ReferenceError('handler not defined.'); | 
|         } | 
|   | 
|         if(!this._events_[type]){ | 
|             this._events_[type]=[]; | 
|         } | 
|   | 
|         if(once){ | 
|             handler._once_ = once; | 
|         } | 
|         this._events_[type].push(handler); | 
|         return this; | 
|     } | 
|   | 
|     function once(type,handler){ | 
|         return this.on(type, handler, true); | 
|     } | 
|   | 
|     function off(type,handler){ | 
|         if(!this._events_[type]){ | 
|             return this; | 
|         } | 
|   | 
|         if(!handler){ | 
|             throw new ReferenceError('handler not defined. if you wish to remove all handlers from the event please pass "*" as the handler'); | 
|         } | 
|   | 
|         if(handler=='*'){ | 
|             delete this._events_[type]; | 
|             return this; | 
|         } | 
|   | 
|         var handlers=this._events_[type]; | 
|   | 
|         while(handlers.includes(handler)){ | 
|             handlers.splice( | 
|                 handlers.indexOf(handler), | 
|                 1 | 
|             ); | 
|         } | 
|   | 
|         if(handlers.length<1){ | 
|             delete this._events_[type]; | 
|         } | 
|   | 
|         return this; | 
|     } | 
|   | 
|     function emit(type){ | 
|         this.emit$.apply(this, arguments); | 
|         if(!this._events_[type]){ | 
|             return this; | 
|         } | 
|         arguments.splice=Array.prototype.splice; | 
|         arguments.splice(0,1); | 
|   | 
|         var handlers=this._events_[type]; | 
|         var onceHandled=[]; | 
|   | 
|         for(var i in handlers){ | 
|             var handler=handlers[i]; | 
|             handler.apply(this, arguments); | 
|             if(handler._once_){ | 
|               onceHandled.push(handler); | 
|             } | 
|         } | 
|   | 
|         for(var i in onceHandled){ | 
|             this.off( | 
|               type, | 
|               onceHandled[i] | 
|             ); | 
|         } | 
|   | 
|         return this; | 
|     } | 
|   | 
|     function emit$(type, args){ | 
|         if(!this._events_['*']){ | 
|             return this; | 
|         } | 
|   | 
|         var catchAll=this._events_['*']; | 
|   | 
|         args.shift=Array.prototype.shift; | 
|         args.shift(type); | 
|   | 
|         for(var handler of catchAll){ | 
|             handler.apply(this, args); | 
|         } | 
|   | 
|         return this; | 
|     } | 
|   | 
|     return this; | 
| } | 
|   | 
| if (!Array.prototype.includes) { | 
|   Array.prototype.includes = function(searchElement /*, fromIndex*/) { | 
|     'use strict'; | 
|     if (this == null) { | 
|       throw new TypeError('Array.prototype.includes called on null or undefined'); | 
|     } | 
|   | 
|     var O = Object(this); | 
|     var len = parseInt(O.length, 10) || 0; | 
|     if (len === 0) { | 
|       return false; | 
|     } | 
|     var n = parseInt(arguments[1], 10) || 0; | 
|     var k; | 
|     if (n >= 0) { | 
|       k = n; | 
|     } else { | 
|       k = len + n; | 
|       if (k < 0) {k = 0;} | 
|     } | 
|     var currentElement; | 
|     while (k < len) { | 
|       currentElement = O[k]; | 
|       if (searchElement === currentElement || | 
|          (searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN | 
|         return true; | 
|       } | 
|       k++; | 
|     } | 
|     return false; | 
|   }; | 
| } | 
|   | 
| module.exports=EventPubSub; |