| // Generated by CoffeeScript 1.6.3 | 
| var classic, | 
|   __slice = [].slice; | 
|   | 
| module.exports = classic = {}; | 
|   | 
| classic.implement = function() { | 
|   var classProto, classReference, desc, member, mixin, mixins, _i, _j, _len; | 
|   mixins = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), classReference = arguments[_i++]; | 
|   for (_j = 0, _len = mixins.length; _j < _len; _j++) { | 
|     mixin = mixins[_j]; | 
|     classProto = classReference.prototype; | 
|     for (member in mixin.prototype) { | 
|       if (!Object.getOwnPropertyDescriptor(classProto, member)) { | 
|         desc = Object.getOwnPropertyDescriptor(mixin.prototype, member); | 
|         Object.defineProperty(classProto, member, desc); | 
|       } | 
|     } | 
|   } | 
|   return classReference; | 
| }; | 
|   | 
| classic.mix = function() { | 
|   var classProto, classReference, desc, member, mixin, mixins, _i, _j, _len; | 
|   mixins = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), classReference = arguments[_i++]; | 
|   classProto = classReference.prototype; | 
|   classReference.__mixinCloners = []; | 
|   classReference.__applyClonersFor = function(instance, args) { | 
|     var cloner, _j, _len, _ref; | 
|     if (args == null) { | 
|       args = null; | 
|     } | 
|     _ref = classReference.__mixinCloners; | 
|     for (_j = 0, _len = _ref.length; _j < _len; _j++) { | 
|       cloner = _ref[_j]; | 
|       cloner.apply(instance, args); | 
|     } | 
|   }; | 
|   classReference.__mixinInitializers = []; | 
|   classReference.__initMixinsFor = function(instance, args) { | 
|     var initializer, _j, _len, _ref; | 
|     if (args == null) { | 
|       args = null; | 
|     } | 
|     _ref = classReference.__mixinInitializers; | 
|     for (_j = 0, _len = _ref.length; _j < _len; _j++) { | 
|       initializer = _ref[_j]; | 
|       initializer.apply(instance, args); | 
|     } | 
|   }; | 
|   classReference.__mixinQuitters = []; | 
|   classReference.__applyQuittersFor = function(instance, args) { | 
|     var quitter, _j, _len, _ref; | 
|     if (args == null) { | 
|       args = null; | 
|     } | 
|     _ref = classReference.__mixinQuitters; | 
|     for (_j = 0, _len = _ref.length; _j < _len; _j++) { | 
|       quitter = _ref[_j]; | 
|       quitter.apply(instance, args); | 
|     } | 
|   }; | 
|   for (_j = 0, _len = mixins.length; _j < _len; _j++) { | 
|     mixin = mixins[_j]; | 
|     if (!(mixin.constructor instanceof Function)) { | 
|       throw Error("Mixin should be a function"); | 
|     } | 
|     for (member in mixin.prototype) { | 
|       if (member.substr(0, 11) === '__initMixin') { | 
|         classReference.__mixinInitializers.push(mixin.prototype[member]); | 
|         continue; | 
|       } else if (member.substr(0, 11) === '__clonerFor') { | 
|         classReference.__mixinCloners.push(mixin.prototype[member]); | 
|         continue; | 
|       } else if (member.substr(0, 12) === '__quitterFor') { | 
|         classReference.__mixinQuitters.push(mixin.prototype[member]); | 
|         continue; | 
|       } | 
|       if (!Object.getOwnPropertyDescriptor(classProto, member)) { | 
|         desc = Object.getOwnPropertyDescriptor(mixin.prototype, member); | 
|         Object.defineProperty(classProto, member, desc); | 
|       } | 
|     } | 
|   } | 
|   return classReference; | 
| }; |