You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.0 KiB
86 lines
3.0 KiB
// 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; |
|
};
|
|
|