/*
Script: Function.js
Contains Function Prototypes like create, bind, pass, and delay.
License:
MIT-style license.
*/
Function.implement({
extend: function(properties){
for (var property in properties) this[property] = properties[property];
return this;
},
create: function(options){
var self = this;
options = options || {};
return function(event){
var args = options.arguments;
args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
if (options.event) args = [event || window.event].extend(args);
var returns = function(){
return self.apply(options.bind || null, args);
};
if (options.delay) return setTimeout(returns, options.delay);
if (options.periodical) return setInterval(returns, options.periodical);
if (options.attempt) return $try(returns);
return returns();
};
},
pass: function(args, bind){
return this.create({arguments: args, bind: bind});
},
attempt: function(args, bind){
return this.create({arguments: args, bind: bind, attempt: true})();
},
bind: function(bind, args){
return this.create({bind: bind, arguments: args});
},
bindWithEvent: function(bind, args){
return this.create({bind: bind, event: true, arguments: args});
},
delay: function(delay, bind, args){
return this.create({delay: delay, bind: bind, arguments: args})();
},
periodical: function(interval, bind, args){
return this.create({periodical: interval, bind: bind, arguments: args})();
},
run: function(args, bind){
return this.apply(bind, $splat(args));
}
});