mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-11-03 04:40:10 +00:00
reworked action mixin mechanics, not will not overwrite existing attributes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
a8ae66fb7b
commit
0a890696c8
@ -524,13 +524,33 @@ module.MetaActions = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// Get mixin object in inheritance chain...
|
||||||
|
//
|
||||||
|
// NOTE: if pre is true this will return the chain item before the
|
||||||
|
// mixin, this is useful, for example, to remove mixins, see
|
||||||
|
// .mixout(..) for an example...
|
||||||
|
getMixin: function(from, pre){
|
||||||
|
var cur = this
|
||||||
|
var proto = this.__proto__
|
||||||
|
while(proto != null){
|
||||||
|
// we have a hit, pop it off the chain...
|
||||||
|
if(proto.hasOwnProperty('__mixin_source')
|
||||||
|
&& proto.__mixin_source === from){
|
||||||
|
return pre ? cur : proto
|
||||||
|
}
|
||||||
|
// go to next item in chain...
|
||||||
|
cur = proto
|
||||||
|
proto = cur.__proto__
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
},
|
||||||
|
|
||||||
// Mixin a set of actions into this...
|
// Mixin a set of actions into this...
|
||||||
//
|
//
|
||||||
// NOTE: if 'all' is set them mixin all the actions available,
|
// NOTE: if 'all' is set them mixin all the actions available,
|
||||||
// otherwise only mixin local actions...
|
// otherwise only mixin local actions...
|
||||||
//
|
// NOTE: this will override existing own attributes.
|
||||||
// XXX test
|
inlineMmixin: function(from, all, descriptors, all_attr_types){
|
||||||
mixin: function(from, all, descriptors, all_attr_types){
|
|
||||||
// defaults...
|
// defaults...
|
||||||
descriptors = descriptors || true
|
descriptors = descriptors || true
|
||||||
all_attr_types = all_attr_types || false
|
all_attr_types = all_attr_types || false
|
||||||
@ -546,6 +566,15 @@ module.MetaActions = {
|
|||||||
|
|
||||||
var that = this
|
var that = this
|
||||||
keys.forEach(function(k){
|
keys.forEach(function(k){
|
||||||
|
/*
|
||||||
|
// XXX is this the right way to go???
|
||||||
|
// check if we are not overwriting anything...
|
||||||
|
if(that.hasOwnProperty(k)){
|
||||||
|
console.warn('WARNING:', that,'already has attribute', k, '- skipping...')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// properties....
|
// properties....
|
||||||
var prop = Object.getOwnPropertyDescriptor(from, k)
|
var prop = Object.getOwnPropertyDescriptor(from, k)
|
||||||
if(descriptors && prop.get != null){
|
if(descriptors && prop.get != null){
|
||||||
@ -565,9 +594,25 @@ module.MetaActions = {
|
|||||||
return this
|
return this
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Same as .inlineMmixin(..) but isolates a mixin in a seporate object
|
||||||
|
// in the ingeritance chain...
|
||||||
|
//
|
||||||
|
mixin: function(from, all, descriptors, all_attr_types){
|
||||||
|
var proto = Object.create(this.__proto__)
|
||||||
|
|
||||||
|
// mixinto an empty object
|
||||||
|
proto.inlineMmixin(from, all, descriptors, all_attr_types)
|
||||||
|
|
||||||
|
// mark the mixin for simpler removal...
|
||||||
|
proto.__mixin_source = from
|
||||||
|
|
||||||
|
this.__proto__ = proto
|
||||||
|
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
// Mixin a set of local actions into an object...
|
// Mixin a set of local actions into an object...
|
||||||
//
|
//
|
||||||
// XXX test
|
|
||||||
mixinTo: function(to, all, descriptors, all_attr_types){
|
mixinTo: function(to, all, descriptors, all_attr_types){
|
||||||
return this.mixin.call(to, this, all, descriptors, all_attr_types)
|
return this.mixin.call(to, this, all, descriptors, all_attr_types)
|
||||||
},
|
},
|
||||||
@ -579,10 +624,7 @@ module.MetaActions = {
|
|||||||
// not be affected...
|
// not be affected...
|
||||||
// NOTE: this will not affect event handlers, they should be removed
|
// NOTE: this will not affect event handlers, they should be removed
|
||||||
// manually if needed...
|
// manually if needed...
|
||||||
//
|
inlineMixout: function(from, all, descriptors, all_attr_types){
|
||||||
// XXX not sure about these...
|
|
||||||
// XXX test
|
|
||||||
mixout: function(from, all, descriptors, all_attr_types){
|
|
||||||
// defaults...
|
// defaults...
|
||||||
descriptors = descriptors || true
|
descriptors = descriptors || true
|
||||||
all_attr_types = all_attr_types || false
|
all_attr_types = all_attr_types || false
|
||||||
@ -621,9 +663,24 @@ module.MetaActions = {
|
|||||||
return this
|
return this
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// This is similare in effect but different in mechanics to .inlineMixout(..)
|
||||||
|
//
|
||||||
|
// This will find and remove a mixin object from the inheritance chian.
|
||||||
|
//
|
||||||
|
// NOTE: this will remove only the first occurance of a mixin.
|
||||||
|
mixout: function(from){
|
||||||
|
var o = this.getMixin(from, true)
|
||||||
|
|
||||||
|
// pop the mixin off the chain...
|
||||||
|
if(o != null){
|
||||||
|
o.__proto__ = o.__proto__.__proto__
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
|
||||||
// Remove a set of local mixed in actions from object...
|
// Remove a set of local mixed in actions from object...
|
||||||
//
|
//
|
||||||
// XXX test
|
|
||||||
mixoutFrom: function(to, all, descriptors, all_attr_types){
|
mixoutFrom: function(to, all, descriptors, all_attr_types){
|
||||||
return this.mixout.call(to, this, all, descriptors, all_attr_types)
|
return this.mixout.call(to, this, all, descriptors, all_attr_types)
|
||||||
},
|
},
|
||||||
|
|||||||
@ -30,6 +30,7 @@ function makeConstructor(name, a, b){
|
|||||||
// return new _constructor(json)
|
// return new _constructor(json)
|
||||||
var obj = {}
|
var obj = {}
|
||||||
obj.__proto__ = _constructor.prototype
|
obj.__proto__ = _constructor.prototype
|
||||||
|
// XXX for some reason this does not resolve from .__proto__
|
||||||
obj.constructor = _constructor
|
obj.constructor = _constructor
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user