class ExpressionTreeRewriter {

  @SuppressWarnings("unchecked")
  public <T extends Expression> T rewrite(final T expression, final C context) {
    return (T) rewriter.process(expression, context);
  }

  public  ExpressionTreeRewriter(
      final BiFunction<Expression, Context<C>, Optional<Expression>> plugin);
    ExpressionTreeRewriter(
      final BiFunction<Expression, Context<C>, Optional<Expression>> plugin,
      final BiFunction<Expression, C, Expression> rewriter);

}