/*
Functionչ˼Ĳ֣JSܱزٵĲ
JSֻкǰȫ(withɿ)ŵJS OOPڴ
ֻһ㣬֪mooΪʲôʵֺĿﻯPrototypeӦʵ
*/

Function.implement({


 //չmooкܶ
ͬʵ
 extend: function(properties){

  for (var property in properties) this[property] = properties[property];

  return this;

 },


 //ºǿʵ֣չʵ

 create: function(options){
  
  //ĶָһʱԱڱհʹ
  var self = this;

  //ּ||д

  options = options || {};
  
  //һհeventҪڷIE¼

  return function(event){

   //ͬڱհʹõı

   var args = options.arguments;

   args = $defined(args) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
   
   /*
   ǷҪ¼
󣬿ԿȻ¼Ϊһ
   ʹbindWithEventʱҪķ/ĵһ¼
   */
   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);
   
   //ִָк$tryԴ

   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})();

 },

 

 //ھɺϰָthis
º
 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})();

 },

 //ﻯԼӣmoo

 curry: function() {
  if (!arguments.length) return this;
  var self = this, args = $A(arguments);
  return function() {
    return self.apply(this, args.extend($A(arguments)));
  }
 },


 //ֱִкֱӼ()ִȣṩıthisĶ

 run: function(args, bind){

  return this.apply(bind, $splat(args));

 }

 

});

