edinella/beat

View on GitHub
lib/Provide.js

Summary

Maintainability
A
0 mins
Test Coverage
var Provide = module.exports = function Provide(injector) {
  this.injector = injector;
};

Provide.prototype.provider = function provider(name, prov) {
  if(typeof prov === 'function' || prov instanceof Array) {
    prov = this.injector.instantiate(prov);
  }
  if(!prov.$get) {
    throw new Error('Provider "'+name+'" must define $get factory method');
  }
  return this.injector.cache[name + 'Provider'] = prov;
};

Provide.prototype.value = function value(name, val) {
  return this.factory(name, function() {
    return val;
  });
};

Provide.prototype.factory = function factory(name, fn) {
  return this.provider(name, {$get: fn});
};

Provide.prototype.service = function service(name, constructor) {
  return this.factory(name, function($injector) {
    return $injector.instantiate(constructor);
  });
};

Provide.prototype.decorator = function decorator(serviceName, decorFn) {
  var origProvider = this.injector.get(serviceName + 'Provider');
  var orig$get = origProvider.$get;
  var self = this;
  origProvider.$get = function() {
    var origInstance = self.injector.invoke(orig$get, origProvider);
    return self.injector.invoke(decorFn, null, {$delegate: origInstance});
  };
};