public Object evaluate(ExpressionEvaluator ee, Expression e) { if (checkOperator(e)) { final int minCount = 1; final int maxCount = -1; if (checkOperandCount(e, minCount, maxCount)) { Object o0 = ee.evaluate(e.getOperand(0)); if (o0 instanceof EvaluatorFunction) { EvaluatorFunction f = (EvaluatorFunction) o0; Object o1 = e.getOperand(1); if (o1 instanceof Expression) { Expression eArguments = (Expression) o1; if (eArguments.getOperator() == Operator.GROUP) { List<Object> arguments = new java.util.ArrayList<Object>(); for (Object operand : eArguments.getOperands()) { arguments.add(ee.evaluate(operand)); } return f.apply(ee.getState(), arguments); } else throw new IllegalStateException(); } else throw new IllegalStateException(); } else throw new IncompatibleOperandException(e, o0, EvaluatorFunction.class); } else throw new BadOperandCountException(e, minCount, maxCount); } else throw new BadOperatorException(e, "apply"); }