From 4e3c05b99e32dad4084637299b3a696f9579957f Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Fri, 2 Dec 2011 19:38:39 -0500 Subject: feat(injector): add $provide.decorator --- src/Injector.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Injector.js b/src/Injector.js index 8df47306..517e3e00 100644 --- a/src/Injector.js +++ b/src/Injector.js @@ -251,7 +251,8 @@ function createInjector(modulesToLoad, moduleRegistry) { value('$provide', { service: service, factory: factory, - value: value + value: value, + decorator: decorator }); loadModule(modulesToLoad); @@ -274,6 +275,18 @@ function createInjector(modulesToLoad, moduleRegistry) { function value(name, value) { factory(name, valueFn(value)); } + function decorator(name, decorFn) { + var origProvider = cache['#' + name + providerSuffix]; + if (!origProvider) throw Error("Can't find provider for: " + name); + if (cache['#' + name]) throw Error("Service " + name + " already instantiated, can't decorate!"); + var orig$get = origProvider.$get; + origProvider.$get = function() { + var origInstance = $injector.invoke(origProvider, orig$get); + return $injector.invoke(null, decorFn, {$delegate: origInstance}); + }; + } + + function getService(value) { if (typeof value !== 'string') { throw Error('Service name expected'); -- cgit v1.2.3