sub
new {
my
$class
=
shift
;
bless
{
backends
=> [] },
$class
;
}
sub
add {
my
(
$self
,
$resolver
) =
@_
;
push
@{
$self
->{backends} },
$resolver
;
$self
;
}
sub
resolve {
my
(
$self
,
$task
) =
@_
;
my
@error
;
for
my
$backend
(@{
$self
->{backends} }) {
my
$result
=
$backend
->resolve(
$task
);
next
unless
$result
;
my
$klass
=
ref
$backend
;
$klass
= $1
if
$klass
=~ /^App::cpm::Resolver::(.*)$/;
if
(
my
$error
=
$result
->{error}) {
push
@error
,
"$klass, $error"
;
}
else
{
$result
->{from} =
$klass
;
return
$result
;
}
}
push
@error
,
"no resolver backends"
if
!
@error
;
return
{
error
=>
join
(
"\n"
,
@error
) };
}
1;