Passed
Push — master ( 3bfccc...670b84 )
by Koldo
02:23
created

MarshalDelegatorsConfig::__invoke()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 22
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

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