Completed
Push — master ( 41a25f...269818 )
by Mike
02:08
created

AbstractDependencyContainer   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 121
Duplicated Lines 0 %

Test Coverage

Coverage 87.1%

Importance

Changes 0
Metric Value
wmc 11
eloc 21
dl 0
loc 121
ccs 27
cts 31
cp 0.871
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A offsetExists() 0 3 1
A __construct() 0 3 1
A set() 0 5 1
A extend() 0 6 1
A register() 0 4 1
A get() 0 3 1
A offsetGet() 0 7 2
A offsetUnset() 0 3 1
A offsetSet() 0 3 1
A getConfig() 0 3 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Xervice\Core\Business\Model\Dependency;
5
6
7
use Xervice\Core\Business\Model\Config\ConfigInterface;
8
use Xervice\Core\Business\Model\Dependency\Provider\DependencyProviderInterface;
9
10
class AbstractDependencyContainer implements DependencyContainerInterface
11
{
12
    /**
13
     * @var array
14
     */
15
    private $dependencies;
16
17
    /**
18
     * @var array
19
     */
20
    private $values;
21
22
    /**
23
     * @var \Xervice\Core\Business\Model\Config\ConfigInterface
24
     */
25
    private $config;
26
27
    /**
28
     * AbstractDependencyContainer constructor.
29
     *
30
     * @param \Xervice\Core\Business\Model\Config\ConfigInterface $config
31
     */
32 5
    public function __construct(ConfigInterface $config)
33
    {
34 5
        $this->config = $config;
35 5
    }
36
37
    /**
38
     * @param string $name
39
     * @param callable $callable
40
     *
41
     * @return \Xervice\Core\Business\Model\Dependency\DependencyContainerInterface
42
     */
43 1
    public function set(string $name, callable $callable): DependencyContainerInterface
44
    {
45 1
        $this->offsetSet($name, $callable);
46
47 1
        return $this;
48
    }
49
50
    /**
51
     * @param string $name
52
     *
53
     * @return mixed
54
     */
55 1
    public function get(string $name)
56
    {
57 1
        return $this->offsetGet($name);
58
    }
59
60
    /**
61
     * @param mixed $offset
62
     *
63
     * @return bool
64
     */
65
    public function offsetExists($offset): bool
66
    {
67
        return isset($this->dependencies[$offset]);
68
    }
69
70
    /**
71
     * @param mixed $offset
72
     *
73
     * @return mixed
74
     */
75 1
    public function offsetGet($offset)
76
    {
77 1
        if (!isset($this->values[$offset])) {
78 1
            $this->values[$offset] = $this->dependencies[$offset]($this);
79
        }
80
81 1
        return $this->values[$offset];
82
    }
83
84
    /**
85
     * @param mixed $offset
86
     * @param mixed $value
87
     */
88 1
    public function offsetSet($offset, $value)
89
    {
90 1
        $this->dependencies[$offset] = $value;
91 1
    }
92
93
    /**
94
     * @param mixed $offset
95
     */
96 1
    public function offsetUnset($offset)
97
    {
98 1
        unset($this->dependencies[$offset], $this->values[$offset]);
99 1
    }
100
101
    /**
102
     * @param \Xervice\Core\Business\Model\Dependency\Provider\DependencyProviderInterface $dependencyProvider
103
     *
104
     * @return \Xervice\Core\Business\Model\Dependency\DependencyContainerInterface
105
     */
106 4
    public function register(DependencyProviderInterface $dependencyProvider): DependencyContainerInterface
107
    {
108 4
        $this->values = [];
109 4
        return $dependencyProvider->handleDependencies($this);
110
    }
111
112
    /**
113
     * @param string $name
114
     * @param callable $callable
115
     */
116 1
    public function extend(string $name, callable $callable): void
117
    {
118 1
        $value = $this->offsetGet($name);
119 1
        $this->offsetUnset($name);
120
        $this->offsetSet($name, function () use ($callable, $value) {
121 1
            return $callable($value);
122 1
        });
123 1
    }
124
125
    /**
126
     * @return \Xervice\Core\Business\Model\Config\ConfigInterface
127
     */
128
    protected function getConfig(): ConfigInterface
129
    {
130
        return $this->config;
131
    }
132
}