protected function traverseNode(Node $node)
{
foreach ($node->getSubNodeNames() as $name) {
$subNode =& $node->{$name};
if (is_array($subNode)) {
$subNode = $this->traverseArray($subNode);
} elseif ($subNode instanceof Node) {
$traverseChildren = true;
foreach ($this->visitors as $visitor) {
$return = $visitor->enterNode($subNode);
if (self::DONT_TRAVERSE_CHILDREN === $return) {
$traverseChildren = false;
} else {
if (null !== $return) {
$subNode = $return;
}
}
}
if ($traverseChildren) {
$subNode = $this->traverseNode($subNode);
}
foreach ($this->visitors as $visitor) {
if (null !== ($return = $visitor->leaveNode($subNode))) {
if (is_array($return)) {
throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array');
}
$subNode = $return;
}
}
}
}
return $node;
}