_clause = $clause; $this->_postClone = $postClone; return; } /** * Check whether an offset exists. * * @param string $offset Offset. * @return bool */ public function offsetExists($offset) { return false !== array_key_exists($offset, $this->_clauses); } /** * Get a clause. * * @param string $offset Offset. * @return \Hoa\Praspel\Model\Clause */ public function offsetGet($offset) { if (false === $this->offsetExists($offset)) { $clause = $this->getClause(); $this->_clauses[$offset] = clone $clause; $this->_mapping[] = &$this->_clauses[$offset]; $postClone = $this->getPostClone(); if (null !== $postClone) { $postClone($this->_clauses[$offset], $offset); } } return $this->_clauses[$offset]; } /** * Alias of $this->offsetGet($offset). * * @param string $identifier Identifier. * @return \Hoa\Praspel\Model\Clause */ public function get($offset) { return $this->offsetGet($offset); } /** * Get a clause from its position. * * @param string $position Position. * @return \Hoa\Praspel\Model\Clause */ public function getNth($position) { if (!isset($this->_mapping[$position])) { return null; } return $this->_mapping[$position]; } /** * Disabled. * * @return void * @throws \Hoa\Praspel\Exception\Model */ public function offsetSet($offset, $value) { throw new Praspel\Exception\Model('Operation denied.', 0); } /** * Disabled. * * @return void * @throws \Hoa\Praspel\Exception\Model */ public function offsetUnset($offset) { throw new Praspel\Exception\Model('Operation denied.', 1); } /** * Get reference clause. * * @return \Hoa\Praspel\Model\Clause */ protected function getClause() { return $this->_clause; } /** * Get post-clone function. * * @return \Closure */ protected function getPostClone() { return $this->_postClone; } /** * Iterate over all clauses. * * @return \Hoa\Iterator\Map */ public function getIterator() { return new Iterator\Map($this->_clauses); } /** * Count number of clauses. * * @return int */ public function count() { return count($this->_clauses); } /** * Accept a visitor. * * @param \Hoa\Visitor\Visit $visitor Visitor. * @param mixed &$handle Handle (reference). * @param mixed $eldnah Handle (no reference). * @return mixed */ public function accept( Visitor\Visit $visitor, &$handle = null, $eldnah = null ) { return $visitor->visit($this, $handle, $eldnah); } }