Data-Checker
view release on metacpan or search on metacpan
lib/Data/Checker.pm view on Meta::CPAN
my $caller = ( caller() )[0];
TRY:
foreach my $name ("${type}",
"${type}::check",
"${caller}::${type}",
"${caller}::${type}::check",
"Data::Checker::${type}",
"Data::Checker::${type}::check",
) {
# Ignore the case where $name does not have '::' because that means
# we called it with the name of a function in the CALLER namespace
# (so it'll get handled by one of the "${caller}::" cases, or $type
# is a sub-namespace of Data::Checker.
next if ($name !~ /^(.*)::(.+)$/);
my($mod) = ($1);
$mod = "main" if (! defined $mod);
# Try loading the module (but not main:: or CALLER::
if ($mod ne 'main' &&
$mod ne $caller &&
! is_loaded($mod)) {
next TRY if (! eval "require $mod");
}
# Look for the function
no strict 'refs';
if (defined &{$name}) {
$func = \&{$name};
last TRY;
}
}
die "ERROR: no valid check function passed to Data::Checker::check\n"
if (! defined $func);
}
# Call parallel or serial check
if ($$self{'parallel'} != 1) {
return $self->_check_parallel(\%data,$wantlist,$func,$opts);
} else {
return $self->_check_serial(\%data,$wantlist,$func,$opts);
}
}
sub _check_parallel {
my($self,$data,$wantlist,$func,$opts) = @_;
my(%pass,%fail,%info,%warn);
my @ele = keys %$data;
my $max_proc = ($$self{'parallel'} > 1 ? $$self{'parallel'} : @ele);
my $manager = Parallel::ForkManager->new($max_proc);
$manager->run_on_finish
(
sub {
my($pid,$exit_code,$id,$signal,$core_dump,$funcdata) = @_;
my($ele,$err,$warn,$info) = @$funcdata;
if (defined($err) && @$err) {
$fail{$ele} = $err;
} else {
$pass{$ele} = $$data{$ele};
}
if (defined($warn) && @$warn) {
$warn{$ele} = $warn;
}
if (defined($info) && @$info) {
$info{$ele} = $info;
}
});
ELE:
foreach my $ele (sort keys %$data) {
$manager->start and next;
my($element,$err,$warn,$info) = &$func($self,$ele,$$data{$ele},$opts);
$manager->finish(0,[$element,$err,$warn,$info]);
}
$manager->wait_all_children();
if ($wantlist) {
my @pass = sort keys %pass;
return (\@pass,\%fail,\%warn,\%info);
} else {
return (\%pass,\%fail,\%warn,\%info);
}
}
sub _check_serial {
my($self,$data,$wantlist,$func,$opts) = @_;
my(%pass,%fail,%info,%warn);
ELE:
foreach my $ele (sort keys %{ $data }) {
my($element,$err,$warn,$info) = &$func($self,$ele,$$data{$ele},$opts);
if (defined($err) && @$err) {
$fail{$ele} = $err;
} else {
$pass{$ele} = $$data{$ele};
}
if (defined($warn) && @$warn) {
$warn{$ele} = $warn;
}
if (defined($info) && @$info) {
$info{$ele} = $info;
}
}
if ($wantlist) {
my @pass = sort keys %pass;
return (\@pass,\%fail,\%warn,\%info);
} else {
( run in 0.612 second using v1.01-cache-2.11-cpan-995e09ba956 )