@Override
  public Response handle(Request request) {
    ResponseDefinition responseDefinition = handleRequest(request);
    responseDefinition.setOriginalRequest(request);

    Response response = responseRenderer.render(responseDefinition);
    for (RequestListener listener : listeners) {
      listener.requestReceived(request, response);
    }

    if (responseDefinition.getCallbackRequest() != null) {
      CallbackRequestDispatcher.dispatch(responseDefinition.getCallbackRequest(), request);
    }

    return response;
  }