> */ private $data = null; private string $cacheKey = 'ormMetadata'; private bool $useCache; private ?Converter $converter = null; public function __construct( private DataCache $dataCache, private Config $config, private InjectableFactory $injectableFactory ) { $this->useCache = (bool) $this->config->get('useCache', false); } private function getConverter(): Converter { if (!isset($this->converter)) { $this->converter = $this->injectableFactory->create(Converter::class); } return $this->converter; } /** * Reloads data. */ public function reload(): void { $this->getDataInternal(true); } /** * Get raw data. * * @return array> */ public function getData(): array { return $this->getDataInternal(); } /** * @return array> */ private function getDataInternal(bool $reload = false): array { if (isset($this->data) && !$reload) { return $this->data; } if ($this->useCache && $this->dataCache->has($this->cacheKey) && !$reload) { /** @var array> $data */ $data = $this->dataCache->get($this->cacheKey); $this->data = $data; return $this->data; } $this->data = $this->getConverter()->process(); if ($this->useCache) { $this->dataCache->store($this->cacheKey, $this->data); } return $this->data; } /** * @param string|string[]|null $key * @param mixed $default * @return mixed */ public function get($key = null, $default = null) { return Util::getValueByKey($this->getData(), $key, $default); } }