function Timer(){ this.intVal = 500; this.interval = null; this.events = []; this.listeners = []; this.start(); } Timer.prototype.start = function(){ this.interval = window.setInterval(this.intFunc.bind(this), this.intVal); } Timer.prototype.intFunc = function(){ this.events.each( function(ev, index){ var ret = ev.func.call(ev); if(ret !== false){ var lnrs = this.getListeners(ev.name); if(lnrs.length){ lnrs.each( function(lnr){ lnr.func.apply(lnr, [ret]); } ) } } }.bind(this) ); } Timer.prototype.getListeners = function(name){ var lnrs = []; this.listeners.each( function(lnr){ if(lnr.name == name){ lnrs.push(lnr); } } ); return lnrs; } Timer.prototype.registerEvent = function(ev){ this.events.push(ev); } Timer.prototype.registerEventListener = function(lnr){ this.listeners.push(lnr); } Timer.prototype.stop = function(){ window.clearInterval(this.interval); }