/**
 * This is a base class for objects that can be managed by `Ext.util.Scheduler`.
 * @private
 */
Ext.define('Ext.util.Schedulable', {
    'abstract': true,

    isSchedulable: true,

    scheduled: false,

    constructor: function() {
        this.getScheduler().add(this);
    },

    destroy: function() {
        var me = this,
            scheduler = me.getScheduler();

        if (scheduler && !scheduler.destroyed) {
            scheduler.remove(me);
        }

        me.scheduler = null;

        me.schedule = me.react = Ext.emptyFn;
        me.callParent();
    },

    getFullName: function() {
        return this.name || this.id;
    },

    privates: {
        /**
         * This method returns the `Scheduler` for this item.
         * @return {Ext.util.Scheduler}
         */
        getScheduler: function() {
            return this.scheduler;
        },

        /**
         * Schedules this item with the associated `Ext.util.Scheduler`.
         */
        schedule: function() {
            var me = this,
                scheduler;

            if (!me.scheduled) {
                scheduler = me.getScheduler();

                if (scheduler) {
                    me.scheduled = true;

                    if (me.onSchedule) {
                        me.onSchedule();
                    }

                    scheduler.scheduleItem(me);
                }
            }
        },

        /**
         * Unschedules this item with the associated `Ext.util.Scheduler`.
         */
        unschedule: function() {
            var me = this,
                scheduler;

            if (me.scheduled) {
                scheduler = me.getScheduler();

                if (scheduler && !scheduler.destroyed) {
                    scheduler.unscheduleItem(me);
                }

                me.scheduled = false;
            }
        },

        /**
         * @method sort
         * This method should be overridden by items that have dependencies to insert. The
         * standard form would be:
         *
         *      sort: function () {
         *          this.getScheduler().sortItems(this.dependencies);
         *      }
         *
         * This example assumes the item has a "dependencies" array to pass to the scheduler.
         */
        // Can't use Ext.emptyFn here to avoid setting $private: true on it
        sort: function() {}
    }
});