Laravel AT Protocol Client (alpha & unstable)
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}