Completed
Push — master ( c8e320...41a25f )
by Mike
03:33
created

AbstractDependencyContainer   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Test Coverage

Coverage 20%

Importance

Changes 0
Metric Value
wmc 11
eloc 19
dl 0
loc 116
c 0
b 0
f 0
ccs 6
cts 30
cp 0.2
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A set() 0 5 1
A extend() 0 5 1
A offsetExists() 0 3 1
A register() 0 3 1
A __construct() 0 3 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 3
    public function __construct(ConfigInterface $config)
33
    {
34 3
        $this->config = $config;
35 3
    }
36
37
    /**
38
     * @param string $name
39
     * @param callable $callable
40
     *
41
     * @return \Xervice\Core\Business\Model\Dependency\DependencyContainerInterface
42
     */
43
    public function set(string $name, callable $callable): DependencyContainerInterface
44
    {
45
        $this->offsetSet($name, $callable);
46
47
        return $this;
48
    }
49
50
    /**
51
     * @param string $name
52
     *
53
     * @return mixed
54
     */
55
    public function get(string $name)
56
    {
57
        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
    public function offsetGet($offset)
76
    {
77
        if (!isset($this->values[$offset])) {
78
            $this->values[$offset] = $this->dependencies[$offset]($this);
79
        }
80
81
        return $this->values[$offset];
82
    }
83
84
    /**
85
     * @param mixed $offset
86
     * @param mixed $value
87
     */
88
    public function offsetSet($offset, $value)
89
    {
90
        $this->dependencies[$offset] = $value;
91
    }
92
93
    /**
94
     * @param mixed $offset
95
     */
96
    public function offsetUnset($offset)
97
    {
98
        unset($this->dependencies[$offset], $this->values[$offset]);
99
    }
100
101
    /**
102
     * @param \Xervice\Core\Business\Model\Dependency\Provider\DependencyProviderInterface $dependencyProvider
103
     */
104 2
    public function register(DependencyProviderInterface $dependencyProvider): void
105
    {
106 2
        $dependencyProvider->handleDependencies($this);
107 2
    }
108
109
    /**
110
     * @param string $name
111
     * @param callable $callable
112
     */
113
    public function extend(string $name, callable $callable): void
114
    {
115
        $value = $this->offsetGet($name);
116
        $this->offsetUnset($name);
117
        $this->offsetSet($name, $callable($value));
118
    }
119
120
    /**
121
     * @return \Xervice\Core\Business\Model\Config\ConfigInterface
122
     */
123
    protected function getConfig(): ConfigInterface
124
    {
125
        return $this->config;
126
    }
127
}