diff options
| author | Misko Hevery | 2012-01-06 18:10:47 -0800 | 
|---|---|---|
| committer | Misko Hevery | 2012-01-10 22:27:00 -0800 | 
| commit | 5143e7bf065a3cbdf8400cf095b653d51bc83b8f (patch) | |
| tree | 980149c365d4cb5586d27975d26366a25ff7be6a /src/loader.js | |
| parent | afd25446d23f24872eb20ac79c8fbd2cff203ef0 (diff) | |
| download | angular.js-5143e7bf065a3cbdf8400cf095b653d51bc83b8f.tar.bz2 | |
feat(module): new module loader
Diffstat (limited to 'src/loader.js')
| -rw-r--r-- | src/loader.js | 167 | 
1 files changed, 167 insertions, 0 deletions
| diff --git a/src/loader.js b/src/loader.js new file mode 100644 index 00000000..ec30ad9a --- /dev/null +++ b/src/loader.js @@ -0,0 +1,167 @@ +'use strict'; + +/** + * @ngdoc interface + * @name angular.Module + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + +  function ensure(obj, name, factory) { +    return obj[name] || (obj[name] = factory()); +  } + +  return ensure(ensure(window, 'angular', Object), 'module', function() { +    /** @type {Object.<string, angular.Module>} */ +    var modules = {}; + +    /** +     * @ngdoc function +     * @name angular.module +     * @description +     * +     * The `angular.module` is a global place for registering angular modules. All modules +     * (angular core or 3rd party) that should be available to an application must be registered using this mechanism. +     * +     * # Module +     * +     * A module is a collocation of services, directives, filters, and configure information. Module is used to configure the, +     * {@link angular.module.AUTO.$injector $injector}. +     * +     * <pre> +     * // Create a new module +     * var myModule = angular.module('myModule', []); +     * +     * // configure a new service +     * myModule.value('appName', 'MyCoolApp'); +     * +     * // configure existing services inside initialization blocks. +     * myModule.init(function($locationProvider) { +     *   // Configure existing providers +     *   $locationProvider.hashPrefix = '!'; +     * }); +     * </pre> +     * +     * Then you can load your module like this: +     * +     * <pre> +     * var injector = angular.injector('ng', 'MyModule') +     * </pre> +     * +     * @param {!string} name The name of the module to create or retrieve. +     * @param {Array.<string>=} requires If specified then new module is being created. If unspecified then the +     *        the module is being retrieved for further configuration. +     * @param {Function} initFn Option configuration function for the module. Same as +     *        {@link angular.Module#init Module.init()}. +     * @return {angular.Module} +     */ +    return function module(name, requires, initFn) { +      if (requires && modules.hasOwnProperty(name)) { +        modules[name] = null; +      } +      return ensure(modules, name, function() { +        if (!requires) { +          throw Error('No module: ' + name); +        } + +        function init(fn) { +          invokeQueue.push(['$injector', 'invoke', [null, fn]]); +        } + +        /** @type {!Array.<Array.<*>>} */ +        var invokeQueue = []; + +        /** @type {angular.Module} */ +        var moduleInstance = { +          /** +           * @ngdoc property +           * @name angular.Module#requires +           * @propertyOf angular.Module +           * @returns {Array.<string>} List of module names which must be loaded before this module. +           * @description +           * Holds the list of modules which the injector will load before the current module is loaded. +           */ +          requires: requires, +          invokeQueue: invokeQueue, + +          /** +           * @ngdoc method +           * @name angular.Module#service +           * @methodOf angular.Module +           * @param {string} name service name +           * @param {Function} providerType Construction function for creating new instance of the service. +           * @description +           * See {@link angular.module.AUTO.$provide#service $provide.service()}. +           */ +          service: invokeLater('$provide', 'service'), + +          /** +           * @ngdoc method +           * @name angular.Module#factory +           * @methodOf angular.Module +           * @param {string} name service name +           * @param {Function} providerFunction Function for creating new instance of the service. +           * @description +           * See {@link angular.module.AUTO.$provide#service $provide.factory()}. +           */ +          factory: invokeLater('$provide', 'factory'), + +          /** +           * @ngdoc method +           * @name angular.Module#value +           * @methodOf angular.Module +           * @param {string} name service name +           * @param {*} object Service instance object. +           * @description +           * See {@link angular.module.AUTO.$provide#value $provide.value()}. +           */ +          value: invokeLater('$provide', 'value'), + +          /** +           * @ngdoc method +           * @name angular.Module#filter +           * @methodOf angular.Module +           * @param {string} name filterr name +           * @param {Function} filterFactory Factory function for creating new instance of filter. +           * @description +           * See {@link angular.module.ng.$filterProvider#register $filterProvider.register()}. +           */ +          filter: invokeLater('$filterProvider', 'register'), + +          /** +           * @ngdoc method +           * @name angular.Module#init +           * @methodOf angular.Module +           * @param {Function} initializationFn Execute this function on module load, allowing it to do any +           *   service configuration.. +           * @description +           * Use this method to register work which needs to be performed on module loading. +           */ +          init: init +        }; + +        if (initFn) { +          init(initFn); +        } + +        return  moduleInstance; + +        /** +         * @param {string} provider +         * @param {string} method +         * @returns {angular.Module} +         */ +        function invokeLater(provider, method) { +          return function() { +            invokeQueue.push([provider, method, arguments]); +            return moduleInstance; +          } +        } +      }); +    }; +  }); + +} | 
