Subversion Repositories Applications.papyrus

Rev

Rev 1987 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
        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;