|
@@ -190,17 +190,18 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
|
|
|
|
/* Method not implemented handlers */
|
|
/* Method not implemented handlers */
|
|
|
|
|
|
- var methods = [], methodDict = Object.create(null), checker = Object.create(null);
|
|
|
|
|
|
+ var methods = [], methodDict = Object.create(null);
|
|
this.selectors = [];
|
|
this.selectors = [];
|
|
|
|
+ this.jsSelectors = [];
|
|
|
|
|
|
this.get = function (stSelector) {
|
|
this.get = function (stSelector) {
|
|
var method = methodDict[stSelector];
|
|
var method = methodDict[stSelector];
|
|
if(method) {
|
|
if(method) {
|
|
return method;
|
|
return method;
|
|
}
|
|
}
|
|
- this.selectors.push(stSelector);
|
|
|
|
var jsSelector = st.st2js(stSelector);
|
|
var jsSelector = st.st2js(stSelector);
|
|
- checker[jsSelector] = true;
|
|
|
|
|
|
+ this.selectors.push(stSelector);
|
|
|
|
+ this.jsSelectors.push(jsSelector);
|
|
method = {jsSelector: jsSelector, fn: createHandler(stSelector)};
|
|
method = {jsSelector: jsSelector, fn: createHandler(stSelector)};
|
|
methodDict[stSelector] = method;
|
|
methodDict[stSelector] = method;
|
|
methods.push(method);
|
|
methods.push(method);
|
|
@@ -208,10 +209,6 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
return method;
|
|
return method;
|
|
};
|
|
};
|
|
|
|
|
|
- this.isSelector = function (jsSelector) {
|
|
|
|
- return checker[jsSelector];
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
/* Dnu handler method */
|
|
/* Dnu handler method */
|
|
|
|
|
|
function createHandler(stSelector) {
|
|
function createHandler(stSelector) {
|
|
@@ -219,19 +216,12 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
return brikz.messageSend.messageNotUnderstood(this, stSelector, arguments);
|
|
return brikz.messageSend.messageNotUnderstood(this, stSelector, arguments);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
-
|
|
|
|
- this.installHandlers = function (klass) {
|
|
|
|
- for(var i=0; i<methods.length; i++) {
|
|
|
|
- manip.installMethodIfAbsent(methods[i], klass);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
}
|
|
}
|
|
|
|
|
|
function ClassInitBrik(brikz, st) {
|
|
function ClassInitBrik(brikz, st) {
|
|
|
|
|
|
var dnu = brikz.ensure("dnu");
|
|
var dnu = brikz.ensure("dnu");
|
|
var manip = brikz.ensure("manipulation");
|
|
var manip = brikz.ensure("manipulation");
|
|
- var nil = brikz.ensure("root").nil;
|
|
|
|
|
|
|
|
/* Initialize a class in its class hierarchy. Handle both classes and
|
|
/* Initialize a class in its class hierarchy. Handle both classes and
|
|
metaclasses. */
|
|
metaclasses. */
|
|
@@ -246,46 +236,27 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
function initClass(klass) {
|
|
function initClass(klass) {
|
|
if(klass.wrapped) {
|
|
if(klass.wrapped) {
|
|
copySuperclass(klass);
|
|
copySuperclass(klass);
|
|
- dnu.installHandlers(klass);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
this.initClass = initClass;
|
|
this.initClass = initClass;
|
|
|
|
|
|
- function copySuperclass(klass, superclass) {
|
|
|
|
- var inheritedMethods = Object.create(null);
|
|
|
|
- deinstallAllMethods(klass);
|
|
|
|
- for (superclass = superclass || klass.superclass;
|
|
|
|
- superclass && superclass !== nil;
|
|
|
|
- superclass = superclass.superclass) {
|
|
|
|
- for (var keys = Object.keys(superclass.methods), i = 0; i < keys.length; i++) {
|
|
|
|
- inheritMethodIfAbsent(superclass.methods[keys[i]]);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- manip.reinstallMethods(klass);
|
|
|
|
-
|
|
|
|
- function inheritMethodIfAbsent(method) {
|
|
|
|
- var selector = method.selector;
|
|
|
|
-
|
|
|
|
- //TODO: prepare klass methods into inheritedMethods to only test once
|
|
|
|
- if(klass.methods[selector] || inheritedMethods[selector]) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- manip.installMethod(method, klass);
|
|
|
|
- inheritedMethods[method.selector] = true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function deinstallAllMethods(klass) {
|
|
|
|
- var proto = klass.fn.prototype;
|
|
|
|
- for(var keys = Object.getOwnPropertyNames(proto), i=0; i<keys.length; i++) {
|
|
|
|
- var key = keys[i];
|
|
|
|
- if (dnu.isSelector(key)) {
|
|
|
|
- proto[key] = null;
|
|
|
|
|
|
+ function copySuperclass(klass) {
|
|
|
|
+ var superclass = klass.superclass,
|
|
|
|
+ localMethods = klass.methods,
|
|
|
|
+ protectedJsSelectors = {};
|
|
|
|
+ Object.keys(localMethods).forEach(function (each) {
|
|
|
|
+ protectedJsSelectors[localMethods[each].jsSelector] = true;
|
|
|
|
+ });
|
|
|
|
+ var superproto = superclass.fn.prototype;
|
|
|
|
+ dnu.jsSelectors.forEach(function (selector) {
|
|
|
|
+ if (!protectedJsSelectors[selector]) {
|
|
|
|
+ manip.installMethod({
|
|
|
|
+ jsSelector: selector,
|
|
|
|
+ fn: superproto[selector]
|
|
|
|
+ }, klass);
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -304,13 +275,6 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
});
|
|
});
|
|
}
|
|
}
|
|
this.installMethod = installMethod;
|
|
this.installMethod = installMethod;
|
|
-
|
|
|
|
- this.reinstallMethods = function (klass) {
|
|
|
|
- var methods = klass.methods;
|
|
|
|
- for(var keys = Object.keys(methods), i=0; i<keys.length; i++) {
|
|
|
|
- installMethod(methods[keys[i]], klass);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
}
|
|
}
|
|
|
|
|
|
function ClassesBrik(brikz, st) {
|
|
function ClassesBrik(brikz, st) {
|