Passed
Push — master ( d9c192...da139b )
by Simone
02:10
created

Container   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 3
dl 0
loc 95
ccs 47
cts 47
cp 1
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A setArgumentBuilder() 0 5 1
A loadServices() 0 4 1
A getServicesConfiguration() 0 4 1
A ensureServiceIsDefined() 0 8 2
A ensureBuilderIsDefined() 0 8 2
A get() 0 19 2
A simpleResolver() 0 13 2
A resolve() 0 7 2
A contains() 0 5 1
A hasArguments() 0 4 1
1
<?php
2
3
namespace Sensorario\Container;
4
5
use ReflectionClass;
6
7
class Container
8
{
9
    private $services = [];
10
11
    private $builder;
12
13
    private $instances = [];
14
15 2
    public function setArgumentBuilder(ArgumentBuilder $builder)
16
    {
17 2
        $this->builder = $builder;
18 2
        $this->builder->setContainer($this);
19 2
    }
20
21 8
    public function loadServices(array $services)
22
    {
23 8
        $this->services = $services;
24 8
    }
25
26 1
    public function getServicesConfiguration()
27
    {
28 1
        return $this->services;
29
    }
30
31 6
    private function ensureServiceIsDefined($serviceName)
32
    {
33 6
        if (!$this->contains($serviceName)) {
34 1
            throw new \RuntimeException(
35 1
                'Oops! Service ' . $serviceName . ' not defined'
36
            );
37
        }
38 5
    }
39
40 3
    private function ensureBuilderIsDefined()
41
    {
42 3
        if (!$this->builder) {
43 1
            throw new \RuntimeException(
44 1
                'Oops! No builder, no party!'
45
            );
46
        }
47 2
    }
48
49 6
    public function get(string $serviceName)
50
    {
51 6
        $this->ensureServiceIsDefined($serviceName);
52
53 5
        $service = Objects\Service::box([
54 5
            'name' => $serviceName,
55 5
            'services' => $this->services,
56
        ]);
57
58 5
        if ($service->isConstructorEmpty()) {
59 4
            return $this->simpleResolver($service);
60
        }
61
62 3
        $this->ensureBuilderIsDefined();
63 2
        $this->builder->setParams($service->getParams());
64 2
        $this->resolve($service);
65
66 2
        return $this->instances[$service->getName()];
67
    }
68
69 4
    public function simpleResolver($service)
70
    {
71 4
        if ($service->classNotExists()) {
72 1
            throw new \RuntimeException(
73 1
                'Oops! Class ' . $service->getClass() .
74 1
                ' defined as ' . $service->getName()
75
            );
76
        }
77
78 3
        $serviceClass = $service->getClass();
79
80 3
        return new $serviceClass();
81
    }
82
83 2
    private function resolve($service)
84
    {
85 2
        if (!isset($this->instances[$service->getName()])) {
86 2
            $this->instances[$service->getName()] = (new ReflectionClass($service->getClass()))
87 2
                ->newInstanceArgs($this->builder->getArguments());
88
        }
89 2
    }
90
91 7
    public function contains(string $serviceName)
92
    {
93 7
        $service = Objects\Argument::fromString($serviceName);
94 7
        return isset($this->services[$service->getServiceName()]);
95
    }
96
97 1
    public function hasArguments($serviceName)
98
    {
99 1
        return isset($this->services[$serviceName]['params']);
100
    }
101
}
102