New file |
0,0 → 1,107 |
/* |
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; |
|