class CallIterator implements Iterator { public void __construct(array|Traversable $iterator, string $method, scalar|array $method_arguments = array()); public void setMethod(string $method); public string getMethod(); public void setMethodArguments(scalar|array $arguments); public array getMethodArguments(); [ ... Interface method ... ] }
class CallIterator implements Iterator { protected $method; protected $iterator; public function __construct($iterator, $method) { $this->method = $method; if (!is_traversable($iterator)) { throw new InvalidArgumentException(); } if ($iterator instanceof IteratorAggregate) { $this->iterator = $iterator->getIterator(); } elseif ($iterator instanceof Iterator) { $this->iterator = $iterator; } else { $this->iterator = new ArrayIterator($iterator); } } public function next() { $this->iterator->next(); } public function key() { return $this->iterator->key(); } public function rewind() { $this->iterator->rewind(); } public function valid() { return $this->iterator->valid(); } public function current() { if (!is_callable(array($this->iterator->current(), $this->method))) { throw new RuntimeException(); } return $this->iterator->current()->{$this->method}(); } }