docs: function (op) {
              if (op) {
                  var args = argsToArray(arguments, 1);
                  //make a copy of the args
                  var origArgs = args.slice(0);
                  args.forEach(function (a, i) {
                      if (Expression.isConditionSpecifier(a)) {
                          args[i] = BooleanExpression.fromValuePairs(a);
                      }
                  });
                  op = op.toUpperCase();
  
                  if (N_ARITY_OPERATORS.hasOwnProperty(op)) {
                      if (args.length < 1) {
                          throw new ExpressionError("The " + op + " operator requires at least 1 argument");
                      }
                      var oldArgs = args.slice(0);
                      args = [];
                      oldArgs.forEach(function (a) {
                          a instanceof ComplexExpression && a.op === op ? args = args.concat(a.args) : args.push(a);
                      });
  
                  } else if (TWO_ARITY_OPERATORS.hasOwnProperty(op)) {
                      if (args.length !== 2) {
                          throw new ExpressionError("The " + op + " operator requires precisely 2 arguments");
                      }
                      //With IN/NOT IN, even if the second argument is an array of two element arrays,
                      //don't convert it into a boolean expression, since it's definitely being used
                      //as a value list.
                      if (IN_OPERATORS[op]) {
                          args[1] = origArgs[1];
                      }
                  } else if (ONE_ARITY_OPERATORS.hasOwnProperty(op)) {
                      if (args.length !== 1) {
                          throw new ExpressionError("The " + op + " operator requires only one argument");
                      }
                  } else {
                      throw new ExpressionError("Invalid operator " + op);
                  }
                  this.op = op;
                  this.args = args;
              }
          }