public function traverseExpressions(callable $callback)
{
$visitor = function ($expression) use(&$visitor, $callback) {
if (is_array($expression)) {
foreach ($expression as $e) {
$visitor($e);
}
return null;
}
if ($expression instanceof ExpressionInterface) {
$expression->traverse($visitor);
if (!$expression instanceof self) {
$callback($expression);
}
}
};
return $this->traverse($visitor);
}