aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIgor Minar2011-12-02 19:38:39 -0500
committerIgor Minar2011-12-07 09:41:08 -0800
commit4e3c05b99e32dad4084637299b3a696f9579957f (patch)
tree46bab2c4b3af41090d9c747c6b78a814e06928a3 /src
parent5e4d59adf0ba4eb7f993f66b868759c24ae94f4c (diff)
downloadangular.js-4e3c05b99e32dad4084637299b3a696f9579957f.tar.bz2
feat(injector): add $provide.decorator
Diffstat (limited to 'src')
-rw-r--r--src/Injector.js15
1 files changed, 14 insertions, 1 deletions
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');