class DecoratingRequester implements Requester {

  @Override
  public <T> T request(final Invocation<T> invocation) throws Exception {
    assertNotNull(invocation, "Invocation must not null");
    logger.debug("Request with invocation: {}", invocation);

    Response<T> response;
    final Invocation<T> decorated = withDecorated(invocation);
    logger.trace("Decorated: {}", decorated);
    try {
      final T value = decorated.invoke();
      logger.debug("Success: {}", value);
      response = Response.success(value);
    } catch (Exception e) {
      logger.debug("Failure: {}", e.toString());
      response = Response.fail(e);
      response = handleFailover(decorated, response);
    }

    if (null != response.getError()) {
      // need to adjust stacktrace (current stack + origin stack)
      final Exception error = response.getError();
      error.setStackTrace(concatStackTrace(new Throwable().getStackTrace(),
          error.getStackTrace()));
      throw error;
    }

    return response.getValue();
  }

    DecoratingRequester();

}