/**
 * A Queue is a queue of {@link Ext.app.route.Route} instances managed by the
 * {@link Ext.app.route.Router} singleton if queueActions is set to `true`.
 * 
 * A developer shouldn't need to use this class as {@link Ext.app.route.Router} should
 * manage this class. When a {@link Ext.app.route.Route} is executed,it will automatically
 * keep running the queue until the queue is empty.
 * @private
 */
Ext.define('Ext.app.route.Queue', {
    /**
     * The {@link Ext.util.MixedCollection} that will hold the queued
     * {@link Ext.app.route.Route} and recognized arguments.
     *
     * @private
     */
    queue: null,
 
    /**
     * The token from the {@link Ext.app.route.Router} that is being enacted on.
     */
    token: null,
 
    constructor : function(config) {
        Ext.apply(this, config);
 
        //Create the queue MixedCollection
        this.queue = new Ext.util.MixedCollection();
    },
 
    /**
     * Add a {@link Ext.app.route.Route} to the queue.
     *
     * @param {Ext.app.route.Route} route The route to add to the queue.
     * @param {Object} args The arguments recognized by the {Ext.app.route.Route}.
     */
    queueAction : function (route, args) {
        this.queue.add({
            route : route,
            args  : args
        });
    },
 
    /**
     * Clear all queued actions.
     */
    clearQueue : function() {
        this.queue.removeAll();
    },
 
    /**
     * Run the queue one by one.
     */
    runQueue : function() {
        var queue  = this.queue,
            action = queue.removeAt(0),
            route;
 
        if (action) {
            route = action && action.route;
 
            route.execute(this.token, action.args, this.onActionExecute, this);
        }
    },
 
    /**
     * Handle the execution of a queued action and optionally clear all queued actions.
     *
     * @param {Boolean} clearQueue If `true` was returned, will clear all queued actions.
     */
    onActionExecute : function(clearQueue) {
        if (clearQueue) {
            //clear all queued actions
            this.clearQueue();
        } else {
            //continue with queue execution
            this.runQueue();
        }
    }
});