sub rank_objects { my @objects = @_; my $n = 0; my @next_objects = grep {not $_->depends_on} @objects; my @current_objects; while (@next_objects and $n < @objects) { $n++; @current_objects = @next_objects; @next_objects = (); for my $object (@current_objects) { $object->set_rank($n); push @next_objects, $object->depended_on_by; } } my @circular = @next_objects, grep {not $_->rank} @objects; if (@circular) { # We have circular dependencies, report that somehow. # In production code I'd actually try to report one of # the cycles here. die "Circular dependencies found."; } }