docs: function parseMethodArgs(methodArgs) {
  
      var firstArg = methodArgs.shift(),
          source;
  
      if (isString(firstArg)) {
          if (methodArgs.length !== 1) {
              errorManager.illegalArgument(firstArg, 'Requires a single property value');
          }
          source = {};
          source[firstArg] = methodArgs.shift();
  
      } else if (isObject(firstArg)) {
          source = firstArg;
  
      } else {
          errorManager.illegalArgument(firstArg, 'No source object found.');
      }
  
      var overrideKeys = {}, // src keys which can override without error
          sourceKeys = {}, // src keys to pass to filters
          filters = []; // filters to process properties.
  
      // Iterate through the arguments separating them into selected
      // properties and filters.
      while (methodArgs.length) {
          var arg = methodArgs.shift();
  
          if (isString(arg)) {
              // Is a string selector
              if (!selectorsManager.executeSelector(source, arg, null,
                      sourceKeys, overrideKeys)) {
                  sourceKeys[arg] = arg;
              }
  
          } else if (isRegex(arg)) {
              // Is a regular expression selector.
              extendSourceKeys(sourceKeys, source, arg);
  
          } else if (isArray(arg)) {
              // decompose array into separate arguments
              for (var j = 0; j < arg.length; j++) {
                  methodArgs.push(arg[j]);
              }
  
          } else if (isFunction(arg)) {
              // Is a filter.
              filters.push(arg);
  
          } else if (isObject(arg)) {
              // Is a selector with rename.
              for (var sourceKey in arg) {
                  var targetKey = arg[sourceKey];
                  if (!selectorsManager.executeSelector(source, sourceKey,
                          targetKey, sourceKeys, overrideKeys)) {
                      sourceKeys[sourceKey] = targetKey;
                  }
                  if (!isString(sourceKeys[sourceKey])) {
                      errorManager.illegalArgument(targetKey,
                          'Target property name is not a string.');
                  }
              }
          }
      }
  
      // If no properties specified, default to all properties in source.
      if (isEmpty(sourceKeys)) {
          extendSourceKeys(sourceKeys, source);
      }
  
      return {
          source: source,
          filters: filters,
          sourceKeys: sourceKeys,
          overrideKeys: overrideKeys
      };
  }