docs: function (args, cb) {
          args = comb.argsToArray(arguments);
          cb = comb.isFunction(args[args.length - 1]) ? args.pop() : null;
          var ret = new Promise();
          if (cb) {
              var stack = [];
              var newArgs = args.map(function (a) {
                  return [a, getHandler(a, stack)];
              });
              var cbRet = cb.apply(null, newArgs.map(function (h) {
                  return h[1];
              }));
              executeStack(stack, newArgs).chain(function (results, pMap) {
                  if (comb.isUndefined(cbRet)) {
                      ret.callback(results);
                  } else {
                      var cbResults;
                      if (comb.isArray(cbRet)) {
                          cbResults = cbRet.map(function (arg) {
                              return getValueFromArrayMap(arg, pMap, newArgs);
                          }).filter(function (r) {
                              return !comb.isUndefined(r);
                          });
                      } else if (comb.isHash(cbRet)) {
                          cbResults = {};
                          for (var i in cbRet) {
                              cbResults[i] = getValueFromArrayMap(cbRet[i], pMap, newArgs);
                          }
                      } else if (comb.isProxy(cbRet)) {
                          cbResults = getValueFromArrayMap(cbRet, pMap, newArgs);
                      } else {
                          cbResults = cbRet;
                      }
                      ret.callback(cbResults);
                  }
              }, hitch(ret, "errback"));
  
          } else {
              ret.callback();
          }
          return ret;
      }