Completed
Push — master ( 993e47...b8c606 )
by Dawid
15:17 queued 12:48
created

MultiServiceAwareExtender   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 95.65%

Importance

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

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A __invoke() 0 16 3
A register() 0 6 2
A configureService() 0 11 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 3
    public function __construct(array $extendServiceDefinitions)
24
    {
25 3
        $this->extendServiceDefinitions = $extendServiceDefinitions;
26 3
    }
27
28
    /**
29
     * {@inheritdoc}
30
     */
31 3
    public function register(Container $pimple)
32
    {
33 3
        foreach ($pimple->keys() as $serviceName) {
34 3
            $pimple->extend($serviceName, $this);
35
        }
36 3
    }
37
38
    /**
39
     * @param mixed     $service
40
     * @param Container $container
41
     *
42
     * @return mixed
43
     */
44 3
    public function __invoke($service, Container $container)
45
    {
46 3
        if (!is_object($service)) {
47 3
            return $service;
48
        }
49
50 3
        $objectHash = spl_object_hash($service);
51 3
        if (in_array($objectHash, $this->configuredServicesHash)) {
52
            return $service;
53
        }
54
55 3
        $this->configureService($service, $container);
56 3
        $this->configuredServicesHash[] = $objectHash;
57
58 3
        return $service;
59
    }
60
61
    /**
62
     * @param object    $service
63
     * @param Container $container
64
     */
65 3
    protected function configureService($service, Container $container)
66
    {
67 3
        foreach ($this->extendServiceDefinitions as $extendServiceDefinition) {
68 3
            $interfaceNameToInject = $extendServiceDefinition->getInterfaceNameToHandle();
69 3
            if (!$service instanceof $interfaceNameToInject) {
70 3
                continue;
71
            }
72
73 2
            $service->{$extendServiceDefinition->getMethodNameToCall()}($container[$extendServiceDefinition->getServiceNameToInject()]);
74
        }
75 3
    }
76
}
77