Algorithm-Dependency-Objects
view release on metacpan or search on metacpan
lib/Algorithm/Dependency/Objects/Ordered.pm view on Meta::CPAN
sub schedule_all {
my ( $self, @args ) = @_;
$self->_order($self->SUPER::schedule_all(@args));
}
sub _order {
my ( $self, @queue ) = @_;
my $selected = Set::Object->new( $self->selected->members );
my $error_marker;
my @schedule;
my %dep_set;
while (@queue){
my $obj = shift @queue;
if ( defined($error_marker) and refaddr($error_marker) == refaddr($obj) ) {
$self->circular_dep($obj, @queue);
}
my $dep_set = $dep_set{refaddr $obj} ||= Set::Object->new( $self->get_deps($obj) );
unless ( $selected->superset($dep_set) ) {
# we have some missing deps
# put the object back in the queue
push @queue, $obj;
# if we encounter it again without any change
# then a circular dependency is detected
$error_marker = $obj unless defined $error_marker;
} else {
# the dependancies are a subset of the selected objects,
# so they are all resolved.
push @schedule, $obj;
# mark the object as selected
$selected->insert($obj);
# since something changed we can forget about the error marker
undef $error_marker;
}
}
# return the ordered list
@schedule;
}
sub circular_dep {
my ( $self, $obj, @queue ) = @_;
( run in 0.705 second using v1.01-cache-2.11-cpan-65fba6d93b7 )