docs: function create(module, timeout, dependencyStack) {
        dependencyStack = dependencyStack.slice(0);
        if (module.name != null) dependencyStack.push(module.name);
  
        /* Already in cache? Why even bother? */
        if (cache[module.name]) return cache[module.name];
  
        /* Create an expiring Deferred, shortening the timeout */
        if (timeout < 50) timeout = 50;
        var deferred = new Deferred(timeout, "Timeout waiting for module '" + module.name + "'");
  
        /* ... and *IMMEDIATELY* cache the promise */
        if (module.name && (! module.$$dynamic)) {
          cache[module.name] = deferred.promise;
        }
  
        /* Calculate the module's direct dependencies */
        resolveDependencies(module).then(function(dependencies) {
          var parameters = [];
  
          /* Prepare parameters, either from cache or new creations */
          for (var i in dependencies) {
            var dependency = dependencies[i];
  
            /* Check for circular dependencies */
            var circularIndex = dependencyStack.indexOf(dependency.name);
            if (circularIndex >= 0) {
              var circularDependencies = dependencyStack.slice(circularIndex);
              throw new CircularDependencyError(circularDependencies);
            }
  
            if (cache[dependency.name]) {
              parameters.push(cache[dependency.name]);
            } else {
              parameters.push(create(dependency, timeout - 5, dependencyStack));
            }
          }
  
          /* When all parameters have been resolved... */
          return Promise.all(parameters).then(function(parameters) {
            return module.constructor.apply(module, parameters);
          });
        })
  
        /* Cache and resolve, or reject */
        .then(function(created) {
          if (module.name && (! module.$$dynamic)) cache[module.name] = created;
          deferred.resolve(created);
        }, function(failure) {
          deferred.reject(new InjectionError(module.name, failure));
        });
  
        /* Return the deferred promise */
        return deferred.promise;
  
      }