blob: 02bbea7413ffb80f86c63da97dc918c290bb080a [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.lang.declare");
dojo.require("dojo.lang.common");
dojo.require("dojo.lang.extras");
dojo.lang.declare = function (className, superclass, init, props) {
if ((dojo.lang.isFunction(props)) || ((!props) && (!dojo.lang.isFunction(init)))) {
var temp = props;
props = init;
init = temp;
}
var mixins = [];
if (dojo.lang.isArray(superclass)) {
mixins = superclass;
superclass = mixins.shift();
}
if (!init) {
init = dojo.evalObjPath(className, false);
if ((init) && (!dojo.lang.isFunction(init))) {
init = null;
}
}
var ctor = dojo.lang.declare._makeConstructor();
var scp = (superclass ? superclass.prototype : null);
if (scp) {
scp.prototyping = true;
ctor.prototype = new superclass();
scp.prototyping = false;
}
ctor.superclass = scp;
ctor.mixins = mixins;
for (var i = 0, l = mixins.length; i < l; i++) {
dojo.lang.extend(ctor, mixins[i].prototype);
}
ctor.prototype.initializer = null;
ctor.prototype.declaredClass = className;
if (dojo.lang.isArray(props)) {
dojo.lang.extend.apply(dojo.lang, [ctor].concat(props));
} else {
dojo.lang.extend(ctor, (props) || {});
}
dojo.lang.extend(ctor, dojo.lang.declare._common);
ctor.prototype.constructor = ctor;
ctor.prototype.initializer = (ctor.prototype.initializer) || (init) || (function () {
});
var created = dojo.parseObjPath(className, null, true);
created.obj[created.prop] = ctor;
return ctor;
};
dojo.lang.declare._makeConstructor = function () {
return function () {
var self = this._getPropContext();
var s = self.constructor.superclass;
if ((s) && (s.constructor)) {
if (s.constructor == arguments.callee) {
this._inherited("constructor", arguments);
} else {
this._contextMethod(s, "constructor", arguments);
}
}
var ms = (self.constructor.mixins) || ([]);
for (var i = 0, m; (m = ms[i]); i++) {
(((m.prototype) && (m.prototype.initializer)) || (m)).apply(this, arguments);
}
if ((!this.prototyping) && (self.initializer)) {
self.initializer.apply(this, arguments);
}
};
};
dojo.lang.declare._common = {_getPropContext:function () {
return (this.___proto || this);
}, _contextMethod:function (ptype, method, args) {
var result, stack = this.___proto;
this.___proto = ptype;
try {
result = ptype[method].apply(this, (args || []));
}
catch (e) {
throw e;
}
finally {
this.___proto = stack;
}
return result;
}, _inherited:function (prop, args) {
var p = this._getPropContext();
do {
if ((!p.constructor) || (!p.constructor.superclass)) {
return;
}
p = p.constructor.superclass;
} while (!(prop in p));
return (dojo.lang.isFunction(p[prop]) ? this._contextMethod(p, prop, args) : p[prop]);
}, inherited:function (prop, args) {
dojo.deprecated("'inherited' method is dangerous, do not up-call! 'inherited' is slated for removal in 0.5; name your super class (or use superclass property) instead.", "0.5");
this._inherited(prop, args);
}};
dojo.declare = dojo.lang.declare;