code: function () {
          return function () {
            var args = Array.prototype.slice.call(arguments, 0);
            var sig = (function () {
              var ret = [];
              for (var i = 0, len = args.length; i < len; i++) {
                ret.push(toType(args[i]));
              }
              return ret;
            })().join('::');
  
            if (map[sig]) {
              if (map[sig].inject) args.unshift(input);
              return map[sig].fn.apply(ctx || null, args);
            }
  
            return input && input.apply(ctx || null, args);
          }
        }
docs: return the composed new function