index.html

<?xml version="1.0" encoding="UTF-8" ?>

<!doctype html>

<html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <title>Testing YUI 3.4</title>

    </head>

    <body>

        <div class="window">

             <h1>TESTING YUI 3.4</h1>

            <h2>Loader</h2>

        </div>

        <script src="yui/3.4.0/yui/yui-min.js"></script>

        <script>

            var ESP = {

                config : {

                    base: "yui/3.4.0/",

                    modules: {

                        BaseApp : {

                            fullpath: "base_app.js",

                            requires: ["base"]

                        },

                        WidgetOne : {

                            fullpath: "widget_one.js",

                            requires: ["widget"]

                        },

                        WidgetTwo : {

                            fullpath: "widget_two.js",

                            requires: ["widget"]

                        }

                    }

                }

            };

            YUI(ESP.config).use("BaseApp", function(Y, result){

                var app = new Y.BaseApp();

            });

        </script>

    </body>

</html>

base_app.js

YUI.add('BaseApp', function(Y) {

    function MyClass(config) {

        MyClass.superclass.constructor.apply(this, arguments);

    }

    Y.extend(MyClass, Y.Base, {

        initializer : function(){

            console.info("initializer: BaseApp");

            var me = this;

            setTimeout(function(){

                me.loadModule("PluginOne");

            }, 0);

            setTimeout(function(){

                me.loadModule("PluginTwo");

            }, 200);

        },

        loadModule : function(moduleName){

            var me = this;

            var url = moduleName + ".js";

            Y.Get.script(url, {

                onSuccess: function(o){

                    YUI(ESP.config).use("pluginModule", function(Y2){

                        me.plug(Y2.ESP.PluginModule);

                    });

                }

            });

        }

    })

    Y.BaseApp = MyClass;

}, '3.4.0' /* module version */, {

    requires: ['base']

});

// I would like to change the way I load the class but all the attempts I have made failed.

// I tried to use the YUI(myConfig, specificClassLoaderConfig).use(‘myModule’, function(){...})

// but the dependencies in the loaded class (the requires) is not loading anything.

PluginOne.js

console.info("Loaded: pluginModule - PluginOne");

YUI.add('pluginModule', function(Y) {

    function MyClass(config) {

        // Invoke Base constructor, passing through arguments

        MyClass.superclass.constructor.apply(this, arguments);

    }

    Y.extend(MyClass, Y.Plugin.Base, {

        initializer : function(){

            console.info("initializer: pluginModule - PluginOne");

            var me = this;

            setTimeout(function(){

                me.render();

            }, 0);

        },

        render : function(moduleName){

            console.info("render: WidgetOne");

            var widgetOne = new Y.WidgetOne();

        }

    })

    Y.ESP = {

        PluginModule : MyClass

    }

}, '3.4.0' /* module version */, {

    requires: ['plugin','node-base','WidgetOne']

});

PluginTwo.js

console.info("Loaded: pluginModule - PluginTwo");

YUI.add('pluginModule', function(Y) {

    function MyClass(config) {

        // Invoke Base constructor, passing through arguments

        MyClass.superclass.constructor.apply(this, arguments);

    }

    Y.extend(MyClass, Y.Plugin.Base, {

        initializer : function(){

            console.info("initializer: pluginModule - PluginTwo");

            var me = this;

            setTimeout(function(){

                me.render();

            }, 0);

        },

        render : function(moduleName){

            console.info("render: PluginTwo");

            var widgetTwo = new Y.WidgetTwo();

        }

    })

    Y.ESP = {

        PluginModule : MyClass

    }

}, '0.1.1' /* module version */, {

    requires: ['plugin','node-base','WidgetTwo']

});

widget_one.js

console.info("Loaded: WidgetOne");

YUI.add('WidgetOne', function(Y) {

    function MyClass(config) {

        MyClass.superclass.constructor.apply(this, arguments);

    }

    Y.extend(MyClass, Y.Widget, {

        initializer : function(){

            console.info("initializer: WidgetOne");

        }

    })

    Y.WidgetOne = MyClass;

}, '0.1.1' /* module version */, {

    requires: ['base']

});

widget_two.js

console.info("Loaded: WidgetTwo");

YUI.add('WidgetTwo', function(Y) {

    function MyClass(config) {

        MyClass.superclass.constructor.apply(this, arguments);

    }

    Y.extend(MyClass, Y.Widget, {

        initializer : function(){

            console.info("WidgetTwo - initializer")

        }

    })

    Y.WidgetTwo = MyClass;

}, '0.1.1' /* module version */, {

    requires: ['base']

});