docs: function variableReplacementBuilder(v) {
          var pattern,
              name = v.name,
              from = v.from,
              to = v.to;
  
          if (util.isUndefined(to)) {
              grunt.log.error().error('"to" must be defined in a variable replacement instruction');
              return false;
          }
  
          if (util.isUndefined(name) && util.isUndefined(from)) {
              grunt.log.error().error('one of "name" or "from" must be defined in a variable replacement instruction');
              return false;
          }
  
          if (!util.isUndefined(name) && !util.isString(name) && !util.isRegex(name)) {
              grunt.log.error().error('"name" must be a string or a regex in a variable replacement instruction');
              return false;
          }
  
          if (!util.isUndefined(from) && !util.isString(from) && !util.isNumber(from) && !util.isBoolean(from)) {
              grunt.log.error().error('"from" must be a string, a number or a boolean in a variable replacement instruction');
              return false;
          }
  
          if (!util.isString(to) && !util.isNumber(to) && !util.isBoolean(to)) {
              grunt.log.error().error('"to" must be a string, a number or a boolean in a variable replacement instruction');
              return false;
          }
  
          pattern = buildVariableReplacementPattern(name, from, to);
  
          return {
              pattern: pattern,
              replacement: function (match, p1, p2, p3) {
                  grunt.log
                      .debug('matching variable replacement'.bold)
                      .debug(('match=' + match).cyan)
                      .debug(('captured groups=' + grunt.log.wordlist([p1, p2, p3])).cyan);
  
                  return p1 + to + p3;
              }
          };
      }