DefinitionBuilder::resolveShared()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 3
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 3
rs 10
1
<?php
2
3
namespace Maiorano\ContainerConfig;
4
5
use League\Container\Definition\DefinitionAggregateInterface;
6
use League\Container\Definition\DefinitionInterface;
7
8
/**
9
 * Class DefinitionBuilder.
10
 */
11
final class DefinitionBuilder implements BuilderInterface
12
{
13
    /**
14
     * @var DefinitionAggregateInterface
15
     */
16
    private DefinitionAggregateInterface $definitions;
17
18
    /**
19
     * DefinitionBuilder constructor.
20
     *
21
     * @param DefinitionAggregateInterface $definitions
22
     */
23 6
    public function __construct(DefinitionAggregateInterface $definitions)
24
    {
25 6
        $this->definitions = $definitions;
26 6
    }
27
28
    /**
29
     * @param array $config
30
     *
31
     * @return DefinitionAggregateInterface
32
     */
33 2
    public function build(array $config): DefinitionAggregateInterface
34
    {
35 2
        foreach ($config as $key => $value) {
36 2
            $this->buildDefinition((string) $key, $value);
37
        }
38
39 2
        return $this->definitions;
40
    }
41
42
    /**
43
     * @param string $key
44
     * @param mixed  $value
45
     *
46
     * @return DefinitionInterface
47
     */
48 5
    public function buildDefinition(string $key, $value): DefinitionInterface
49
    {
50 5
        $concrete = $this->resolveConcrete($value);
51 5
        $alias = $this->resolveAlias($key, $value, $concrete);
52
53 5
        if ($concrete instanceof DefinitionInterface) {
54 2
            return $this->definitions->add($alias, $concrete, $concrete->isShared());
55
        }
56
57 3
        $definition = $this->definitions->add($alias, $concrete, $this->resolveShared($value));
58 3
        if (is_array($value)) {
59 3
            $this->resolveArguments($definition, $value['arguments'] ?? []);
60 3
            $this->resolveMethods($definition, $value['methods'] ?? []);
61 3
            $this->resolveTags($definition, $value['tags'] ?? []);
62
        }
63
64 3
        return $definition;
65
    }
66
67
    /**
68
     * @param mixed $value
69
     *
70
     * @return array|mixed|string
71
     */
72 5
    private function resolveConcrete($value)
73
    {
74 5
        if (is_array($value) && isset($value['concrete'])) {
75 3
            return $value['concrete'];
76
        }
77
78 4
        return $value;
79
    }
80
81
    /**
82
     * @param string $key
83
     * @param mixed  $value
84
     * @param mixed  $concrete
85
     *
86
     * @return string
87
     */
88 5
    private function resolveAlias(string $key, $value, $concrete): string
89
    {
90 5
        if (is_array($value) && isset($value['alias'])) {
91 3
            return $value['alias'];
92
        }
93 4
        if (is_numeric($key)) {
94 2
            return $this->resolveAliasFromConcrete($key, $concrete);
95
        }
96
97 2
        return $key;
98
    }
99
100
    /**
101
     * @param string $key
102
     * @param mixed  $concrete
103
     *
104
     * @return string
105
     */
106 2
    private function resolveAliasFromConcrete(string $key, $concrete): string
107
    {
108 2
        if ($concrete instanceof DefinitionInterface) {
109 1
            return $concrete->getAlias();
110
        }
111 1
        if (is_string($concrete) && (class_exists($concrete) || interface_exists($concrete))) {
112 1
            return $concrete;
113
        }
114
115 1
        return is_object($concrete) ? get_class($concrete) : $key;
116
    }
117
118
    /**
119
     * @param mixed $value
120
     *
121
     * @return bool
122
     */
123 3
    private function resolveShared($value): bool
124
    {
125 3
        if (is_array($value) && isset($value['shared'])) {
126 3
            return $value['shared'] === true;
127
        }
128
129 2
        return false;
130
    }
131
132
    /**
133
     * @param DefinitionInterface $definition
134
     * @param array               $arguments
135
     *
136
     * @return DefinitionInterface
137
     */
138 3
    private function resolveArguments(DefinitionInterface $definition, array $arguments): DefinitionInterface
139
    {
140 3
        return $definition->addArguments($arguments);
141
    }
142
143
    /**
144
     * @param DefinitionInterface $definition
145
     * @param array               $methods
146
     *
147
     * @return DefinitionInterface
148
     */
149 3
    private function resolveMethods(DefinitionInterface $definition, array $methods): DefinitionInterface
150
    {
151 3
        return $definition->addMethodCalls($methods);
152
    }
153
154
    /**
155
     * @param DefinitionInterface $definition
156
     * @param array               $tags
157
     *
158
     * @return DefinitionInterface
159
     */
160 3
    private function resolveTags(DefinitionInterface $definition, array $tags): DefinitionInterface
161
    {
162 3
        foreach ($tags as $tag) {
163 1
            $definition->addTag($tag);
164
        }
165
166 3
        return $definition;
167
    }
168
}
169