MODULE helps me write robust, configrable JS libraries declaratively. I incorporate any best practices for library and module creation that I find here, rather than leaving delicate, magical code in every library I write. Here's an example of how you can can use MODULE: ------------------------------- ### awesome_tools.js ### ------------------------------- /* * My Awesome Tools * by Fabulous McGee */ MODULE('awesomeTools', { // Define your module's default configuration here. // you can specify any other settings you like, and the user may override them elsewhere option1: 'blue', option2: 100, exposeLocals: false, // the attachTo property is handled specially by MODULE // if set to object, your module will be attached to that object // if set to a string, the string will be interpreted as a path // from global scope where the parent object can be found // By default, it is attached to the global object // In this example, awesome_tools will act as a jQuery plugin attachTo: 'jQuery' }, function(moduleConfig){ // This anonymous function scope provides you a local namespace that will not pollute the global one var a=1, b=2, c=3; // However, to help manage private local variables, MODULE also provides a _VARS function // Putting things here rather than declaring them with as var statments allows turnkey // debugging access to sensitive data as well as important properties that you would // like to keep hidden because they are simply unsupported by your API var _ = _VARS({ secretSauce: 'peanutButter', }); // You can now define your module's public interface // The methods of this object will have privilaged scope access to this anonymous function var myModule = { handyTool: function(){}, usefulWidget: function(){ // You can easily access your private variables using the "_." notation: return someRPC(_.secretSauce); } } // if you would like to provide access to the local variables, you can do so by augmenting the module with your _ object // in this example, such behavior has been parameterized, to allow the original importer of the module exclusive control of this feature if(moduleConfig.exposeLocals){ myModule._ = _; } // the result returned from this function will be added the value at moduleConfig.attachTo[ moduleconfig.key || 'awesomeTools' ] return result; }); ----------------------------------------- ### elsewhere/awesome_tools.config.js ### ----------------------------------------- // Your module can be configured by the user without editing your source code, simply by calling MODULE.configure() // any settings provided here will mask the ones defined in the call to MODULE() at the top of awesome_tools.js MODULE.configure('awesomeTools', { option1: 'red', option2: 26 }); ------------------------------- TODO - add tests - add support for dependencies