Completed
Push — master-4.0 ( 71618b...2eaeb5 )
by Krzysztof
03:06 queued 03:01
created

AbstractCollection::getItems()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace KGzocha\Searcher;
4
5
/**
6
 * @author Krzysztof Gzocha <[email protected]>
7
 */
8
abstract class AbstractCollection implements \Countable, \IteratorAggregate
9
{
10
    /**
11
     * @var array
12
     */
13
    private $items;
14
15
    /**
16
     * @param \Traversable|array $items
17
     */
18 75
    public function __construct($items = [])
19
    {
20 75
        $this->items = [];
21 75
        $this->isTraversable($items);
22 54
        $this->checkItems($items);
23
24 44
        $this->items = $items;
25 44
    }
26
27
    /**
28
     * @param object $item
29
     *
30
     * @return bool
31
     */
32
    abstract protected function isItemValid($item);
33
34
    /**
35
     * {@inheritdoc}
36
     */
37 10
    public function getIterator()
38
    {
39 10
        return new \ArrayIterator($this->items);
40
    }
41
42
    /**
43
     * {@inheritdoc}
44
     */
45 23
    public function count()
46
    {
47 23
        return count($this->items);
48
    }
49
50
    /**
51
     * @param mixed $item
52
     *
53
     * @return $this
54
     */
55 6
    protected function addItem($item)
56
    {
57 6
        $this->items[] = $item;
58
59 6
        return $this;
60
    }
61
62
    /**
63
     * @param string $name
64
     * @param mixed  $item
65
     *
66
     * @return $this
67
     */
68 11
    protected function addNamedItem($name, $item)
69
    {
70 11
        $this->items[$name] = $item;
71
72 11
        return $this;
73
    }
74
75
    /**
76
     * @return array
77
     */
78 27
    protected function getItems()
79
    {
80 27
        return $this->items;
81
    }
82
83
    /**
84
     * @param string $name
85
     *
86
     * @return mixed|null
87
     */
88 3
    protected function getNamedItem($name)
89
    {
90 3
        if (array_key_exists($name, $this->items)) {
91 2
            return $this->items[$name];
92
        }
93
94 1
        return null;
95
    }
96
97
    /**
98
     * @param mixed $items
99
     *
100
     * @throws \InvalidArgumentException
101
     */
102 75
    private function isTraversable($items)
103
    {
104 75
        if (is_array($items)) {
105 52
            return;
106
        }
107
108 25
        if ($items instanceof \Traversable) {
109 4
            return;
110
        }
111
112 21
        throw new \InvalidArgumentException(sprintf(
113 21
            'Argument passed to collection %s needs to be an array or traversable object',
114
            get_class($this)
115
        ));
116
    }
117
118
    /**
119
     * @param array|\Traversable $items
120
     *
121
     * @throws \InvalidArgumentException
122
     */
123 54
    private function checkItems($items)
124
    {
125 54
        foreach ($items as $item) {
126 40
            if ($this->isItemValid($item)) {
127 30
                continue;
128
            }
129
130 11
            throw new \InvalidArgumentException(sprintf(
131 11
                'At least one item in collection "%s" is invalid.',
132
                get_class($this)
133
            ));
134
        }
135 44
    }
136
}
137