1<?php
2
3namespace Sabre\VObject;
4
5/**
6 * Base class for all nodes
7 *
8 * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/).
9 * @author Evert Pot (http://evertpot.com/)
10 * @license http://sabre.io/license/ Modified BSD License
11 */
12abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable {
13
14    /**
15     * The following constants are used by the validate() method.
16     */
17    const REPAIR = 1;
18
19    /**
20     * Turns the object back into a serialized blob.
21     *
22     * @return string
23     */
24    abstract function serialize();
25
26    /**
27     * Iterator override
28     *
29     * @var ElementList
30     */
31    protected $iterator = null;
32
33    /**
34     * A link to the parent node
35     *
36     * @var Node
37     */
38    public $parent = null;
39
40    /**
41     * Validates the node for correctness.
42     *
43     * The following options are supported:
44     *   - Node::REPAIR - If something is broken, and automatic repair may
45     *                    be attempted.
46     *
47     * An array is returned with warnings.
48     *
49     * Every item in the array has the following properties:
50     *    * level - (number between 1 and 3 with severity information)
51     *    * message - (human readable message)
52     *    * node - (reference to the offending node)
53     *
54     * @param int $options
55     * @return array
56     */
57    public function validate($options = 0) {
58
59        return array();
60
61    }
62
63    /* {{{ IteratorAggregator interface */
64
65    /**
66     * Returns the iterator for this object
67     *
68     * @return ElementList
69     */
70    public function getIterator() {
71
72        if (!is_null($this->iterator))
73            return $this->iterator;
74
75        return new ElementList(array($this));
76
77    }
78
79    /**
80     * Sets the overridden iterator
81     *
82     * Note that this is not actually part of the iterator interface
83     *
84     * @param ElementList $iterator
85     * @return void
86     */
87    public function setIterator(ElementList $iterator) {
88
89        $this->iterator = $iterator;
90
91    }
92
93    /* }}} */
94
95    /* {{{ Countable interface */
96
97    /**
98     * Returns the number of elements
99     *
100     * @return int
101     */
102    public function count() {
103
104        $it = $this->getIterator();
105        return $it->count();
106
107    }
108
109    /* }}} */
110
111    /* {{{ ArrayAccess Interface */
112
113
114    /**
115     * Checks if an item exists through ArrayAccess.
116     *
117     * This method just forwards the request to the inner iterator
118     *
119     * @param int $offset
120     * @return bool
121     */
122    public function offsetExists($offset) {
123
124        $iterator = $this->getIterator();
125        return $iterator->offsetExists($offset);
126
127    }
128
129    /**
130     * Gets an item through ArrayAccess.
131     *
132     * This method just forwards the request to the inner iterator
133     *
134     * @param int $offset
135     * @return mixed
136     */
137    public function offsetGet($offset) {
138
139        $iterator = $this->getIterator();
140        return $iterator->offsetGet($offset);
141
142    }
143
144    /**
145     * Sets an item through ArrayAccess.
146     *
147     * This method just forwards the request to the inner iterator
148     *
149     * @param int $offset
150     * @param mixed $value
151     * @return void
152     */
153    public function offsetSet($offset,$value) {
154
155        $iterator = $this->getIterator();
156        $iterator->offsetSet($offset,$value);
157
158    // @codeCoverageIgnoreStart
159    //
160    // This method always throws an exception, so we ignore the closing
161    // brace
162    }
163    // @codeCoverageIgnoreEnd
164
165    /**
166     * Sets an item through ArrayAccess.
167     *
168     * This method just forwards the request to the inner iterator
169     *
170     * @param int $offset
171     * @return void
172     */
173    public function offsetUnset($offset) {
174
175        $iterator = $this->getIterator();
176        $iterator->offsetUnset($offset);
177
178    // @codeCoverageIgnoreStart
179    //
180    // This method always throws an exception, so we ignore the closing
181    // brace
182    }
183    // @codeCoverageIgnoreEnd
184
185    /* }}} */
186
187}
188