    /**
     * This class is used as a mixin.
     *
     * This class is to be used to provide basic methods for binding/unbinding stores to other
     * classes. In general it will not be used directly.
     */
    Ext.define('Ext.util.Bindable', {

        /**
         * Binds a store to this instance.
         * @param {Ext.data.AbstractStore} store The store to bind (may be null to unbind the existing store).
         * @param {Boolean} initial (Optional) true to not remove listeners
         */
        bindStore: function(store, initial){
            var me = this,
                oldStore = me.store;

            if (!initial && me.store) {
                if (store !== oldStore && oldStore.autoDestroy) {
                    oldStore.destroyStore();
                } else {
                    me.unbindStoreListeners(oldStore);
                }
                me.onUnbindStore(oldStore, initial);
            }
            if (store) {
                store = Ext.data.StoreManager.lookup(store);
                me.bindStoreListeners(store);
                me.onBindStore(store, initial);
            }
            me.store = store || null;
            return me;
        },

        /**
         * Gets the current store instance.
         * @return {Ext.data.AbstractStore} The store, null if one does not exist.
         */
        getStore: function(){
            return this.store;
        },

        /**
         * Unbinds listeners from this component to the store. By default it will remove
         * anything bound by the bindStoreListeners method, however it can be overridden
         * in a subclass to provide any more complicated handling.
         * @protected
         * @param {Ext.data.AbstractStore} store The store to unbind from
         */
        unbindStoreListeners: function(store) {
            // Can be overridden in the subclass for more complex removal
            var listeners = this.storeListeners;
            if (listeners) {
                store.un(listeners);
            }
        },

        /**
         * Binds listeners for this component to the store. By default it will add
         * anything bound by the getStoreListeners method, however it can be overridden
         * in a subclass to provide any more complicated handling.
         * @protected
         * @param {Ext.data.AbstractStore} store The store to bind to
         */
        bindStoreListeners: function(store) {
            // Can be overridden in the subclass for more complex binding
            var me = this,
                listeners = Ext.apply({}, me.getStoreListeners());

            if (!listeners.scope) {
                listeners.scope = me;
            }
            me.storeListeners = listeners;
            store.on(listeners);
        },

        /**
         * Gets the listeners to bind to a new store.
         * @protected
         * @return {Object} The listeners to be bound to the store in object literal form. The scope
         * may be omitted, it is assumed to be the current instance.
         */
        getStoreListeners: Ext.emptyFn,

        /**
         * Template method, it is called when an existing store is unbound
         * from the current instance.
         * @protected
         * @param {Ext.data.AbstractStore} store The store being unbound
         * @param {Boolean} initial True if this store is being bound as initialization of the instance.
         */
        onUnbindStore: Ext.emptyFn,

        /**
         * Template method, it is called when a new store is bound
         * to the current instance.
         * @protected
         * @param {Ext.data.AbstractStore} store The store being bound
         * @param {Boolean} initial True if this store is being bound as initialization of the instance.
         */
        onBindStore: Ext.emptyFn
    });