*
Ϊ͵ClassʹJSOOPΪ
Ϊ1519汾bug1543Ϊ
*/
var Class = new Native({

 //,Ϊ$typeṩ׼ж
 name: 'Class',

 //JS wayĹ캯ʼPrototype?
 initialize: function(properties){

  properties = properties || {};

  //ڷصԭ
  var klass = function(empty){

   //ǰȽ      
   for (var key in this) this[key] = $unlink(this[key]);
   
   //Class.Mutatorsķʹ֧ʵֺͼ̳
   for (var mutator in Class.Mutators){
    if (!this[mutator]) continue;
    Class.Mutators[mutator](this, this[mutator]);

    //ʹãƳ
    delete this[mutator];
   }

   this.constructor = klass;
   
   //캯պʱֱӷأ
   if (empty === $empty) return this;
   
   //౾Ĺ캯ԭ
   var self = (this.initialize) ? this.initialize.apply(this, arguments) : this;

   //ڲеķֱִУݲ
   if (this.options && this.options.initialize) this.options.initialize.call(this);

   return self;
  };

  //ClassԸƸklass൱klass̳Class
  $extend(klass, this);
  klass.constructor = Class;

  //ָԭ
  klass.prototype = properties;
  return klass;
 }

});

//ʹü̳Nativeimplementµimplement֮
Class.implement({

 implement: function(){
  Class.Mutators.Implements(this.prototype, Array.slice(arguments));
  return this;
 }

});

Class.Mutators = {};

/*
ʹ֧Implementsдʵ
var myClass = new Class({
 Implements : [Events, Options],
 ...
});
*/
Class.Mutators.Implements = function(self, klasses){
 //$splatʹֶ֧Implements
 $splat(klasses).each(function(klass){
  $extend(self, ($type(klass) == 'class') ? new klass($empty) : klass);
 });
};

/*
ʹ֧Extendsд̳
var myClass = new Class({
 Extends : Base,
 ...
});
*/
Class.Mutators.Extends = function(self, klass){
 klass = new klass($empty);
 for (var property in klass){
  var kp = klass[property];
  var sp = self[property];
  self[property] = (function(previous, current){
   //̳гͬԡʱĴ
   if ($defined(current) && previous != current){
    var type = $type(current);
    if (type != $type(previous)) return current;
    switch (type){
     case 'function':
      return function(){
       //̳гͬʱthis.parentõͬ
       current.parent = this.parent = previous.bind(this);
       var value = current.apply(this, arguments);
       this.parent = current.parent;
       return value;
      };
     case 'object': return $merge(previous, current);
     default: return current;
    }
   }
   return previous;
  })(kp, sp);
 }
};

