function DOMEvent(){ this.listeners = []; } DOMEvent.prototype.register = function(name, lnr, callslimit){ if(this.hasNamedListener(name)){ return; } var ev = { name: name, func: lnr, calls: 0, callslimit: callslimit ? callslimit : -1 }; this.listeners.insert(ev); } DOMEvent.prototype.remove = function(name){ this.listeners.each( function(lnr, index){ if(lnr.name == name){ this.listeners.remove(index); throw $break; } }.bind(this) ); } DOMEvent.prototype.fire = function(){ this.listeners.each( function(lnr){ lnr.func(); lnr.calls++; if(lnr.calls == lnr.callslimit){ this.remove(lnr.name) } }.bind(this) ) } DOMEvent.prototype.length = function(){ return this.listeners.length; } DOMEvent.prototype.hasNamedListener = function(name){ var ret = false; this.listeners.each( function(lnr){ if(lnr.name == name){ ret = true; throw $break; } } ); return ret; }