children[] = new Node(); $node1->children[] = new Node(); $traverser->traverse([new Node(), $node1]); } } class Node { public $children = []; } class Traverser { public function traverse(array $nodes) { $this->traverseArray($nodes); } public function traverseArray(array $nodes): array { $doNodes = []; foreach ($nodes as &$node) { $node = $this->callback($node); $node = $this->traverseNode($node); $doNodes[] = $node; } return $doNodes; } public function callback(Node $class) : Node { $docblock = <<create($docblock); return $class; } private function traverseNode(Node $node) : Node { if ($node->children) { $this->traverseArray($node->children); } return $node; } }