Passed
Push — improve-reset-in-memory-cache ( 6b01b5 )
by Chema
03:52
created

AbstractFactory::resolveDependencyProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework;
6
7
use Closure;
8
use Gacela\Framework\ClassResolver\DependencyProvider\DependencyProviderResolver;
9
use Gacela\Framework\Config\Config;
10
use Gacela\Framework\Container\Container;
11
use Gacela\Framework\Container\Exception\ContainerKeyNotFoundException;
12
13
abstract class AbstractFactory
14
{
15
    use ConfigResolverAwareTrait;
16
17
    /** @var array<string,Container> */
18
    private static array $containers = [];
19
20
    /**
21
     * @internal
22
     */
23
    public static function resetCache(): void
24
    {
25
        self::$containers = [];
26
    }
27
28
    /**
29
     * @throws ContainerKeyNotFoundException
30
     */
31
    protected function getProvidedDependency(string $key): mixed
32
    {
33
        return $this->getContainer()->get($key);
34
    }
35
36
    private function getContainer(): Container
37
    {
38
        $containerKey = static::class;
39
40
        if (!isset(self::$containers[$containerKey])) {
41
            self::$containers[$containerKey] = $this->createContainerWithProvidedDependencies();
42
        }
43
44
        return self::$containers[$containerKey];
45
    }
46
47
    private function createContainerWithProvidedDependencies(): Container
48
    {
49
        $container = new Container($this->getServicesToExtend());
50
        $dependencyProvider = $this->resolveDependencyProvider();
51
        $dependencyProvider->provideModuleDependencies($container);
52
53
        return $container;
54
    }
55
56
    /**
57
     * @return array<string,list<Closure>>
58
     */
59
    private function getServicesToExtend(): array
60
    {
61
        return Config::getInstance()
62
            ->getSetupGacela()
63
            ->getServicesToExtend();
64
    }
65
66
    /**
67
     * @throws ClassResolver\DependencyProvider\DependencyProviderNotFoundException
68
     */
69
    private function resolveDependencyProvider(): AbstractDependencyProvider
70
    {
71
        return (new DependencyProviderResolver())->resolve($this);
72
    }
73
}
74