    /**
     * @class Ext.data.StoreManager
     * @extends Ext.util.MixedCollection
     * <p>Contains a collection of all stores that are created that have an identifier.
     * An identifier can be assigned by setting the {@link Ext.data.AbstractStore#storeId storeId}
     * property. When a store is in the StoreManager, it can be referred to via it's identifier:
     * <pre><code>
    Ext.create('Ext.data.Store', {
        model: 'SomeModel',
        storeId: 'myStore'
    });

    var store = Ext.data.StoreManager.lookup('myStore');
     * </code></pre>
     * Also note that the {@link #lookup} method is aliased to {@link Ext#getStore} for convenience.</p>
     * <p>
     * If a store is registered with the StoreManager, you can also refer to the store by it's identifier when
     * registering it with any Component that consumes data from a store:
     * <pre><code>
    Ext.create('Ext.data.Store', {
        model: 'SomeModel',
        storeId: 'myStore'
    });

    Ext.create('Ext.view.View', {
        store: 'myStore',
        // other configuration here
    });
     * </code></pre>
     * </p>
     * @singleton
     * @docauthor Evan Trimboli <evan@sencha.com>
     * TODO: Make this an AbstractMgr
     */
    Ext.define('Ext.data.StoreManager', {
        extend: 'Ext.util.MixedCollection',
        alternateClassName: ['Ext.StoreMgr', 'Ext.data.StoreMgr', 'Ext.StoreManager'],
        singleton: true,
        uses: ['Ext.data.ArrayStore'],

        /**
         * @cfg {Object} listeners @hide
         */

        /**
         * Registers one or more Stores with the StoreManager. You do not normally need to register stores
         * manually.  Any store initialized with a {@link Ext.data.Store#storeId} will be auto-registered.
         * @param {Ext.data.Store} store1 A Store instance
         * @param {Ext.data.Store} store2 (optional)
         * @param {Ext.data.Store} etc... (optional)
         */
        register : function() {
            for (var i = 0, s; (s = arguments[i]); i++) {
                this.add(s);
            }
        },

        /**
         * Unregisters one or more Stores with the StoreManager
         * @param {String/Object} id1 The id of the Store, or a Store instance
         * @param {String/Object} id2 (optional)
         * @param {String/Object} etc... (optional)
         */
        unregister : function() {
            for (var i = 0, s; (s = arguments[i]); i++) {
                this.remove(this.lookup(s));
            }
        },

        /**
         * Gets a registered Store by id
         * @param {String/Object} id The id of the Store, or a Store instance, or a store configuration
         * @return {Ext.data.Store}
         */
        lookup : function(store) {
            // handle the case when we are given an array or an array of arrays.
            if (Ext.isArray(store)) {
                var fields = ['field1'],
                    expand = !Ext.isArray(store[0]),
                    data = store,
                    i,
                    len;

                if(expand){
                    data = [];
                    for (i = 0, len = store.length; i < len; ++i) {
                        data.push([store[i]]);
                    }
                } else {
                    for(i = 2, len = store[0].length; i <= len; ++i){
                        fields.push('field' + i);
                    }
                }
                return Ext.create('Ext.data.ArrayStore', {
                    data  : data,
                    fields: fields,
                    autoDestroy: true,
                    autoCreated: true,
                    expanded: expand
                });
            }

            if (Ext.isString(store)) {
                // store id
                return this.get(store);
            } else {
                // store instance or store config
                return Ext.data.AbstractStore.create(store);
            }
        },

        // getKey implementation for MixedCollection
        getKey : function(o) {
             return o.storeId;
        }
    }, function() {
        /**
         * <p>Creates a new store for the given id and config, then registers it with the {@link Ext.data.StoreManager Store Mananger}.
         * Sample usage:</p>
        <pre><code>
        Ext.regStore('AllUsers', {
            model: 'User'
        });

        //the store can now easily be used throughout the application
        new Ext.List({
            store: 'AllUsers',
            ... other config
        });
        </code></pre>
         * @param {String} id The id to set on the new store
         * @param {Object} config The store config
         * @param {Constructor} cls The new Component class.
         * @member Ext
         * @method regStore
         */
        Ext.regStore = function(name, config) {
            var store;

            if (Ext.isObject(name)) {
                config = name;
            } else {
                config.storeId = name;
            }

            if (config instanceof Ext.data.Store) {
                store = config;
            } else {
                store = Ext.create('Ext.data.Store', config);
            }

            return Ext.data.StoreManager.register(store);
        };

        /**
         * Gets a registered Store by id (shortcut to {@link #lookup})
         * @param {String/Object} id The id of the Store, or a Store instance
         * @return {Ext.data.Store}
         * @member Ext
         * @method getStore
         */
        Ext.getStore = function(name) {
            return Ext.data.StoreManager.lookup(name);
        };
    });