config = new ServerConfig($config); $this->getServer()->init($this->config); } public function start(): void { $this->getServer()->start(); } public function getServer(): ServerInterface { if (! $this->server instanceof ServerInterface) { $serverName = $this->config->getType(); $this->server = new $serverName( $this->container, $this->getLogger(), $this->getEventDispatcher() ); } return $this->server; } public function setServer(Server $server): static { $this->server = $server; return $this; } public function getEventDispatcher(): EventDispatcherInterface { if ($this->eventDispatcher instanceof EventDispatcherInterface) { return $this->eventDispatcher; } return $this->getDefaultEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher): static { $this->eventDispatcher = $eventDispatcher; return $this; } public function getLogger(): LoggerInterface { if ($this->logger instanceof LoggerInterface) { return $this->logger; } return $this->getDefaultLogger(); } public function setLogger(LoggerInterface $logger): static { $this->logger = $logger; return $this; } public function getConfig(): ?ServerConfig { return $this->config; } private function getDefaultEventDispatcher(): EventDispatcherInterface { return new EventDispatcher(); } private function getDefaultLogger(): LoggerInterface { return new Logger(); } }