    /**
     * This is the base class for {@link Ext.ux.event.Recorder} and {@link Ext.ux.event.Player}.
     */
    Ext.define('Ext.ux.event.Driver', {
        active: null,
        mixins: {
            observable: 'Ext.util.Observable'
        },

        constructor: function (config) {
            var me = this;

            me.mixins.observable.constructor.apply(this, arguments);

            me.addEvents(
                /**
                 * @event start
                 * Fires when this object is started.
                 * @param {Ext.ux.event.Driver} this
                 */
                'start',

                /**
                 * @event stop
                 * Fires when this object is stopped.
                 * @param {Ext.ux.event.Driver} this
                 */
                'stop'
            );
        },

        getTime: function () {
            return new Date().getTime();
        },

        /**
         * Returns the number of milliseconds since start was called.
         */
        getTimestamp: function () {
            var d = this.getTime();
            return d - this.startTime;
        },

        onStart: function () {},

        onStop: function () {},

        /**
         * Starts this object. If this object is already started, nothing happens.
         */
        start: function () {
            var me = this;

            if (!me.active) {
                me.active = new Date();
                me.startTime = me.getTime();
                me.onStart();
                me.fireEvent('start', me);
            }
        },

        /**
         * Stops this object. If this object is not started, nothing happens.
         */
        stop: function () {
            var me = this;

            if (me.active) {
                me.active = null;
                me.onStop();
                me.fireEvent('stop', me);
            }
        }
    });