1<?php
2
3/** @file recursivefilteriterator.inc
4 * @ingroup SPL
5 * @brief class RecursiveFilterIterator
6 * @author  Marcus Boerger
7 * @date    2003 - 2009
8 *
9 * SPL - Standard PHP Library
10 */
11
12/** @ingroup SPL
13 * @brief   Iterator to filter recursive iterators
14 * @author  Marcus Boerger
15 * @version 1.0
16 * @since PHP 5.1
17 *
18 * Passes the RecursiveIterator interface to the inner Iterator and provides
19 * the same functionality as FilterIterator. This allows you to skip parents
20 * and all their childs before loading them all. You need to care about
21 * function getChildren() because it may not always suit your needs. The
22 * builtin behavior uses reflection to return a new instance of the exact same
23 * class it is called from. That is you extend RecursiveFilterIterator and
24 * getChildren() will create instance of that class. The problem is that doing
25 * this does not transport any state or control information of your accept()
26 * implementation to the new instance. To overcome this problem you might
27 * need to overwrite getChildren(), call this implementation and pass the
28 * control vaules manually.
29 */
30abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator
31{
32	/** @param $it the RecursiveIterator to filter
33	 */
34	function __construct(RecursiveIterator $it)
35	{
36		parent::__construct($it);
37	}
38
39	/** @return whether the current element has children
40	 */
41	function hasChildren()
42	{
43		return $this->getInnerIterator()->hasChildren();
44	}
45
46	/** @return an iterator for the current elements children
47	 *
48	 * @note the returned iterator will be of the same class as $this
49	 */
50	function getChildren()
51	{
52		if (empty($this->ref))
53		{
54			$this->ref = new ReflectionClass($this);
55		}
56		return $this->ref->newInstance($this->getInnerIterator()->getChildren());
57	}
58
59	private $ref;
60}
61
62?>