/* 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)); } });