# depth-first traversal of a graph my ($visited_color); traversal dfs($precode, $postcode) from Node to Node do initialize: $visited_color++; Node.pre: return if $self->{color} == $visited_color; &$precode($self); $self->{color} = $visited_color; Node.post: &$postcode($self); endtraversal my ($n1,$n2, $n3); # construct a small example graph with a loop $n1 = new Node (neighbors => [(new Node), (new Node)]); $n2 = new Node (neighbors => [new Node (neighbors => [$n1])]); push @{$n2->{neighbors}}, $n2; # make a loop in the graph # traverse it $n2->dfs(sub { print "pre $_[0]\n" }, sub { print "post $_[0]\n" });