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

ClassItemBuilder   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 42
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 24
c 1
b 0
f 0
dl 0
loc 42
ccs 22
cts 22
cp 1
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
B build() 0 26 6
A __construct() 0 3 1
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