function Stack(){ Object.defineProperties( this, { add:{ enumerable:true, writable:false, value:addToStack }, next:{ enumerable:true, writable:false, value:run }, clear:{ enumerable:true, writable:false, value:clearStack }, contents:{ enumerable:false, get:getStack, set:setStack }, autoRun:{ enumerable:true, writable:true, value:true }, stop:{ enumerable:true, writable:true, value:false } } ); var stack=[]; var running=false; var stop=false; function clearStack(){ stack=[]; return stack; } function getStack(){ return stack; } function setStack(val){ stack=val; return stack; } function addToStack(){ for(var i in arguments){ stack.unshift(arguments[i]); } if(!running && !this.stop && this.autoRun){ this.next(); } } function run(){ running=true; if(stack.length<1 || this.stop){ running=false; return; } stack.shift().bind(this)(); } }