Laravel AT Protocol Client (alpha & unstable)
at dev 1.9 kB view raw
1<?php 2 3namespace SocialDept\AtpClient\Concerns; 4 5use BadMethodCallException; 6 7trait HasDomainExtensions 8{ 9 /** 10 * Resolved domain extension instances. 11 * 12 * @var array<string, object> 13 */ 14 protected array $resolvedDomainExtensions = []; 15 16 /** 17 * Get the domain name for this client. 18 */ 19 abstract protected function getDomainName(): string; 20 21 /** 22 * Get the root client class for extension lookup. 23 */ 24 abstract protected function getRootClientClass(): string; 25 26 /** 27 * Get the root client instance. 28 */ 29 abstract public function root(): object; 30 31 /** 32 * Resolve a domain extension instance. 33 */ 34 protected function resolveDomainExtension(string $name): object 35 { 36 if (! isset($this->resolvedDomainExtensions[$name])) { 37 $rootClass = $this->getRootClientClass(); 38 $extensions = $rootClass::getDomainExtensionsFor($this->getDomainName()); 39 $this->resolvedDomainExtensions[$name] = ($extensions[$name])($this); 40 } 41 42 return $this->resolvedDomainExtensions[$name]; 43 } 44 45 /** 46 * Check if a domain extension exists. 47 */ 48 protected function hasDomainExtension(string $name): bool 49 { 50 $rootClass = $this->getRootClientClass(); 51 52 return $rootClass::hasDomainExtension($this->getDomainName(), $name); 53 } 54 55 /** 56 * Magic getter for domain extension access. 57 */ 58 public function __get(string $name): mixed 59 { 60 if ($this->hasDomainExtension($name)) { 61 return $this->resolveDomainExtension($name); 62 } 63 64 throw new BadMethodCallException( 65 sprintf('Property [%s] does not exist on [%s].', $name, static::class) 66 ); 67 } 68 69 /** 70 * Magic isset for domain extension checking. 71 */ 72 public function __isset(string $name): bool 73 { 74 return $this->hasDomainExtension($name); 75 } 76}