. * */ namespace OCA\Contacts; /** * Subclass this for PIM collections */ abstract class PIMCollectionAbstract extends PIMObjectAbstract implements Iterator, Countable, ArrayAccess { // Iterator properties protected $objects = array(); protected $counter = 0; /** * Returns a specific child node, referenced by its id * * This method must throw Sabre_DAV_Exception_NotFound if the node does not * exist. * * @param string $id * @return IPIMObject */ abstract function getChild($id); /** * Returns an array with all the child nodes * * @return IPIMObject[] */ abstract function getChildren($limit = null, $offset = null); /** * Checks if a child-node with the specified id exists * * @param string $id * @return bool */ function childExists($id); // Iterator methods public function rewind() { $this->counter = 0; } public function next() { $this->counter++; } public function valid() { return array_key_exists($this->counter, $this->objects); } public function current() { return $this->objects[$this->counter]; } /** Implementations can choose to return the current objects ID/UUID * to be able to iterate over the collection with ID => Object pairs: * foreach($collection as $id => $object) {} */ public function key() { return $this->counter; } // Countable method. /** * For implementations using a backend where fetching all object at once * would give too much overhead, they can maintain an internal count value * and fetch objects progressively. Simply watch the diffence between * $this->counter, the value of count($this->objects) and the internal * value, and fetch more objects when needed. */ public function count() { return count($this->objects); } // ArrayAccess methods public function offsetSet($offset, $value) { if (is_null($offset)) { $this->objects[] = $value; } else { $this->objects[$offset] = $value; } } public function offsetExists($offset) { return isset($this->objects[$offset]); } public function offsetUnset($offset) { unset($this->objects[$offset]); } public function offsetGet($offset) { return isset($this->objects[$offset]) ? $this->objects[$offset] : null; } // Magic property accessors // TODO: They should go in the implementations. public function __set($id, $value) { } public function __get($id) { } public function __isset($id) { } public function __unset($id) { } }