MarshalDelegatorsConfig::delegateInvokables()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 11
ccs 0
cts 7
cp 0
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 3
crap 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Antidot\Aura\Container\Config;
6
7
use Antidot\Aura\Container\ContainerDelegatorFactory;
8
use Aura\Di\Container;
9
10
use function is_callable;
11
12
class MarshalDelegatorsConfig
13
{
14
    public function __invoke(Container $container, array $dependencies): array
15
    {
16
        foreach ($dependencies['delegators'] as $service => $delegatorNames) {
17
            $factory = null;
18
            $this->delegateServices($dependencies, $service, $factory);
19
            $this->delegateFactories($container, $dependencies, $service, $factory);
20
            $this->delegateInvokables($dependencies, $service, $factory);
21
            if (!is_callable($factory)) {
22
                continue;
23
            }
24
            $delegatorFactory = 'AuraDelegatorFactory::'.$service;
25
            $container->set($delegatorFactory, static function () use ($delegatorNames, $factory) {
26
                return new ContainerDelegatorFactory($delegatorNames, $factory);
27
            });
28
            $container->set(
29
                $service,
30
                $container->lazyGetCall($delegatorFactory, 'build', $container, $service)
31
            );
32
            $container->types[$service] = $container->lazyGet($service);
33
        }
34
35
        return $dependencies;
36
    }
37
38
    private function delegateServices(array &$dependencies, string $service, ?callable &$factory): void
39
    {
40
        if (empty($dependencies['services'][$service])) {
41
            return;
42
        }
43
        // Marshal from service
44
        $instance = $dependencies['services'][$service];
45
        $factory = static function () use ($instance) {
46
            return $instance;
47
        };
48
        unset($dependencies['service'][$service]);
49
    }
50
51
    private function delegateFactories(
52
        Container $container,
53
        array &$dependencies,
54
        string $service,
55
        ?callable &$factory
56
    ): void {
57
        if (empty($dependencies['factories'][$service])) {
58
            return;
59
        }
60
        // Marshal from factory
61
        $serviceFactory = $dependencies['factories'][$service];
62
        $factory = static function () use ($service, $serviceFactory, $container) {
63
            $aService = new $serviceFactory();
64
65
            return is_callable($serviceFactory)
66
                ? $serviceFactory($container, $service)
67
                : $aService($container, $service);
68
        };
69
        unset($dependencies['factories'][$service]);
70
    }
71
72
    private function delegateInvokables(array &$dependencies, string $service, ?callable &$factory): void
73
    {
74
        if (empty($dependencies['invokables'][$service])) {
75
            return;
76
        }
77
        // Marshal from invokable
78
        $class = $dependencies['invokables'][$service];
79
        $factory = static function () use ($class) {
80
            return new $class();
81
        };
82
        unset($dependencies['invokables'][$service]);
83
    }
84
}
85