—# ABSTRACT: Iterates through distribution prerequisites
package
Pinto::PrerequisiteWalker;
use
Moose;
#------------------------------------------------------------------------------
our
$VERSION
=
'0.0994_01'
;
# VERSION
#------------------------------------------------------------------------------
has
start
=> (
is
=>
'ro'
,
isa
=>
'Pinto::Schema::Result::Distribution'
,
required
=> 1,
);
has
callback
=> (
is
=>
'ro'
,
isa
=> CodeRef,
required
=> 1,
);
has
filters
=> (
is
=>
'ro'
,
isa
=> ArrayRef [CodeRef],
predicate
=>
'has_filters'
,
);
has
queue
=> (
isa
=> ArrayRef [
'Pinto::Schema::Result::Prerequisite'
],
traits
=> [
qw(Array)
],
handles
=> {
enqueue
=>
'push'
,
dequeue
=>
'shift'
},
default
=>
sub
{
return
[
$_
[0]->apply_filters(
$_
[0]->start->prerequisites ) ] },
init_arg
=>
undef
,
lazy
=> 1,
);
has
seen
=> (
is
=>
'ro'
,
isa
=> HashRef,
default
=>
sub
{
return
{
$_
[0]->start->
path
=> 1 } },
init_arg
=>
undef
,
lazy
=> 1,
);
#-----------------------------------------------------------------------------
sub
next
{
my
(
$self
) =
@_
;
my
$prereq
=
$self
->dequeue or
return
;
my
$dist
=
$self
->callback->(
$prereq
);
if
(
defined
$dist
) {
my
$path
=
$dist
->path;
my
@prereqs
=
$self
->apply_filters(
$dist
->prerequisites );
$self
->enqueue(
@prereqs
)
unless
$self
->seen->{
$path
};
$self
->seen->{
$path
} = 1;
}
return
$prereq
;
}
#------------------------------------------------------------------------------
sub
apply_filters {
my
(
$self
,
@prereqs
) =
@_
;
return
@prereqs
if
not
$self
->has_filters;
for
my
$filter
( @{
$self
->filters } ) {
@prereqs
=
grep
{ !
$filter
->(
$_
) }
@prereqs
;
}
return
@prereqs
;
}
#------------------------------------------------------------------------------
__PACKAGE__->meta->make_immutable;
#-------------------------------------------------------------------------------
1;
__END__
=pod
=encoding UTF-8
=for :stopwords Jeffrey Ryan Thalhammer BenRifkah Fowler Jakob Voss Karen Etheridge Michael
G. Bergsten-Buret Schwern Oleg Gashev Steffen Schwigon Tommy Stanton
Wolfgang Kinkeldei Yanick Boris Champoux brian d foy hesco popl Däppen Cory
G Watson David Steinbrunner Glenn
=head1 NAME
Pinto::PrerequisiteWalker - Iterates through distribution prerequisites
=head1 VERSION
version 0.0994_01
=head1 AUTHOR
Jeffrey Ryan Thalhammer <jeff@stratopan.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2013 by Jeffrey Ryan Thalhammer.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut