. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\ORM\Value; use stdClass; class GeneralAttributeExtractor { /** @var AttributeExtractorFactory */ private AttributeExtractorFactory $factory; /** * @var array> */ private $cache = []; /** * @param AttributeExtractorFactory $factory */ public function __construct(AttributeExtractorFactory $factory) { $this->factory = $factory; } /** * Extracts attributes from a value object. */ public function extract(string $entityType, string $field, ?object $value): stdClass { $extractor = $this->getExtractor($entityType, $field); if (is_null($value)) { return $extractor->extractFromNull($field); } return $extractor->extract($value, $field); } /** * @return AttributeExtractor */ private function getExtractor(string $entityType, string $field): AttributeExtractor { $key = $entityType . '_' . $field; if (!array_key_exists($key, $this->cache)) { $this->cache[$key] = $this->factory->create($entityType, $field); } return $this->cache[$key]; } }