(function() {
	function makeBehaviour() {
      function Timer() {
            var self = this;
            var destroyed = false;
            var timer = 0.0;
            var ticking = false;
            var deferredActions = [];
            
            this.start = function() { ticking = true; return self; }
            this.pause = function() { ticking = false; return self; }
            this.continue = function() { ticking = true; return self; }

        	this.update = function(args) { 
            	if (!ticking) {
                    return;
                }
              	
                timer += Mixiply.deltaTime;
                
                var toRemove = [];
                for (var index = 0; index < deferredActions.length; index++) {
                    var deferredAction = deferredActions[index];
                    if (deferredAction.deferredTime <= timer) {
                        deferredAction.action();
                        toRemove.push(deferredAction);
                    }
                }

                if (toRemove.length > 0) {
                    deferredActions = deferredActions.filter(function(deferredAction, index, arr){
                        return !toRemove.includes(deferredAction);
                    });
                }
            }
        
        	this.addAction = function(delayInSeconds, action) {
                deferredActions.push({
                    action: action,
                    deferredTime: timer + delayInSeconds
                });
                
              	return self;
            }

        	this.onBeforeDestroy = function() {
              	if (destroyed) { return; }
              	destroyed = true;
              	deferredActions = [];
        	}
      };
      
      return new Timer();
    };
  
	Behaviour.register("timer", makeBehaviour)
})();