sub visit_breadth_first { my ($node, $visitor) = @_; # Initial value: my @to_visit = ($node); # Loop as long as @to_visit isn't empty: while (@to_visit) { # Remove an element: my $current = shift(@to_visit); # Maybe add some elements: push(@to_visit, @{$current->children()}); &$visitor($current); } }