public function dispatch(HttpRequest $request, HttpResponse $response)
    {
        if (false === $this->booted) {
            $this->boot();
        }


        // cache like a mother fucker
//        if(!$this->hasRouteInCache($request)) {
            $routeParams = $this->handleRouting($request);
//            $this->setRouteInCache($request, $routeParams);
            // @todo - move these 2 lines to setRouteInCache()
//            $routingCache = $this->serviceManager->get('RoutingCache');
//            $routingCache->set($request->getPathInfo(), $routeParams);
//        } else {
//            $routeParams = $this->getRouteFromCache($request);
//        }

        $request->attributes->add($routeParams);

        // Resolve our Controller
        $resolver = $this->serviceManager->get('ControllerResolver');
        if (false === $controller = $resolver->getController($request)) {
            throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s".', $request->getPathInfo()));
        }

        $controllerArguments = $resolver->getArguments($request, $controller);

        $result = call_user_func_array(
            $controller,
            $controllerArguments
        );

        if ($result === null) {
            throw new \Exception('Your action returned null. It must always return something');
        } elseif (is_string($result)) {
            $response->setContent($result);
        } elseif ($result instanceof SymfonyResponse || $response instanceof HttpResponse) {
            $response = $result;
        } else {
            throw new \Exception('Invalid response type returned from controller');
        }

        return $response;
    }