1 |
|
2 | var classic,
|
3 | __slice = [].slice;
|
4 |
|
5 | module.exports = classic = {};
|
6 |
|
7 | classic.implement = function() {
|
8 | var classProto, classReference, desc, member, mixin, mixins, _i, _j, _len;
|
9 | mixins = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), classReference = arguments[_i++];
|
10 | for (_j = 0, _len = mixins.length; _j < _len; _j++) {
|
11 | mixin = mixins[_j];
|
12 | classProto = classReference.prototype;
|
13 | for (member in mixin.prototype) {
|
14 | if (!Object.getOwnPropertyDescriptor(classProto, member)) {
|
15 | desc = Object.getOwnPropertyDescriptor(mixin.prototype, member);
|
16 | Object.defineProperty(classProto, member, desc);
|
17 | }
|
18 | }
|
19 | }
|
20 | return classReference;
|
21 | };
|
22 |
|
23 | classic.mix = function() {
|
24 | var classProto, classReference, desc, member, mixin, mixins, _i, _j, _len;
|
25 | mixins = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), classReference = arguments[_i++];
|
26 | classProto = classReference.prototype;
|
27 | classReference.__mixinCloners = [];
|
28 | classReference.__applyClonersFor = function(instance, args) {
|
29 | var cloner, _j, _len, _ref;
|
30 | if (args == null) {
|
31 | args = null;
|
32 | }
|
33 | _ref = classReference.__mixinCloners;
|
34 | for (_j = 0, _len = _ref.length; _j < _len; _j++) {
|
35 | cloner = _ref[_j];
|
36 | cloner.apply(instance, args);
|
37 | }
|
38 | };
|
39 | classReference.__mixinInitializers = [];
|
40 | classReference.__initMixinsFor = function(instance, args) {
|
41 | var initializer, _j, _len, _ref;
|
42 | if (args == null) {
|
43 | args = null;
|
44 | }
|
45 | _ref = classReference.__mixinInitializers;
|
46 | for (_j = 0, _len = _ref.length; _j < _len; _j++) {
|
47 | initializer = _ref[_j];
|
48 | initializer.apply(instance, args);
|
49 | }
|
50 | };
|
51 | classReference.__mixinQuitters = [];
|
52 | classReference.__applyQuittersFor = function(instance, args) {
|
53 | var quitter, _j, _len, _ref;
|
54 | if (args == null) {
|
55 | args = null;
|
56 | }
|
57 | _ref = classReference.__mixinQuitters;
|
58 | for (_j = 0, _len = _ref.length; _j < _len; _j++) {
|
59 | quitter = _ref[_j];
|
60 | quitter.apply(instance, args);
|
61 | }
|
62 | };
|
63 | for (_j = 0, _len = mixins.length; _j < _len; _j++) {
|
64 | mixin = mixins[_j];
|
65 | if (!(mixin.constructor instanceof Function)) {
|
66 | throw Error("Mixin should be a function");
|
67 | }
|
68 | for (member in mixin.prototype) {
|
69 | if (member.substr(0, 11) === '__initMixin') {
|
70 | classReference.__mixinInitializers.push(mixin.prototype[member]);
|
71 | continue;
|
72 | } else if (member.substr(0, 11) === '__clonerFor') {
|
73 | classReference.__mixinCloners.push(mixin.prototype[member]);
|
74 | continue;
|
75 | } else if (member.substr(0, 12) === '__quitterFor') {
|
76 | classReference.__mixinQuitters.push(mixin.prototype[member]);
|
77 | continue;
|
78 | }
|
79 | if (!Object.getOwnPropertyDescriptor(classProto, member)) {
|
80 | desc = Object.getOwnPropertyDescriptor(mixin.prototype, member);
|
81 | Object.defineProperty(classProto, member, desc);
|
82 | }
|
83 | }
|
84 | }
|
85 | return classReference;
|
86 | };
|