Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / docs / source / ClassManager.html
diff --git a/docs/source/ClassManager.html b/docs/source/ClassManager.html
new file mode 100644 (file)
index 0000000..8bc35c3
--- /dev/null
@@ -0,0 +1,1079 @@
+<!DOCTYPE html><html><head><title>Sencha Documentation Project</title><link rel="stylesheet" href="../reset.css" type="text/css"><link rel="stylesheet" href="../prettify.css" type="text/css"><link rel="stylesheet" href="../prettify_sa.css" type="text/css"><script type="text/javascript" src="../prettify.js"></script></head><body onload="prettyPrint()"><pre class="prettyprint"><pre><span id='Ext-ClassManager'>/**
+</span> * @author Jacky Nguyen &lt;jacky@sencha.com&gt;
+ * @docauthor Jacky Nguyen &lt;jacky@sencha.com&gt;
+ * @class Ext.ClassManager
+
+Ext.ClassManager manages all classes and handles mapping from string class name to
+actual class objects throughout the whole framework. It is not generally accessed directly, rather through
+these convenient shorthands:
+
+- {@link Ext#define Ext.define}
+- {@link Ext#create Ext.create}
+- {@link Ext#widget Ext.widget}
+- {@link Ext#getClass Ext.getClass}
+- {@link Ext#getClassName Ext.getClassName}
+
+ * @singleton
+ * @markdown
+ */
+(function(Class, alias) {
+
+    var slice = Array.prototype.slice;
+
+    var Manager = Ext.ClassManager = {
+
+<span id='Ext-ClassManager-property-classes'>        /**
+</span>         * @property classes
+         * @type Object
+         * All classes which were defined through the ClassManager. Keys are the
+         * name of the classes and the values are references to the classes.
+         * @private
+         */
+        classes: {},
+
+<span id='Ext-ClassManager-property-existCache'>        /**
+</span>         * @private
+         */
+        existCache: {},
+
+<span id='Ext-ClassManager-property-namespaceRewrites'>        /**
+</span>         * @private
+         */
+        namespaceRewrites: [{
+            from: 'Ext.',
+            to: Ext
+        }],
+
+<span id='Ext-ClassManager-property-maps'>        /**
+</span>         * @private
+         */
+        maps: {
+            alternateToName: {},
+            aliasToName: {},
+            nameToAliases: {}
+        },
+
+<span id='Ext-ClassManager-property-enableNamespaceParseCache'>        /** @private */
+</span>        enableNamespaceParseCache: true,
+
+<span id='Ext-ClassManager-property-namespaceParseCache'>        /** @private */
+</span>        namespaceParseCache: {},
+
+<span id='Ext-ClassManager-property-instantiators'>        /** @private */
+</span>        instantiators: [],
+
+        //&lt;debug&gt;
+<span id='Ext-ClassManager-property-instantiationCounts'>        /** @private */
+</span>        instantiationCounts: {},
+        //&lt;/debug&gt;
+
+<span id='Ext-ClassManager-method-isCreated'>        /**
+</span>         * Checks if a class has already been created.
+         *
+         * @param {String} className
+         * @return {Boolean} exist
+         */
+        isCreated: function(className) {
+            var i, ln, part, root, parts;
+
+            //&lt;debug error&gt;
+            if (typeof className !== 'string' || className.length &lt; 1) {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext.ClassManager&quot;,
+                    sourceMethod: &quot;exist&quot;,
+                    msg: &quot;Invalid classname, must be a string and must not be empty&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            if (this.classes.hasOwnProperty(className) || this.existCache.hasOwnProperty(className)) {
+                return true;
+            }
+
+            root = Ext.global;
+            parts = this.parseNamespace(className);
+
+            for (i = 0, ln = parts.length; i &lt; ln; i++) {
+                part = parts[i];
+
+                if (typeof part !== 'string') {
+                    root = part;
+                } else {
+                    if (!root || !root[part]) {
+                        return false;
+                    }
+
+                    root = root[part];
+                }
+            }
+
+            Ext.Loader.historyPush(className);
+
+            this.existCache[className] = true;
+
+            return true;
+        },
+
+<span id='Ext-ClassManager-method-parseNamespace'>        /**
+</span>         * Supports namespace rewriting
+         * @private
+         */
+        parseNamespace: function(namespace) {
+            //&lt;debug error&gt;
+            if (typeof namespace !== 'string') {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext.ClassManager&quot;,
+                    sourceMethod: &quot;parseNamespace&quot;,
+                    msg: &quot;Invalid namespace, must be a string&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            var cache = this.namespaceParseCache;
+
+            if (this.enableNamespaceParseCache) {
+                if (cache.hasOwnProperty(namespace)) {
+                    return cache[namespace];
+                }
+            }
+
+            var parts = [],
+                rewrites = this.namespaceRewrites,
+                rewrite, from, to, i, ln, root = Ext.global;
+
+            for (i = 0, ln = rewrites.length; i &lt; ln; i++) {
+                rewrite = rewrites[i];
+                from = rewrite.from;
+                to = rewrite.to;
+
+                if (namespace === from || namespace.substring(0, from.length) === from) {
+                    namespace = namespace.substring(from.length);
+
+                    if (typeof to !== 'string') {
+                        root = to;
+                    } else {
+                        parts = parts.concat(to.split('.'));
+                    }
+
+                    break;
+                }
+            }
+
+            parts.push(root);
+
+            parts = parts.concat(namespace.split('.'));
+
+            if (this.enableNamespaceParseCache) {
+                cache[namespace] = parts;
+            }
+
+            return parts;
+        },
+
+<span id='Ext-ClassManager-method-setNamespace'>        /**
+</span>         * Creates a namespace and assign the `value` to the created object
+
+    Ext.ClassManager.setNamespace('MyCompany.pkg.Example', someObject);
+
+    alert(MyCompany.pkg.Example === someObject); // alerts true
+
+         * @param {String} name
+         * @param {Mixed} value
+         * @markdown
+         */
+        setNamespace: function(name, value) {
+            var root = Ext.global,
+                parts = this.parseNamespace(name),
+                leaf = parts.pop(),
+                i, ln, part;
+
+            for (i = 0, ln = parts.length; i &lt; ln; i++) {
+                part = parts[i];
+
+                if (typeof part !== 'string') {
+                    root = part;
+                } else {
+                    if (!root[part]) {
+                        root[part] = {};
+                    }
+
+                    root = root[part];
+                }
+            }
+
+            root[leaf] = value;
+
+            return root[leaf];
+        },
+
+<span id='Ext-ClassManager-method-createNamespaces'>        /**
+</span>         * The new Ext.ns, supports namespace rewriting
+         * @private
+         */
+        createNamespaces: function() {
+            var root = Ext.global,
+                parts, part, i, j, ln, subLn;
+
+            for (i = 0, ln = arguments.length; i &lt; ln; i++) {
+                parts = this.parseNamespace(arguments[i]);
+
+                for (j = 0, subLn = parts.length; j &lt; subLn; j++) {
+                    part = parts[j];
+
+                    if (typeof part !== 'string') {
+                        root = part;
+                    } else {
+                        if (!root[part]) {
+                            root[part] = {};
+                        }
+
+                        root = root[part];
+                    }
+                }
+            }
+
+            return root;
+        },
+
+<span id='Ext-ClassManager-method-set'>        /**
+</span>         * Sets a name reference to a class.
+         *
+         * @param {String} name
+         * @param {Object} value
+         * @return {Ext.ClassManager} this
+         */
+        set: function(name, value) {
+            var targetName = this.getName(value);
+
+            this.classes[name] = this.setNamespace(name, value);
+
+            if (targetName &amp;&amp; targetName !== name) {
+                this.maps.alternateToName[name] = targetName;
+            }
+
+            return this;
+        },
+
+<span id='Ext-ClassManager-method-get'>        /**
+</span>         * Retrieve a class by its name.
+         *
+         * @param {String} name
+         * @return {Class} class
+         */
+        get: function(name) {
+            if (this.classes.hasOwnProperty(name)) {
+                return this.classes[name];
+            }
+
+            var root = Ext.global,
+                parts = this.parseNamespace(name),
+                part, i, ln;
+
+            for (i = 0, ln = parts.length; i &lt; ln; i++) {
+                part = parts[i];
+
+                if (typeof part !== 'string') {
+                    root = part;
+                } else {
+                    if (!root || !root[part]) {
+                        return null;
+                    }
+
+                    root = root[part];
+                }
+            }
+
+            return root;
+        },
+
+<span id='Ext-ClassManager-method-setAlias'>        /**
+</span>         * Register the alias for a class.
+         *
+         * @param {Class/String} cls a reference to a class or a className
+         * @param {String} alias Alias to use when referring to this class
+         */
+        setAlias: function(cls, alias) {
+            var aliasToNameMap = this.maps.aliasToName,
+                nameToAliasesMap = this.maps.nameToAliases,
+                className;
+
+            if (typeof cls === 'string') {
+                className = cls;
+            } else {
+                className = this.getName(cls);
+            }
+
+            if (alias &amp;&amp; aliasToNameMap[alias] !== className) {
+                //&lt;debug info&gt;
+                if (aliasToNameMap.hasOwnProperty(alias) &amp;&amp; Ext.isDefined(Ext.global.console)) {
+                    Ext.global.console.log(&quot;[Ext.ClassManager] Overriding existing alias: '&quot; + alias + &quot;' &quot; +
+                        &quot;of: '&quot; + aliasToNameMap[alias] + &quot;' with: '&quot; + className + &quot;'. Be sure it's intentional.&quot;);
+                }
+                //&lt;/debug&gt;
+
+                aliasToNameMap[alias] = className;
+            }
+
+            if (!nameToAliasesMap[className]) {
+                nameToAliasesMap[className] = [];
+            }
+
+            if (alias) {
+                Ext.Array.include(nameToAliasesMap[className], alias);
+            }
+
+            return this;
+        },
+
+<span id='Ext-ClassManager-method-getByAlias'>        /**
+</span>         * Get a reference to the class by its alias.
+         *
+         * @param {String} alias
+         * @return {Class} class
+         */
+        getByAlias: function(alias) {
+            return this.get(this.getNameByAlias(alias));
+        },
+
+<span id='Ext-ClassManager-method-getNameByAlias'>        /**
+</span>         * Get the name of a class by its alias.
+         *
+         * @param {String} alias
+         * @return {String} className
+         */
+        getNameByAlias: function(alias) {
+            return this.maps.aliasToName[alias] || '';
+        },
+
+<span id='Ext-ClassManager-method-getNameByAlternate'>        /**
+</span>         * Get the name of a class by its alternate name.
+         *
+         * @param {String} alternate
+         * @return {String} className
+         */
+        getNameByAlternate: function(alternate) {
+            return this.maps.alternateToName[alternate] || '';
+        },
+
+<span id='Ext-ClassManager-method-getAliasesByName'>        /**
+</span>         * Get the aliases of a class by the class name
+         *
+         * @param {String} name
+         * @return {Array} aliases
+         */
+        getAliasesByName: function(name) {
+            return this.maps.nameToAliases[name] || [];
+        },
+
+<span id='Ext-ClassManager-method-getName'>        /**
+</span>         * Get the name of the class by its reference or its instance;
+         * usually invoked by the shorthand {@link Ext#getClassName Ext.getClassName}
+
+    Ext.ClassManager.getName(Ext.Action); // returns &quot;Ext.Action&quot;
+
+         * @param {Class/Object} object
+         * @return {String} className
+         * @markdown
+         */
+        getName: function(object) {
+            return object &amp;&amp; object.$className || '';
+        },
+
+<span id='Ext-ClassManager-method-getClass'>        /**
+</span>         * Get the class of the provided object; returns null if it's not an instance
+         * of any class created with Ext.define. This is usually invoked by the shorthand {@link Ext#getClass Ext.getClass}
+         *
+    var component = new Ext.Component();
+
+    Ext.ClassManager.getClass(component); // returns Ext.Component
+             *
+         * @param {Object} object
+         * @return {Class} class
+         * @markdown
+         */
+        getClass: function(object) {
+            return object &amp;&amp; object.self || null;
+        },
+
+<span id='Ext-ClassManager-method-create'>        /**
+</span>         * Defines a class. This is usually invoked via the alias {@link Ext#define Ext.define}
+
+    Ext.ClassManager.create('My.awesome.Class', {
+        someProperty: 'something',
+        someMethod: function() { ... }
+        ...
+
+    }, function() {
+        alert('Created!');
+        alert(this === My.awesome.Class); // alerts true
+
+        var myInstance = new this();
+    });
+
+         * @param {String} className The class name to create in string dot-namespaced format, for example:
+         * 'My.very.awesome.Class', 'FeedViewer.plugin.CoolPager'
+         * It is highly recommended to follow this simple convention:
+
+- The root and the class name are 'CamelCased'
+- Everything else is lower-cased
+
+         * @param {Object} data The key - value pairs of properties to apply to this class. Property names can be of any valid
+         * strings, except those in the reserved listed below:
+
+- `mixins`
+- `statics`
+- `config`
+- `alias`
+- `self`
+- `singleton`
+- `alternateClassName`
+         *
+         * @param {Function} createdFn Optional callback to execute after the class is created, the execution scope of which
+         * (`this`) will be the newly created class itself.
+         * @return {Ext.Base}
+         * @markdown
+         */
+        create: function(className, data, createdFn) {
+            var manager = this;
+
+            //&lt;debug error&gt;
+            if (typeof className !== 'string') {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext&quot;,
+                    sourceMethod: &quot;define&quot;,
+                    msg: &quot;Invalid class name '&quot; + className + &quot;' specified, must be a non-empty string&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            data.$className = className;
+
+            return new Class(data, function() {
+                var postprocessorStack = data.postprocessors || manager.defaultPostprocessors,
+                    registeredPostprocessors = manager.postprocessors,
+                    index = 0,
+                    postprocessors = [],
+                    postprocessor, postprocessors, process, i, ln;
+
+                delete data.postprocessors;
+
+                for (i = 0, ln = postprocessorStack.length; i &lt; ln; i++) {
+                    postprocessor = postprocessorStack[i];
+
+                    if (typeof postprocessor === 'string') {
+                        postprocessor = registeredPostprocessors[postprocessor];
+
+                        if (!postprocessor.always) {
+                            if (data[postprocessor.name] !== undefined) {
+                                postprocessors.push(postprocessor.fn);
+                            }
+                        }
+                        else {
+                            postprocessors.push(postprocessor.fn);
+                        }
+                    }
+                    else {
+                        postprocessors.push(postprocessor);
+                    }
+                }
+
+                process = function(clsName, cls, clsData) {
+                    postprocessor = postprocessors[index++];
+
+                    if (!postprocessor) {
+                        manager.set(className, cls);
+
+                        Ext.Loader.historyPush(className);
+
+                        if (createdFn) {
+                            createdFn.call(cls, cls);
+                        }
+
+                        return;
+                    }
+
+                    if (postprocessor.call(this, clsName, cls, clsData, process) !== false) {
+                        process.apply(this, arguments);
+                    }
+                };
+
+                process.call(manager, className, this, data);
+            });
+        },
+
+<span id='Ext-ClassManager-method-instantiateByAlias'>        /**
+</span>         * Instantiate a class by its alias; usually invoked by the convenient shorthand {@link Ext#createByAlias Ext.createByAlias}
+         * If {@link Ext.Loader} is {@link Ext.Loader#setConfig enabled} and the class has not been defined yet, it will
+         * attempt to load the class via synchronous loading.
+
+    var window = Ext.ClassManager.instantiateByAlias('widget.window', { width: 600, height: 800, ... });
+
+         * @param {String} alias
+         * @param {Mixed} args,... Additional arguments after the alias will be passed to the
+         * class constructor.
+         * @return {Object} instance
+         * @markdown
+         */
+        instantiateByAlias: function() {
+            var alias = arguments[0],
+                args = slice.call(arguments),
+                className = this.getNameByAlias(alias);
+
+            if (!className) {
+                className = this.maps.aliasToName[alias];
+
+                //&lt;debug error&gt;
+                if (!className) {
+                    Ext.Error.raise({
+                        sourceClass: &quot;Ext&quot;,
+                        sourceMethod: &quot;createByAlias&quot;,
+                        msg: &quot;Cannot create an instance of unrecognized alias: &quot; + alias
+                    });
+                }
+                //&lt;/debug&gt;
+
+                //&lt;debug warn&gt;
+                if (Ext.global.console) {
+                    Ext.global.console.warn(&quot;[Ext.Loader] Synchronously loading '&quot; + className + &quot;'; consider adding &quot; +
+                         &quot;Ext.require('&quot; + alias + &quot;') above Ext.onReady&quot;);
+                }
+                //&lt;/debug&gt;
+
+                Ext.syncRequire(className);
+            }
+
+            args[0] = className;
+
+            return this.instantiate.apply(this, args);
+        },
+
+<span id='Ext-ClassManager-method-instantiate'>        /**
+</span>         * Instantiate a class by either full name, alias or alternate name; usually invoked by the convenient
+         * shorthand {@link Ext#create Ext.create}
+         *
+         * If {@link Ext.Loader} is {@link Ext.Loader#setConfig enabled} and the class has not been defined yet, it will
+         * attempt to load the class via synchronous loading.
+         *
+         * For example, all these three lines return the same result:
+
+    // alias
+    var window = Ext.ClassManager.instantiate('widget.window', { width: 600, height: 800, ... });
+
+    // alternate name
+    var window = Ext.ClassManager.instantiate('Ext.Window', { width: 600, height: 800, ... });
+
+    // full class name
+    var window = Ext.ClassManager.instantiate('Ext.window.Window', { width: 600, height: 800, ... });
+
+         * @param {String} name
+         * @param {Mixed} args,... Additional arguments after the name will be passed to the class' constructor.
+         * @return {Object} instance
+         * @markdown
+         */
+        instantiate: function() {
+            var name = arguments[0],
+                args = slice.call(arguments, 1),
+                alias = name,
+                possibleName, cls;
+
+            if (typeof name !== 'function') {
+                //&lt;debug error&gt;
+                if ((typeof name !== 'string' || name.length &lt; 1)) {
+                    Ext.Error.raise({
+                        sourceClass: &quot;Ext&quot;,
+                        sourceMethod: &quot;create&quot;,
+                        msg: &quot;Invalid class name or alias '&quot; + name + &quot;' specified, must be a non-empty string&quot;
+                    });
+                }
+                //&lt;/debug&gt;
+
+                cls = this.get(name);
+            }
+            else {
+                cls = name;
+            }
+
+            // No record of this class name, it's possibly an alias, so look it up
+            if (!cls) {
+                possibleName = this.getNameByAlias(name);
+
+                if (possibleName) {
+                    name = possibleName;
+
+                    cls = this.get(name);
+                }
+            }
+
+            // Still no record of this class name, it's possibly an alternate name, so look it up
+            if (!cls) {
+                possibleName = this.getNameByAlternate(name);
+
+                if (possibleName) {
+                    name = possibleName;
+
+                    cls = this.get(name);
+                }
+            }
+
+            // Still not existing at this point, try to load it via synchronous mode as the last resort
+            if (!cls) {
+                //&lt;debug warn&gt;
+                if (Ext.global.console) {
+                    Ext.global.console.warn(&quot;[Ext.Loader] Synchronously loading '&quot; + name + &quot;'; consider adding &quot; +
+                         &quot;Ext.require('&quot; + ((possibleName) ? alias : name) + &quot;') above Ext.onReady&quot;);
+                }
+                //&lt;/debug&gt;
+
+                Ext.syncRequire(name);
+
+                cls = this.get(name);
+            }
+
+            //&lt;debug error&gt;
+            if (!cls) {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext&quot;,
+                    sourceMethod: &quot;create&quot;,
+                    msg: &quot;Cannot create an instance of unrecognized class name / alias: &quot; + alias
+                });
+            }
+
+            if (typeof cls !== 'function') {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext&quot;,
+                    sourceMethod: &quot;create&quot;,
+                    msg: &quot;'&quot; + name + &quot;' is a singleton and cannot be instantiated&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            //&lt;debug&gt;
+            if (!this.instantiationCounts[name]) {
+                this.instantiationCounts[name] = 0;
+            }
+
+            this.instantiationCounts[name]++;
+            //&lt;/debug&gt;
+
+            return this.getInstantiator(args.length)(cls, args);
+        },
+
+<span id='Ext-ClassManager-method-dynInstantiate'>        /**
+</span>         * @private
+         * @param name
+         * @param args
+         */
+        dynInstantiate: function(name, args) {
+            args = Ext.Array.from(args, true);
+            args.unshift(name);
+
+            return this.instantiate.apply(this, args);
+        },
+
+<span id='Ext-ClassManager-method-getInstantiator'>        /**
+</span>         * @private
+         * @param length
+         */
+        getInstantiator: function(length) {
+            if (!this.instantiators[length]) {
+                var i = length,
+                    args = [];
+
+                for (i = 0; i &lt; length; i++) {
+                    args.push('a['+i+']');
+                }
+
+                this.instantiators[length] = new Function('c', 'a', 'return new c('+args.join(',')+')');
+            }
+
+            return this.instantiators[length];
+        },
+
+<span id='Ext-ClassManager-property-postprocessors'>        /**
+</span>         * @private
+         */
+        postprocessors: {},
+
+<span id='Ext-ClassManager-property-defaultPostprocessors'>        /**
+</span>         * @private
+         */
+        defaultPostprocessors: [],
+
+<span id='Ext-ClassManager-method-registerPostprocessor'>        /**
+</span>         * Register a post-processor function.
+         *
+         * @param {String} name
+         * @param {Function} postprocessor
+         */
+        registerPostprocessor: function(name, fn, always) {
+            this.postprocessors[name] = {
+                name: name,
+                always: always ||  false,
+                fn: fn
+            };
+
+            return this;
+        },
+
+<span id='Ext-ClassManager-method-setDefaultPostprocessors'>        /**
+</span>         * Set the default post processors array stack which are applied to every class.
+         *
+         * @param {String/Array} The name of a registered post processor or an array of registered names.
+         * @return {Ext.ClassManager} this
+         */
+        setDefaultPostprocessors: function(postprocessors) {
+            this.defaultPostprocessors = Ext.Array.from(postprocessors);
+
+            return this;
+        },
+
+<span id='Ext-ClassManager-method-setDefaultPostprocessorPosition'>        /**
+</span>         * Insert this post-processor at a specific position in the stack, optionally relative to
+         * any existing post-processor
+         *
+         * @param {String} name The post-processor name. Note that it needs to be registered with
+         * {@link Ext.ClassManager#registerPostprocessor} before this
+         * @param {String} offset The insertion position. Four possible values are:
+         * 'first', 'last', or: 'before', 'after' (relative to the name provided in the third argument)
+         * @param {String} relativeName
+         * @return {Ext.ClassManager} this
+         */
+        setDefaultPostprocessorPosition: function(name, offset, relativeName) {
+            var defaultPostprocessors = this.defaultPostprocessors,
+                index;
+
+            if (typeof offset === 'string') {
+                if (offset === 'first') {
+                    defaultPostprocessors.unshift(name);
+
+                    return this;
+                }
+                else if (offset === 'last') {
+                    defaultPostprocessors.push(name);
+
+                    return this;
+                }
+
+                offset = (offset === 'after') ? 1 : -1;
+            }
+
+            index = Ext.Array.indexOf(defaultPostprocessors, relativeName);
+
+            if (index !== -1) {
+                defaultPostprocessors.splice(Math.max(0, index + offset), 0, name);
+            }
+
+            return this;
+        },
+
+<span id='Ext-ClassManager-method-getNamesByExpression'>        /**
+</span>         * Converts a string expression to an array of matching class names. An expression can either refers to class aliases
+         * or class names. Expressions support wildcards:
+
+     // returns ['Ext.window.Window']
+    var window = Ext.ClassManager.getNamesByExpression('widget.window');
+
+    // returns ['widget.panel', 'widget.window', ...]
+    var allWidgets = Ext.ClassManager.getNamesByExpression('widget.*');
+
+    // returns ['Ext.data.Store', 'Ext.data.ArrayProxy', ...]
+    var allData = Ext.ClassManager.getNamesByExpression('Ext.data.*');
+
+         * @param {String} expression
+         * @return {Array} classNames
+         * @markdown
+         */
+        getNamesByExpression: function(expression) {
+            var nameToAliasesMap = this.maps.nameToAliases,
+                names = [],
+                name, alias, aliases, possibleName, regex, i, ln;
+
+            //&lt;debug error&gt;
+            if (typeof expression !== 'string' || expression.length &lt; 1) {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext.ClassManager&quot;,
+                    sourceMethod: &quot;getNamesByExpression&quot;,
+                    msg: &quot;Expression &quot; + expression + &quot; is invalid, must be a non-empty string&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            if (expression.indexOf('*') !== -1) {
+                expression = expression.replace(/\*/g, '(.*?)');
+                regex = new RegExp('^' + expression + '$');
+
+                for (name in nameToAliasesMap) {
+                    if (nameToAliasesMap.hasOwnProperty(name)) {
+                        aliases = nameToAliasesMap[name];
+
+                        if (name.search(regex) !== -1) {
+                            names.push(name);
+                        }
+                        else {
+                            for (i = 0, ln = aliases.length; i &lt; ln; i++) {
+                                alias = aliases[i];
+
+                                if (alias.search(regex) !== -1) {
+                                    names.push(name);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+
+            } else {
+                possibleName = this.getNameByAlias(expression);
+
+                if (possibleName) {
+                    names.push(possibleName);
+                } else {
+                    possibleName = this.getNameByAlternate(expression);
+
+                    if (possibleName) {
+                        names.push(possibleName);
+                    } else {
+                        names.push(expression);
+                    }
+                }
+            }
+
+            return names;
+        }
+    };
+
+    Manager.registerPostprocessor('alias', function(name, cls, data) {
+        var aliases = data.alias,
+            widgetPrefix = 'widget.',
+            i, ln, alias;
+
+        if (!(aliases instanceof Array)) {
+            aliases = [aliases];
+        }
+
+        for (i = 0, ln = aliases.length; i &lt; ln; i++) {
+            alias = aliases[i];
+
+            //&lt;debug error&gt;
+            if (typeof alias !== 'string') {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext&quot;,
+                    sourceMethod: &quot;define&quot;,
+                    msg: &quot;Invalid alias of: '&quot; + alias + &quot;' for class: '&quot; + name + &quot;'; must be a valid string&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            this.setAlias(cls, alias);
+        }
+
+        // This is ugly, will change to make use of parseNamespace for alias later on
+        for (i = 0, ln = aliases.length; i &lt; ln; i++) {
+            alias = aliases[i];
+
+            if (alias.substring(0, widgetPrefix.length) === widgetPrefix) {
+                // Only the first alias with 'widget.' prefix will be used for xtype
+                cls.xtype = cls.$xtype = alias.substring(widgetPrefix.length);
+                break;
+            }
+        }
+    });
+
+    Manager.registerPostprocessor('singleton', function(name, cls, data, fn) {
+        fn.call(this, name, new cls(), data);
+        return false;
+    });
+
+    Manager.registerPostprocessor('alternateClassName', function(name, cls, data) {
+        var alternates = data.alternateClassName,
+            i, ln, alternate;
+
+        if (!(alternates instanceof Array)) {
+            alternates = [alternates];
+        }
+
+        for (i = 0, ln = alternates.length; i &lt; ln; i++) {
+            alternate = alternates[i];
+
+            //&lt;debug error&gt;
+            if (typeof alternate !== 'string') {
+                Ext.Error.raise({
+                    sourceClass: &quot;Ext&quot;,
+                    sourceMethod: &quot;define&quot;,
+                    msg: &quot;Invalid alternate of: '&quot; + alternate + &quot;' for class: '&quot; + name + &quot;'; must be a valid string&quot;
+                });
+            }
+            //&lt;/debug&gt;
+
+            this.set(alternate, cls);
+        }
+    });
+
+    Manager.setDefaultPostprocessors(['alias', 'singleton', 'alternateClassName']);
+
+    Ext.apply(Ext, {
+<span id='Ext-method-create'>        /**
+</span>         * Convenient shorthand, see {@link Ext.ClassManager#instantiate}
+         * @member Ext
+         * @method create
+         */
+        create: alias(Manager, 'instantiate'),
+
+<span id='Ext-ClassManager-method-factory'>        /**
+</span>         * @private
+         * API to be stablized
+         *
+         * @param {Mixed} item
+         * @param {String} namespace
+         */
+        factory: function(item, namespace) {
+            if (item instanceof Array) {
+                var i, ln;
+
+                for (i = 0, ln = item.length; i &lt; ln; i++) {
+                    item[i] = Ext.factory(item[i], namespace);
+                }
+
+                return item;
+            }
+
+            var isString = (typeof item === 'string');
+
+            if (isString || (item instanceof Object &amp;&amp; item.constructor === Object)) {
+                var name, config = {};
+
+                if (isString) {
+                    name = item;
+                }
+                else {
+                    name = item.className;
+                    config = item;
+                    delete config.className;
+                }
+
+                if (namespace !== undefined &amp;&amp; name.indexOf(namespace) === -1) {
+                    name = namespace + '.' + Ext.String.capitalize(name);
+                }
+
+                return Ext.create(name, config);
+            }
+
+            if (typeof item === 'function') {
+                return Ext.create(item);
+            }
+
+            return item;
+        },
+
+<span id='Ext-method-widget'>        /**
+</span>         * Convenient shorthand to create a widget by its xtype, also see {@link Ext.ClassManager#instantiateByAlias}
+
+    var button = Ext.widget('button'); // Equivalent to Ext.create('widget.button')
+    var panel = Ext.widget('panel'); // Equivalent to Ext.create('widget.panel')
+
+         * @member Ext
+         * @method widget
+         * @markdown
+         */
+        widget: function(name) {
+            var args = slice.call(arguments);
+            args[0] = 'widget.' + name;
+
+            return Manager.instantiateByAlias.apply(Manager, args);
+        },
+
+<span id='Ext-method-createByAlias'>        /**
+</span>         * Convenient shorthand, see {@link Ext.ClassManager#instantiateByAlias}
+         * @member Ext
+         * @method createByAlias
+         */
+        createByAlias: alias(Manager, 'instantiateByAlias'),
+
+<span id='Ext-method-define'>        /**
+</span>         * Convenient shorthand for {@link Ext.ClassManager#create}, see detailed {@link Ext.Class explanation}
+         * @member Ext
+         * @method define
+         */
+        define: alias(Manager, 'create'),
+
+<span id='Ext-method-getClassName'>        /**
+</span>         * Convenient shorthand, see {@link Ext.ClassManager#getName}
+         * @member Ext
+         * @method getClassName
+         */
+        getClassName: alias(Manager, 'getName'),
+
+<span id='Ext-ClassManager-method-getDisplayName'>        /**
+</span>         *
+         * @param {Mixed} object
+         */
+        getDisplayName: function(object) {
+            if (object.displayName) {
+                return object.displayName;
+            }
+
+            if (object.$name &amp;&amp; object.$class) {
+                return Ext.getClassName(object.$class) + '#' + object.$name;
+            }
+
+            if (object.$className) {
+                return object.$className;
+            }
+
+            return 'Anonymous';
+        },
+
+<span id='Ext-method-getClassName'>        /**
+</span>         * Convenient shorthand, see {@link Ext.ClassManager#getClass}
+         * @member Ext
+         * @method getClassName
+         */
+        getClass: alias(Manager, 'getClass'),
+
+<span id='Ext-method-namespace'>        /**
+</span>         * Creates namespaces to be used for scoping variables and classes so that they are not global.
+         * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
+
+    Ext.namespace('Company', 'Company.data');
+
+     // equivalent and preferable to the above syntax
+    Ext.namespace('Company.data');
+
+    Company.Widget = function() { ... };
+
+    Company.data.CustomStore = function(config) { ... };
+
+         * @param {String} namespace1
+         * @param {String} namespace2
+         * @param {String} etc
+         * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created)
+         * @function
+         * @member Ext
+         * @method namespace
+         * @markdown
+         */
+        namespace: alias(Manager, 'createNamespaces')
+    });
+
+    Ext.createWidget = Ext.widget;
+
+<span id='Ext-method-ns'>    /**
+</span>     * Convenient alias for {@link Ext#namespace Ext.namespace}
+     * @member Ext
+     * @method ns
+     */
+    Ext.ns = Ext.namespace;
+
+    Class.registerPreprocessor('className', function(cls, data) {
+        if (data.$className) {
+            cls.$className = data.$className;
+            //&lt;debug&gt;
+            cls.displayName = cls.$className;
+            //&lt;/debug&gt;
+        }
+    }, true);
+
+    Class.setDefaultPreprocessorPosition('className', 'first');
+
+})(Ext.Class, Ext.Function.alias);
+</pre></pre></body></html>
\ No newline at end of file