࣬OOP˵˵ǽӿڸǡһ

/*
ʽ֧֣ϵķִУͬʱִУͨFx
ҪĿʹʾʹImeplementsʵ֣ȻλõcallChain
*/
var Chain = new Class({

 //Implement ChainĶ󣬿ֱʹchainӺҪǶĽӿ
 chain: function(){
  this.$chain = (this.$chain || []).extend(arguments);
  return this;
 },

 //Implementڲʹʽִеʵ
 callChain: function(){
  return (this.$chain && this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
 },

 //еִеķ
 clearChain: function(){
  if (this.$chain) this.$chain.empty();
  return this;
 }

});

/*
¼֧
ԷװUIǳãǱģԶUWAcallbackŵö
*/
var Events = new Class({

 //ӵ¼
 addEvent: function(type, fn, internal){

  //ΪoptionsʹonEventName : $emptyдж
  if (fn != $empty){
   //ʹ||Ĭֵ
   this.$events = this.$events || {};
   //ʹ||Ĭֵ
   this.$events[type] = this.$events[type] || [];
   //include
   this.$events[type].include(fn);
   //Ƿ¼
   if (internal) fn.internal = true;
  }
  return this;
 },

 //Ӷ¼
 addEvents: function(events){
  for (var type in events) this.addEvent(type, events[type]);
  return this;
 },

 //¼
 fireEvent: function(type, args, delay){
  if (!this.$events || !this.$events[type]) return this;
  //ı֪ͨÿĶ
  this.$events[type].each(function(fn){
   fn.create({'bind': this, 'delay': delay, 'arguments': args})();
  }, this);
  return this;
 },

 //Ƴ¼
 removeEvent: function(type, fn){
  //˽бֵ¼ģ˲Ҫ
  if (!this.$events || !this.$events[type]) return this;

  //¼Ų
  if (!fn.internal) this.$events[type].erase(fn);
  return this;
 },

 //Ƴĳ¼ж֪ͨ
 removeEvents: function(type){
  for (var e in this.$events){
   if (type && type != e) continue;
   var fns = this.$events[e];
   for (var i = fns.length; i--; i) this.removeEvent(e, fns[i]);
  }
  return this;
 }

});

/*
캯ѡ֧֣
ҪĿʹʾʹImeplementsʵ֣ȻλõsetOptions(ͨڳʼĺ)
*/
var ptions = new Class({

 /*
 Ĳthis.optionsеĬϲϲ
 onͷһдĸĲֵΪͣΪ¼
 */
 setOptions: function(){

  //ע⺯runextend
  this.options = $merge.run([this.options].extend(arguments));

  /*
  ImplementEvents󣬻ԶaddEvent
  ֮addEventĻĴ¼Ĵû壬˷
  */
  if (!this.addEvent) return this;
  for (var option in this.options){

   //onͷһдĸĲֵΪͣΪ¼
   if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;

   //¼
   this.addEvent(option, this.options[option]);

   //
   delete this.options[option];
  }
  return this;
 }

});

