Completed
Push — master ( 1a6c14...1a0ee4 )
by Andrey
02:15
created

ClassItemBuilder::build()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 26
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 20
c 1
b 0
f 0
nc 6
nop 1
dl 0
loc 26
ccs 19
cts 19
cp 1
crap 6
rs 8.9777
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Borodulin\Container\Autowire;
6
7
use Borodulin\Container\Autowire\Item\ClassItem;
8
use Borodulin\Container\ContainerException;
9
use Borodulin\Container\NotFoundException;
10
11
class ClassItemBuilder
12
{
13
    /**
14
     * @var ItemProvider
15
     */
16
    private $itemProvider;
17
    /**
18
     * @var array
19
     */
20
    private $buildClasses;
21
22 14
    public function __construct(ItemProvider $itemProvider)
23
    {
24 14
        $this->itemProvider = $itemProvider;
25 14
    }
26
27 14
    public function build(string $className): AutowireItemInterface
28
    {
29 14
        if ($this->itemProvider->hasItem($className)) {
30 6
            return $this->itemProvider->getItem($className);
31
        }
32 14
        if (class_exists($className)) {
33 13
            if (isset($this->buildClasses[$className])) {
34 1
                throw new ContainerException("$className has circular reference dependency.");
35
            }
36 13
            $this->buildClasses[$className] = true;
37 13
            $reflection = new \ReflectionClass($className);
38 13
            if (!$reflection->isInstantiable()) {
39 1
                throw new ContainerException("$className is not instantiable.");
40
            }
41 12
            $constructor = $reflection->getConstructor();
42 12
            if (null !== $constructor) {
43 12
                $args = (new DependencyBuilder($this->itemProvider, $this))
44 12
                    ->buildParameters($constructor->getParameters());
45
            } else {
46 2
                $args = [];
47
            }
48 11
            $classItem = new ClassItem($className, $args);
49 11
            $this->itemProvider->addItem($className, $classItem);
50 11
            return $classItem;
51
        } else {
52 1
            throw new NotFoundException($className);
53
        }
54
    }
55
}
56