1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Routing\Matcher\Dumper;
13
14/**
15 * Collection of routes.
16 *
17 * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
18 *
19 * @internal
20 */
21class DumperCollection implements \IteratorAggregate
22{
23    /**
24     * @var DumperCollection|null
25     */
26    private $parent;
27
28    /**
29     * @var DumperCollection[]|DumperRoute[]
30     */
31    private $children = [];
32
33    /**
34     * @var array
35     */
36    private $attributes = [];
37
38    /**
39     * Returns the children routes and collections.
40     *
41     * @return self[]|DumperRoute[]
42     */
43    public function all()
44    {
45        return $this->children;
46    }
47
48    /**
49     * Adds a route or collection.
50     *
51     * @param DumperRoute|DumperCollection The route or collection
52     */
53    public function add($child)
54    {
55        if ($child instanceof self) {
56            $child->setParent($this);
57        }
58        $this->children[] = $child;
59    }
60
61    /**
62     * Sets children.
63     *
64     * @param array $children The children
65     */
66    public function setAll(array $children)
67    {
68        foreach ($children as $child) {
69            if ($child instanceof self) {
70                $child->setParent($this);
71            }
72        }
73        $this->children = $children;
74    }
75
76    /**
77     * Returns an iterator over the children.
78     *
79     * @return \Iterator|DumperCollection[]|DumperRoute[] The iterator
80     */
81    public function getIterator()
82    {
83        return new \ArrayIterator($this->children);
84    }
85
86    /**
87     * Returns the root of the collection.
88     *
89     * @return self The root collection
90     */
91    public function getRoot()
92    {
93        return (null !== $this->parent) ? $this->parent->getRoot() : $this;
94    }
95
96    /**
97     * Returns the parent collection.
98     *
99     * @return self|null The parent collection or null if the collection has no parent
100     */
101    protected function getParent()
102    {
103        return $this->parent;
104    }
105
106    /**
107     * Sets the parent collection.
108     */
109    protected function setParent(self $parent)
110    {
111        $this->parent = $parent;
112    }
113
114    /**
115     * Returns true if the attribute is defined.
116     *
117     * @param string $name The attribute name
118     *
119     * @return bool true if the attribute is defined, false otherwise
120     */
121    public function hasAttribute($name)
122    {
123        return \array_key_exists($name, $this->attributes);
124    }
125
126    /**
127     * Returns an attribute by name.
128     *
129     * @param string $name    The attribute name
130     * @param mixed  $default Default value is the attribute doesn't exist
131     *
132     * @return mixed The attribute value
133     */
134    public function getAttribute($name, $default = null)
135    {
136        return $this->hasAttribute($name) ? $this->attributes[$name] : $default;
137    }
138
139    /**
140     * Sets an attribute by name.
141     *
142     * @param string $name  The attribute name
143     * @param mixed  $value The attribute value
144     */
145    public function setAttribute($name, $value)
146    {
147        $this->attributes[$name] = $value;
148    }
149
150    /**
151     * Sets multiple attributes.
152     *
153     * @param array $attributes The attributes
154     */
155    public function setAttributes($attributes)
156    {
157        $this->attributes = $attributes;
158    }
159}
160