/**
  * Dispatches the specified request.
  * The optional $services parameter is passed to the constructor of handlers
  * specified in the Object::Method format.
  * @param Request          $request
  * @param ServiceContainer $services
  * @return Response
  */
 public function dispatch(Request $request, ServiceContainer $services = null)
 {
     $route = $this->router->match($request->uri(), $request->method());
     // if we have a URI prefix specified in the route then add it to the stack
     if ($prefix = isset($route['extra']['prefix'])) {
         // we can keep adding to URI prefix to allow more than one layer of delegation
         $request->pushUriPrefix($route['extra']['prefix']);
     }
     // pass through extra info about the route
     $request->extra($route['extra']);
     // make sure we have a callable handler
     $handler = $this->makeHandler($route['handler'], $services);
     // prepend the request to the parameter array
     array_unshift($route['parameters'], $request);
     $response = $this->beforeDispatch($request, $route);
     // execute the handler if we don't already have a response
     if (!$response) {
         $response = call_user_func_array($handler, $route['parameters']);
     }
     $this->afterDispatch($request, $route, $response);
     // remove the URI prefix from earlier as that application has dealt with request
     // and 'this' layer may well need to do further processing
     if ($prefix) {
         $request->popUriPrefix();
     }
     return $response;
 }