collection);
if ($node instanceof AbstractNode) {
return call_user_func_array([$node, $method], $arguments);
} else {
throw new EmptyCollectionException('The collection does not contain any Nodes.');
}
}
/**
* Attempts to apply the magic get to the first node
* in the collection.
*
* @param mixed $key
* @return mixed
* @throws EmptyCollectionException
*/
public function __get($key)
{
$node = reset($this->collection);
if ($node instanceof AbstractNode) {
return $node->$key;
} else {
throw new EmptyCollectionException('The collection does not contain any Nodes.');
}
}
/**
* Applies the magic string method to the first node in
* the collection.
*
* @return string
* @throws EmptyCollectionException
*/
public function __toString(): string
{
$node = reset($this->collection);
if ($node instanceof AbstractNode) {
return (string)$node;
} else {
return '';
}
}
/**
* Returns the count of the collection.
*
* @return int
*/
public function count(): int
{
return count($this->collection);
}
/**
* Returns an iterator for the collection.
*
* @return ArrayIterator
*/
public function getIterator(): ArrayIterator
{
return new ArrayIterator($this->collection);
}
/**
* Set an attribute by the given offset
*
* @param mixed $offset
* @param mixed $value
*/
public function offsetSet($offset, $value): void
{
if (is_null($offset)) {
$this->collection[] = $value;
} else {
$this->collection[$offset] = $value;
}
}
/**
* Checks if an offset exists.
*
* @param mixed $offset
* @return bool
*/
public function offsetExists($offset): bool
{
return isset($this->collection[$offset]);
}
/**
* Unset a collection Node.
*
* @param mixed $offset
*/
public function offsetUnset($offset): void
{
unset($this->collection[$offset]);
}
/**
* Gets a node at the given offset, or null
*
* @param mixed $offset
* @return mixed
*/
public function offsetGet($offset)
{
return isset($this->collection[$offset]) ? $this->collection[$offset] : null;
}
/**
* Returns this collection as an array.
*
* @return array
*/
public function toArray(): array
{
return $this->collection;
}
/**
* Similar to jQuery "each" method. Calls the callback with each
* Node in this collection.
*
* @param callable $callback
*/
public function each(callable $callback)
{
foreach ($this->collection as $key => $value) {
$callback($value, $key);
}
}
}