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

ItemProvider   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 83
Duplicated Lines 0 %

Test Coverage

Coverage 96.97%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 23
c 2
b 0
f 0
dl 0
loc 83
ccs 32
cts 33
cp 0.9697
rs 10
wmc 19

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A hasItem() 0 3 1
A getItem() 0 3 1
A addItem() 0 3 1
A getVariadicPass() 0 3 1
A serialize() 0 3 1
A findInstanceOf() 0 10 6
A unserialize() 0 3 1
A getItemClassReflection() 0 9 5
A getIterator() 0 3 1
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