Completed
Push — master ( 8fb63d...790faa )
by Andrey
02:31
created

ItemProvider::getItemClassReflection()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 5.1158

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 5
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 9
ccs 5
cts 6
cp 0.8333
crap 5.1158
rs 9.6111
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Borodulin\Container\Autowire;
6
7
use Borodulin\Container\Autowire\Item\AliasItem;
8
use Borodulin\Container\Autowire\Item\ClassItem;
9
10
class ItemProvider implements \IteratorAggregate, \Serializable
11
{
12
    /**
13
     * @var array
14
     */
15
    private $items = [];
16
    /**
17
     * @var VariadicPass
18
     */
19
    private $variadicPass;
20
21 15
    public function __construct()
22
    {
23 15
        $this->variadicPass = new VariadicPass();
24 15
    }
25
26 15
    public function addItem(string $id, AutowireItemInterface $item): void
27
    {
28 15
        $this->items[$id] = $item;
29 15
    }
30
31 14
    public function hasItem(string $id): bool
32
    {
33 14
        return isset($this->items[$id]);
34
    }
35
36 6
    public function getItem(string $id): AutowireItemInterface
37
    {
38 6
        return $this->items[$id];
39
    }
40
41 5
    public function findInstanceOf($interface): \Traversable
42
    {
43 5
        foreach ($this->items as $id => $item) {
44 5
            $reflection = $this->getItemClassReflection($item);
45
            if (
46 5
                $reflection
47 5
                && $reflection->isInstantiable()
48 5
                && ($reflection->implementsInterface($interface) || $reflection->isSubclassOf($interface))
49
            ) {
50 2
                yield $id;
51
            }
52
        }
53 5
    }
54
55 5
    private function getItemClassReflection(AutowireItemInterface $item): ?\ReflectionClass
56
    {
57 5
        if ($item instanceof ClassItem && class_exists($item->getClassName())) {
58 5
            return new \ReflectionClass($item->getClassName());
59 5
        } elseif ($item instanceof AliasItem && class_exists($item->getAlias())) {
60
            return new \ReflectionClass($item->getAlias());
61
        }
62
63 5
        return null;
64
    }
65
66
    /**
67
     * {@inheritdoc}
68
     */
69 11
    public function getIterator()
70
    {
71 11
        return new \ArrayIterator($this->items);
72
    }
73
74
    /**
75
     * {@inheritdoc}
76
     */
77 1
    public function serialize()
78
    {
79 1
        return serialize($this->items);
80
    }
81
82
    /**
83
     * {@inheritdoc}
84
     */
85 1
    public function unserialize($serialized): void
86
    {
87 1
        $this->items = unserialize($serialized);
88 1
    }
89
90 11
    public function getVariadicPass(): VariadicPass
91
    {
92 11
        return $this->variadicPass;
93
    }
94
}
95