function BaseEvent(){}
BaseEvent.prototype = {
    triggerEvent: function (eventName, args) {
        if (this._cbs[eventName]) {
            var len = this._cbs[eventName].length;
            for (var i = 0; i < len; i++){
                this._cbs[eventName][i](args);
            }
        }
    },
    addEventListener: function (eventName, callback) {
        if (!this._cbs[eventName]){
            this._cbs[eventName] = [];
        }
        this._cbs[eventName].push(callback);

        return function() {
            this.removeEventListener(eventName, callback);
        }.bind(this);
    },
    removeEventListener: function (eventName,callback){
        if (!callback){
            this._cbs[eventName] = null;
        }else if(this._cbs[eventName]){
            var i = 0, len = this._cbs[eventName].length;
            while(i<len){
                if(this._cbs[eventName][i] === callback){
                    this._cbs[eventName].splice(i,1);
                    i -=1;
                    len -= 1;
                }
                i += 1;
            }
            if(!this._cbs[eventName].length){
                this._cbs[eventName] = null;
            }
        }
    }
};