public function dispatch($controller, $action = null, array $params = array(), $throwException = true)
    {
        $notFound = array();
        $action || $action = $this->defaultAction;
        $classes = $this->getControllerClasses($controller);

        foreach ($classes as $class) {
            if (!class_exists($class)) {
                $notFound['controllers'][$controller][] = $class;
                continue;
            }
            if (!$this->isActionAvailable($class, $action)) {
                $notFound['actions'][$action][$controller][] = $class;
                continue;
            }

            // Find out existing controller and action
            $this->setController($controller);
            $this->setAction($action);
            $this->request->set($params);
            try {
                $instance = $this->getControllerInstance($class);

                return $this->execute($instance, $action);
            } catch (\RuntimeException $e) {
                if ($e->getCode() === self::FORWARD) {
                    return $this->response;
                } else {
                    throw $e;
                }
            }
        }

        if ($throwException) {
            throw $this->buildException($notFound);
        } else {
            return $notFound;
        }
    }