* @ngdoc method * @name $provide#decorator * @description * * Register a **service decorator** with the auto.$injector $injector. A service decorator * intercepts the creation of a service, allowing it to override or modify the behaviour of the * service. The object returned by the dec
(modulesToLoad, strictDi)
| 4008 | |
| 4009 | |
| 4010 | function createInjector(modulesToLoad, strictDi) { |
| 4011 | strictDi = (strictDi === true); |
| 4012 | var INSTANTIATING = {}, |
| 4013 | providerSuffix = 'Provider', |
| 4014 | path = [], |
| 4015 | loadedModules = new HashMap([], true), |
| 4016 | providerCache = { |
| 4017 | $provide: { |
| 4018 | provider: supportObject(provider), |
| 4019 | factory: supportObject(factory), |
| 4020 | service: supportObject(service), |
| 4021 | value: supportObject(value), |
| 4022 | constant: supportObject(constant), |
| 4023 | decorator: decorator |
| 4024 | } |
| 4025 | }, |
| 4026 | providerInjector = (providerCache.$injector = |
| 4027 | createInternalInjector(providerCache, function(serviceName, caller) { |
| 4028 | if (angular.isString(caller)) { |
| 4029 | path.push(caller); |
| 4030 | } |
| 4031 | throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); |
| 4032 | })), |
| 4033 | instanceCache = {}, |
| 4034 | instanceInjector = (instanceCache.$injector = |
| 4035 | createInternalInjector(instanceCache, function(serviceName, caller) { |
| 4036 | var provider = providerInjector.get(serviceName + providerSuffix, caller); |
| 4037 | return instanceInjector.invoke(provider.$get, provider, undefined, serviceName); |
| 4038 | })); |
| 4039 | |
| 4040 | |
| 4041 | forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); |
| 4042 | |
| 4043 | return instanceInjector; |
| 4044 | |
| 4045 | //////////////////////////////////// |
| 4046 | // $provider |
| 4047 | //////////////////////////////////// |
| 4048 | |
| 4049 | function supportObject(delegate) { |
| 4050 | return function(key, value) { |
| 4051 | if (isObject(key)) { |
| 4052 | forEach(key, reverseParams(delegate)); |
| 4053 | } else { |
| 4054 | return delegate(key, value); |
| 4055 | } |
| 4056 | }; |
| 4057 | } |
| 4058 | |
| 4059 | function provider(name, provider_) { |
| 4060 | assertNotHasOwnProperty(name, 'service'); |
| 4061 | if (isFunction(provider_) || isArray(provider_)) { |
| 4062 | provider_ = providerInjector.instantiate(provider_); |
| 4063 | } |
| 4064 | if (!provider_.$get) { |
| 4065 | throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); |
| 4066 | } |
| 4067 | return providerCache[name + providerSuffix] = provider_; |
no test coverage detected