/**
  * retorna o controller que sera executado
  *
  * @return ControllerAbstract
  * @throws ControllerException
  * */
 public function controller()
 {
     $config = $this->config();
     $request = $this->request();
     $module = $request->getModule();
     $funcionality = $request->getFuncionality();
     $action = $request->getAction();
     $namespace = $config->get('app.namespace') . self::NAMESPACE_SEPARATOR;
     if (TRUE === Request::$useModule) {
         $namespace .= $module;
     }
     $namespace .= sprintf('%1$s%2$s%1$smvcb%1$scontroller%1$s%3$sController', self::NAMESPACE_SEPARATOR, $funcionality, ucfirst($funcionality));
     $fullpath = Location::realpathFromNamespace($namespace) . '.php';
     ControllerException::throwsExceptionIfParamIsNull(is_file($fullpath), "Controller::{$funcionality} não implementada");
     $ctrl = new $namespace();
     ControllerException::throwsExceptionIfParamIsNull($ctrl->hasAction($action), "Action '{$namespace}::{$action}' não existe.");
     return $ctrl;
 }
 /**
  * Este método é utilizado para redirecionar o fluxo da requisição.
  *
  * @param string $action
  * @param string $controller
  * @param string[] $params
  * @throws ControllerException
  * @example ControllerAbstract::_forward
  * @code
  *  <?php
  *      ...
  *      // Redirecionamento para método dentro do Controller em uso.
  *      public function defaultAction ()
  *      {
  *          $this->_forward('fooAction', NULL, NULL);
  *      }
  *
  *      ...
  *      // Redirecionamento para método em controller diferente do em uso.
  *      public function defaultAction ()
  *      {
  *          $this->_forward('barAction', BarController, array('bar' => TRUE));
  *      }
  *
  *      ...
  *  ?>
  * @encode
  * */
 protected final function _forward($action, $controller = NULL, array $params = NULL)
 {
     if (NULL === $controller) {
         $controller = $this;
     } else {
         ControllerException::throwsExceptionIfParamIsNull('string' == gettype($controller), self::T_CONTROLLER_INVALID_TYPE_OF_CONTROLLER);
         $controller = new $controller();
     }
     if (NULL != $params) {
         $this->request()->setParams($params);
     }
     if (!strstr($action, 'Action')) {
         $action .= 'Action';
     }
     if (!$controller->hasAction($action)) {
         throw new ControllerException(sprintf(self::t_CONTROLLER_NON_EXISTENT_ACTION, $action));
     }
     # @todo remover este die() e implementar com o controle de dispatcher
     // @codeCoverageIgnoreStart
     die($controller->{$action}());
     // @codeCoverageIgnoreEnd
 }