/** Compiles ParameterExpressions */
  @Override
  public void visit(ParameterExpression param) {
    if (param == null) {
      throw new ArgumentException(PARAMETER + E_IS_NULL);
    }
    if (parameters.containsKey(param.getName())) {
      /** If the parameter itself is and expression */
      if (parameters.get(param.getName()) instanceof ExpressionCompiler) {
        // The parameter is itself another Expression
        ExpressionCompiler expr = (ExpressionCompiler) parameters.get(param.getName());
        expr.setParameters(parameters);
        expr.setMethodResolver(getMethodResolver());
        expr.setParameterizedResolver(getParameterizedResolver());
        // TODO: Need a way to pass in the compile type here, maybe from
        // global scope of API call for compile...
        result.setResult(
            (LogicalExpression) ((ExpressionCompiler) parameters.get(param.getName())).compile());
      } else {
        result.setResult((LogicalExpression) parameters.get(param.getName()));
      }
    } else {

      ParameterizedArgs args = new ParameterizedArgs(result, param.getName());

      resolveParameterizedReference(args);

      if (args.getResult() == null)
        throw new CompilationException(
            String.format(E_PARAMETER_S_WAS_NOT_DEFINED, param.getName()));

      result.setResult((LogicalExpression) args.getResult());
    }
  }