Passed
Pull Request — main (#340)
by Chema
07:33 queued 03:19
created

ServiceResolverAwareTrait   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 16
dl 0
loc 50
rs 10
c 1
b 0
f 0
wmc 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getDocBlockResolver() 0 9 2
A resolveService() 0 9 2
A __call() 0 10 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework;
6
7
use Gacela\Framework\ClassResolver\DocBlockService\DocBlockServiceResolver;
8
use Gacela\Framework\DocBlockResolver\DocBlockResolvable;
9
use Gacela\Framework\DocBlockResolver\DocBlockResolver;
10
11
use function array_key_exists;
12
13
/**
14
 * Resolves Gacela services declared via PHPDoc tags or the #[ServiceMap] attribute.
15
 */
16
trait ServiceResolverAwareTrait
17
{
18
    /** @var array<string,mixed> */
19
    private array $customServices = [];
20
21
    /** @var array<class-string,DocBlockResolver> */
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<class-string,DocBlockResolver> at position 2 could not be parsed: Unknown type name 'class-string' at position 2 in array<class-string,DocBlockResolver>.
Loading history...
22
    private static array $docBlockResolvers = [];
23
24
    /** @var array<string,DocBlockServiceResolver> */
25
    private static array $docBlockServiceResolvers = [];
26
27
    /**
28
     * @psalm-suppress LessSpecificImplementedReturnType
29
     *
30
     * @param list<mixed> $parameters
31
     *
32
     * @return mixed
33
     */
34
    public function __call(string $method = '', array $parameters = [])
35
    {
36
        if (array_key_exists($method, $this->customServices)) {
37
            return $this->customServices[$method];
38
        }
39
40
        $resolvable = $this->getDocBlockResolver()->getDocBlockResolvable($method);
41
        $service = $this->resolveService($resolvable);
42
43
        return $this->customServices[$method] = $service;
44
    }
45
46
    private function getDocBlockResolver(): DocBlockResolver
47
    {
48
        $callerClass = static::class;
49
50
        if (!isset(self::$docBlockResolvers[$callerClass])) {
51
            self::$docBlockResolvers[$callerClass] = DocBlockResolver::fromCaller($this);
52
        }
53
54
        return self::$docBlockResolvers[$callerClass];
55
    }
56
57
    private function resolveService(DocBlockResolvable $resolvable): object
58
    {
59
        $resolvableType = $resolvable->resolvableType();
60
61
        if (!isset(self::$docBlockServiceResolvers[$resolvableType])) {
62
            self::$docBlockServiceResolvers[$resolvableType] = new DocBlockServiceResolver($resolvableType);
63
        }
64
65
        return self::$docBlockServiceResolvers[$resolvableType]->resolve($resolvable->className());
66
    }
67
}
68