ParentNodeTrait::addChildren()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 6
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace Nayjest\Tree;
4
5
use Nayjest\Collection\Extended\ObjectCollection;
6
use Traversable;
7
8
/**
9
 * Trait ParentNodeTrait.
10
 *
11
 * @implements ParentNodeInterface
12
 * @see ParentNodeInterface
13
 */
14
trait ParentNodeTrait
15
{
16
    /**
17
     * Collection of child nodes (objects implementing ChildNodeInterface)
18
     * @var NodeCollection
19
     */
20
    protected $collection;
21
22
    /**
23
     * Returns array containing default child nodes.
24
     *
25
     * Override this method if you need to implement parent node class that must contain certain children by default.
26
     *
27
     * @return ChildNodeInterface[]
28
     */
29
    protected function defaultChildren()
30
    {
31
        return [];
32
    }
33
34
    /**
35
     * Initializes collection of child nodes.
36
     * 
37
     * This method is called once when accessing collection first time
38
     * or constructing node with children passed to constructor argument.
39
     * 
40
     * @param array $items
41
     */
42
    protected function initializeCollection(array $items)
43
    {
44
        /* @var ParentNodeInterface|ParentNodeTrait $this */
45
        $this->collection = new NodeCollection(
46
            $this,
47
            $items
48
        );
49
    }
50
51
    /**
52
     * Returns collection of child nodes.
53
     *
54
     * @return \Nayjest\Collection\CollectionInterface|ChildNodeInterface[]
55
     */
56
    public function children()
57
    {
58
        if ($this->collection === null) {
59
            $this->initializeCollection($this->defaultChildren());
60
        }
61
62
        return $this->collection;
63
    }
64
65
    /**
66
     * Returns true if collection of child nodes is writable (open for modifications), returns false otherwise.
67
     * 
68
     * @return bool
69
     */
70
    final public function isWritable()
71
    {
72
        return $this->children()->isWritable();
73
    }
74
75
    /**
76
     * Returns collection containing all descendant nodes.
77
     * 
78
     * @return CollectionInterface|ObjectCollection|ChildNodeInterface[]
79
     */
80
    public function getChildrenRecursive()
81
    {
82
        $res = new ObjectCollection();
83
        foreach ($this->children() as $child) {
84
            $res->add($child);
85
            if ($child instanceof ParentNodeInterface) {
86
                $res->addMany($child->getChildrenRecursive());
87
            }
88
        }
89
90
        return $res;
91
    }
92
93
    /**
94
     * Clears collection of child nodes and attaches new children.
95
     * 
96
     * @param Traversable|ChildNodeInterface[] $children
97
     *
98
     * @return $this
99
     */
100
    public function setChildren($children)
101
    {
102
        $this->children()->set($children);
0 ignored issues
show
Bug introduced by
The method set() does not seem to exist on object<Nayjest\Collectio...adonlyObjectCollection>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
103
104
        return $this;
105
    }
106
107
    /**
108
     * Attaches child node.
109
     * 
110
     * @param ChildNodeInterface $item
111
     *
112
     * @return $this
113
     */
114
    public function addChild(ChildNodeInterface $item)
115
    {
116
        $this->children()->add($item);
0 ignored issues
show
Bug introduced by
The method add() does not seem to exist on object<Nayjest\Collectio...adonlyObjectCollection>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
117
118
        return $this;
119
    }
120
121
    /**
122
     * Attaches list of child nodes.
123
     * 
124
     * @param array|Traversable $children
125
     *
126
     * @return $this
127
     */
128
    public function addChildren($children)
129
    {
130
        $this->children()->addMany($children);
0 ignored issues
show
Bug introduced by
The method addMany() does not seem to exist on object<Nayjest\Collectio...adonlyObjectCollection>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
131
132
        return $this;
133
    }
134
}
135