    /**
     * @class Ext.direct.Provider
     * @extends Ext.util.Observable
     * Ext.direct.Provider is an abstract class meant to be extended.
     *
     * For example ExtJs implements the following subclasses:
     *
    Provider
    |
    +---{@link Ext.direct.JsonProvider JsonProvider}
        |
        +---{@link Ext.direct.PollingProvider PollingProvider}
        |
        +---{@link Ext.direct.RemotingProvider RemotingProvider}
     *
     * @abstract
     */
    Ext.direct.Provider = Ext.extend(Ext.util.Observable, {
        /**
         * @cfg {String} id
         * The unique id of the provider (defaults to an {@link Ext#id auto-assigned id}).
         * You should assign an id if you need to be able to access the provider later and you do
         * not have an object reference available, for example:
         *
    Ext.Direct.addProvider(
        {
            type: 'polling',
            url:  'php/poll.php',
            id:   'poll-provider'
        }
    );

    var p = {@link Ext.Direct Ext.Direct}.{@link Ext.Direct#getProvider getProvider}('poll-provider');
    p.disconnect();
         *
         */

        /**
         * @cfg {Number} priority
         * Priority of the request. Lower is higher priority, 0 means "duplex" (always on).
         * All Providers default to 1 except for PollingProvider which defaults to 3.
         */
        priority: 1,

        /**
         * @cfg {String} type
         * Required, undefined by default.  The type of provider specified
         * to {@link Ext.Direct Ext.Direct}.{@link Ext.Direct#addProvider addProvider} to create a
         * new Provider. Acceptable values by default are:
         * polling : {@link Ext.direct.PollingProvider PollingProvider}
         * remoting : {@link Ext.direct.RemotingProvider RemotingProvider}
         *
         */

        // private
        constructor : function(config){
            Ext.apply(this, config);
            this.addEvents(
                /**
                 * @event connect
                 * Fires when the Provider connects to the server-side
                 * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}.
                 */
                'connect',
                /**
                 * @event disconnect
                 * Fires when the Provider disconnects from the server-side
                 * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}.
                 */
                'disconnect',
                /**
                 * @event data
                 * Fires when the Provider receives data from the server-side
                 * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}.
                 * @param {event} e The {@link Ext.Direct#eventTypes Ext.Direct.Event type} that occurred.
                 */
                'data',
                /**
                 * @event exception
                 * Fires when the Provider receives an exception from the server-side
                 */
                'exception'
            );
            Ext.direct.Provider.superclass.constructor.call(this, config);
        },

        /**
         * Returns whether or not the server-side is currently connected.
         * Abstract method for subclasses to implement.
         */
        isConnected: function(){
            return false;
        },

        /**
         * Abstract methods for subclasses to implement.
         */
        connect: Ext.emptyFn,

        /**
         * Abstract methods for subclasses to implement.
         */
        disconnect: Ext.emptyFn
    });