public function distribute()
    {
        $this
            ->_processSessionValues()
            ->_processQueryArguments()
            ;

        // if kernerl has booting errors, treat them first
        if (CarteBlanche::getContainer()->get('kernel')->hasBootErrors()) {
            $routing = array(CarteBlanche::getContainer()->get('kernel')->getBootErrors());
            if (CarteBlanche::getContainer()->get('request')->isCli()) {
                $routing['controller'] = CarteBlanche::getConfig('routing.cli.default_controller');
                $routing['action'] = CarteBlanche::getConfig('routing.cli.booterrors_action');
            } elseif (CarteBlanche::getContainer()->get('request')->isAjax()) {
                $routing['controller'] = CarteBlanche::getConfig('routing.ajax.default_controller');
                $routing['action'] = CarteBlanche::getConfig('routing.ajax.booterrors_action');
            } else {
                $routing['controller'] = CarteBlanche::getConfig('routing.mvc.default_controller');
                $routing['action'] = CarteBlanche::getConfig('routing.mvc.booterrors_action');
            }
        } else {
            $routing = CarteBlanche::getContainer()->get('router')
                ->distribute()
                ->getRouteParsed();

            // controller
            if (empty($routing['controller'])) {
                if (CarteBlanche::getContainer()->get('request')->isCli()) {
                    $routing['controller'] = CarteBlanche::getConfig('routing.cli.default_controller');
                } elseif (CarteBlanche::getContainer()->get('request')->isAjax()) {
                    $routing['controller'] = CarteBlanche::getConfig('routing.ajax.default_controller');
                } else {
                    $routing['controller'] = CarteBlanche::getConfig('routing.mvc.default_controller');
                }
            }

            // action
            if (empty($routing['action'])) {
                if (CarteBlanche::getContainer()->get('request')->isCli()) {
                    $routing['action'] = CarteBlanche::getConfig('routing.cli.default_action');
                } elseif (CarteBlanche::getContainer()->get('request')->isAjax()) {
                    $routing['action'] = CarteBlanche::getConfig('routing.ajax.default_action');
                } else {
                    $routing['action'] = CarteBlanche::getConfig('routing.mvc.default_action');
                }
            }
        }

        // arguments
        $primary_args = $routing;
        unset($primary_args['all']);
        $args = isset($routing['all']) ? array_merge($primary_args, $routing['all']) : $primary_args;

        // dispatch
        return $this->dispatch(
            $routing['controller'], $routing['action'], $args
        );
    }