public function run()
    {
        $services = $this->getServices();
        $events   = $services->get('Events');

        $event = $this->getEvent();
        $event->setContext($this);

        $course = [
            SystemEvent::BOOTSTRAP,
            SystemEvent::ROUTE,
            SystemEvent::DISPATCH,
            SystemEvent::RENDER,
        ];

        try {
            foreach ($course as $eventName) {
                if ($event->getResult(SystemEvent::FINISH)) {
                    break;
                }
                $events->trigger($event($eventName));
            }

            $events->trigger($event(SystemEvent::FINISH));
        } catch (Error $ex) {
            $error = new ErrorEvent(ErrorEvent::FATAL_ERROR, $ex, $this);
            $events->trigger($error);
        } catch (Exception $ex) {
            $error = new ErrorEvent(ErrorEvent::FATAL_ERROR, $ex, $this);
            $events->trigger($error);
        }
    }