MultiServiceAwareExtender   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 2
dl 0
loc 70
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A register() 0 6 2
A configureService() 0 11 3
A __invoke() 0 17 3
1
<?php
2
3
namespace Spiechu\LazyPimple\DependencyInjection;
4
5
use Pimple\Container;
6
use Pimple\ServiceProviderInterface;
7
8
class MultiServiceAwareExtender implements ServiceProviderInterface
9
{
10
    /**
11
     * @var ExtendServiceDefinition[]
12
     */
13
    protected $extendServiceDefinitions;
14
15
    /**
16
     * @var string[]
17
     */
18
    protected $configuredServicesHash = [];
19
20
    /**
21
     * @param ExtendServiceDefinition[] $extendServiceDefinitions
22
     */
23 5
    public function __construct(array $extendServiceDefinitions)
24
    {
25 5
        $this->extendServiceDefinitions = $extendServiceDefinitions;
26 5
    }
27
28
    /**
29
     * @param mixed     $service
30
     * @param Container $container
31
     *
32
     * @return mixed
33
     */
34 5
    public function __invoke($service, Container $container)
35
    {
36 5
        if (!\is_object($service)) {
37 4
            return $service;
38
        }
39
40 5
        $objectHash = spl_object_hash($service);
41 5
        if (\in_array($objectHash, $this->configuredServicesHash, true)) {
42 1
            return $service;
43
        }
44
45 5
        $this->configureService($service, $container);
46
47 5
        $this->configuredServicesHash[] = $objectHash;
48
49 5
        return $service;
50
    }
51
52
    /**
53
     * {@inheritdoc}
54
     */
55 4
    public function register(Container $pimple): void
56
    {
57 4
        foreach ($pimple->keys() as $serviceName) {
58 4
            $pimple->extend($serviceName, $this);
59
        }
60 4
    }
61
62
    /**
63
     * @param object    $service
64
     * @param Container $container
65
     */
66 5
    protected function configureService($service, Container $container): void
67
    {
68 5
        foreach ($this->extendServiceDefinitions as $extendServiceDefinition) {
69 5
            $interfaceNameToInject = $extendServiceDefinition->getInterfaceNameToHandle();
70 5
            if (!$service instanceof $interfaceNameToInject) {
71 4
                continue;
72
            }
73
74 3
            $service->{$extendServiceDefinition->getMethodNameToCall()}($container[$extendServiceDefinition->getServiceNameToInject()]);
75
        }
76 5
    }
77
}
78