/**
 * This plugin defers the execution cost of the instantiation and initialization of child components of un-rendered items.
 *
 * For example, in a {@link Ext.tab.Panel#deferredRender deferredRender} {@link Ext.tab.Panel TabPanel}, the un-rendered tabs
 * do not have to incur the cost of instantiating and initializing their descendant components until render.
 *
 * This plugin allows that.
 *
 * Add the items to the plugin:
 *
 *     {
 *         xtype: 'tabpanel',
 *         items: [{
 *             title: 'Tab One',
 *             plugins: [{
 *                 ptype: 'lazyitems',
 *                 items: [... tab child items...]
 *             }]
 *         }, {
 *             title: 'Tab One',
 *             plugins: [{
 *                 ptype: 'lazyitems',
 *                 items: [... tab child items...]
 *             }]
 *         }]
 *     }
 *
 */
Ext.define('Ext.plugin.LazyItems', {
    extend: 'Ext.plugin.Abstract',
 
    alias: 'plugin.lazyitems',
 
    init: function(comp) {
        this.callParent(arguments);
 
        if (this.items) {
            // Eager instantiation means create the child items now 
            if (this.eagerInstantiation) {
                this.items = comp.prepareItems(this.items);
            }
        }
 
        // We need to jump in right before the beforeRender call 
        comp.beforeRender = Ext.Function.createInterceptor(comp.beforeRender, this.beforeComponentRender, this);
    },
 
    // Add the child items at the last possible moment. 
    beforeComponentRender: function() {
        this.cmp.add(this.items);
 
        // Remove the interceptor 
        this.cmp.beforeComponentRender = null;
    }
});