/**
  * @return $this
  */
 public function init()
 {
     parent::init();
     // extension installation event listener
     $this->addEventListener(Event\Type\System\ExtensionInstall::toType(), function ($event) {
         return $this->onInstall($event);
     });
     return $this;
 }
 /**
  * @return void
  */
 public final function dispatch($event)
 {
     static $reentered = false;
     try {
         // handle internal events
         if ($event instanceof Event\Type\AbstractInternal || $reentered) {
             return parent::dispatch($event);
         }
         $event->setOriginalTarget($this);
         $this->bootstrap($event);
         // dispatch given event to the application
         if ($event instanceof Event\Type\Http\Request) {
             $reentered = true;
             $pkgTarget = $this->getTargetPackage($event);
             $event = $pkgTarget->dispatch($event);
             if (!$this->isCli()) {
                 //$this->checkOutputBuffer();
             }
         } else {
             $event = parent::dispatch($event);
         }
     } catch (\Exception $e) {
         $event->setException($e);
         $event->setStatus(Event\STATUS_INTERRUPTED);
         if ($e instanceof Exception\AbstractException && Exception\AbstractException::$nonMaskable) {
             throw $e;
         }
     }
     if ($event->getStatus() == Event\STATUS_INTERRUPTED) {
         $excepEvent = Event\Type\System\Exception::create()->setException($event->getException());
         $event = parent::dispatch($excepEvent);
     }
     $this->finishContractServices();
     if ($event instanceof Event\Type\InternalEventInterface) {
         $event->output();
     }
     return $event;
 }