code: public final synchronized <RESULT, OPERATION extends Operation<RESULT>> RESULT eval(final OPERATION operation,
          Hint... hints) {
          final Frame<RESULT> frame = new Frame<>(Phase.EVALUATION, operation, hints);
          try {
              handle(frame);
          } catch (Frame.RecursionException e) {
              if (e.duplicate.operation.isSuccessful()) {
                  @SuppressWarnings("unchecked")
                  final RESULT result = (RESULT) e.duplicate.operation.getResult();
                  operation.setSuccessful(true);
                  operation.setResult(result);
                  return result;
              }
              throw new OperationException(frame.operation, "recursive operation detected");
          }
          return operation.getResult();
      }
docs: Performs the specified {@link Operation} by invoking any compatible {@link Operator} until the {@link Operation}
  is marked as having been successful, then returns the result from {@link Operation#getResult()}. Note that
  <em>most</em> unsuccessful {@link Operation}s will, at this point, throw an {@link OperationException}.
  
  @param RESULT
  @param OPERATION
  @param operation
  @param hints added as context objects which are accessible to any {@link Operator}s that are aware of them;
  should be unique by {@link Hint#getType()}
  @return RESULT
  @throws NullPointerException on {@code null} input
  @throws OperationException potentially, via {@link Operation#getResult()}
  @see #eval(Operation)