forked from rockstor/rockstor-jslibs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cocktail.js
85 lines (69 loc) · 2.71 KB
/
cocktail.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Cocktail.js 0.3.0
// (c) 2012 Onsi Fakhouri
// Cocktail.js may be freely distributed under the MIT license.
// http://github.com/onsi/cocktail
(function() {
var Cocktail;
if (typeof exports !== 'undefined') {
Cocktail = exports;
} else {
Cocktail = this.Cocktail = {};
}
Cocktail.mixins = {};
Cocktail.mixin = function mixin(klass) {
var mixins = _.chain(arguments).toArray().rest().flatten().value();
var collisions = {};
_(mixins).each(function(mixin) {
if (_.isString(mixin)) {
mixin = Cocktail.mixins[mixin];
}
_(mixin).each(function(value, key) {
if (_.isFunction(value)) {
if (klass.prototype[key]) {
collisions[key] = collisions[key] || [klass.prototype[key]];
collisions[key].push(value);
}
klass.prototype[key] = value;
} else if (_.isObject(value)) {
klass.prototype[key] = _.extend({}, value, klass.prototype[key] || {});
}
});
});
_(collisions).each(function(propertyValues, propertyName) {
klass.prototype[propertyName] = function() {
var that = this,
args = arguments,
returnValue = undefined;
_(propertyValues).each(function(value) {
var returnedValue = _.isFunction(value) ? value.apply(that, args) : value;
returnValue = (returnedValue === undefined ? returnValue : returnedValue);
});
return returnValue;
}
});
};
var originalExtend;
Cocktail.patch = function patch(Backbone) {
originalExtend = Backbone.Model.extend;
var extend = function(protoProps, classProps) {
var klass = originalExtend.call(this, protoProps, classProps);
var mixins = klass.prototype.mixins;
if (mixins && klass.prototype.hasOwnProperty('mixins')) {
Cocktail.mixin(klass, mixins);
}
return klass;
};
_([Backbone.Model, Backbone.Collection, Backbone.Router, Backbone.View]).each(function(klass) {
klass.mixin = function mixin() {
Cocktail.mixin(this, _.toArray(arguments));
}
klass.extend = extend;
});
};
Cocktail.unpatch = function unpatch(Backbone) {
_([Backbone.Model, Backbone.Collection, Backbone.Router, Backbone.View]).each(function(klass) {
klass.mixin = undefined;
klass.extend = originalExtend;
});
};
})();