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

ItemProvider::findInstanceOf()   B

Complexity

Conditions 9
Paths 6

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 9.0608

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 9
eloc 12
c 1
b 0
f 0
nc 6
nop 1
dl 0
loc 16
ccs 10
cts 11
cp 0.9091
crap 9.0608
rs 8.0555
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
            if ($item instanceof ClassItem && class_exists($item->getClassName())) {
45 5
                $className = $item->getClassName();
46 5
            } elseif ($item instanceof AliasItem && class_exists($item->getAlias())) {
47
                $className = $item->getAlias();
48
            } else {
49 5
                continue;
50
            }
51 5
            $reflection = new \ReflectionClass($className);
52
            if (
53 5
                $reflection->isInstantiable()
54 5
                && ($reflection->implementsInterface($interface) || $reflection->isSubclassOf($interface))
55
            ) {
56 2
                yield $id;
57
            }
58
        }
59 5
    }
60
61
    /**
62
     * {@inheritdoc}
63
     */
64 11
    public function getIterator()
65
    {
66 11
        return new \ArrayIterator($this->items);
67
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72 1
    public function serialize()
73
    {
74 1
        return serialize($this->items);
75
    }
76
77
    /**
78
     * {@inheritdoc}
79
     */
80 1
    public function unserialize($serialized): void
81
    {
82 1
        $this->items = unserialize($serialized);
83 1
    }
84
85 11
    public function getVariadicPass(): VariadicPass
86
    {
87 11
        return $this->variadicPass;
88
    }
89
}
90