// START WRAPPER: The YUI.add wrapper is added by the build system, when you
// use shifter to build your component from the raw source in this file
// YUI.add('myextension', function(Y) {

    /* Any frequently used shortcuts, strings and constants */
    var Lang = Y.Lang;

    /*
     * MyExtension initialization.
     *
     * Although this is a function constructor,
     * since the extension gets mixed into another class, it's 
     * invoked during the host classes initialization phase. 
     */
    function MyExtension(config) {
    
        /* 
         * HOST METHOD OVERLAP - Use the AOP infrastructure
         * to inject logic before/after methods on the main 
         * class.
         *
         * If the extension implements a method which 
         * exists on the main class, it will be replaced with 
         * the extensions version. 
         */

        Y.Do.after(this._doSomethingAfterMainClassMethod, this, "doSomething");
        Y.Do.before(this._doSomethingBeforeMainClassMethod, this, "doSomething");
    }

    /*
     * The attributes this extension provides
     */
    MyExtension.ATTRS = {

        attrA : {
            value: "A"                     // The default value for attrA, used if the user does not set a value during construction.

            /*
            , valueFn: "_defAttrAVal"      // Can be used as a substitute for "value", when you need access to "this" to set the default value.
             
            , setter: "_setAttrA"          // Used to normalize attrA's value while during set. Refers to a prototype method, to make customization easier
            , getter: "_getAttrA"          // Used to normalize attrA's value while during get. Refers to a prototype method, to make customization easier
            , validator: "_validateAttrA"  // Used to validate attrA's value before updating it. Refers to a prototype method, to make customization easier

            , readOnly: true               // Cannot be set by the end user. Can be set by the component developer at any time, using _set
            , writeOnce: true              // Can only be set once by the end user (usually during construction). Can be set by the component developer at any time, using _set
            
            , lazyAdd: false               // Add (configure) the attribute during initialization. 
            
                                           // You only need to set lazyAdd to false if your attribute is
                                           // setting some other state in your setter which needs to be set during initialization 
                                           // (not generally recommended - the setter should be used for normalization. 
                                           // You should use listeners to update alternate state). 

            , broadcast: 1                 // Whether the attribute change event should be broadcast or not.
            */
        }
        
        // ... attrB, attrC, attrD ... attribute configurations.
    };

    MyExtension.prototype = {
        myExtensionPublicMethod : function() {
            // A new public method that the extension adds to the built class.

            // When naming, you need to be aware of over-writing methods on the main class, since these
            // methods get augmented onto the built class
        },

        _myExtensionProtectedMethod : function() {
            // A new protected/private method the extension provides
            
            // When naming, you need to be aware of over-writing methods on the main class, since these
            // methods get augmented onto the built class
        },

        _doSomethingAfterMainClassMethod : function() {
            // Custom behavior
        },
        
        _doSomethingBeforeMainClassMethod : function() {
            // Custom behavior
        }
    };

    Y.namespace("MyApp").MyExtension = MyExtension;

// }, "3.1.0");
// END WRAPPER
