all files / lib/resolver/ factoryMethod.js

100% Statements 15/15
100% Branches 2/2
100% Functions 3/3
100% Lines 15/15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36                                         
"use strict";
var assert = require('../util').assert;
var ResolutionError = require('../ResolutionError');
 
/**
 * Creates a new component instance by calling a factory method on the resolved instance or
 * the component itself.
 *
 * @function
 * @exports Resolver:factoryMethod
 */
module.exports = function factoryMethod(ctx, res, next) {
  var instance = res.instance() || ctx.component();
 
  var targetMethod = this.arg(0, "FactoryMethod resolver: must supply target method name");
  var m = instance[targetMethod];
  assert.type(m,
    'function',
    "FactoryMethod resolver: Method not found: " + targetMethod,
    ResolutionError);
 
  var deps = this.args();
  deps.shift(); // Remove targetField
 
  ctx.resolve(deps)
    .then(function(resolvedDeps) {
      var r = m.apply(instance, resolvedDeps.list);
      res.resolve(r);
      next();
    })
    .catch(function(err) {
      res.fail(err);
      next();
    });
};