use strict; use warnings; use Scalar::Util qw(reftype); sub make_check_closure { my $check = shift; my $name = shift; my $func; $func = sub { my $h = shift; my $ref = reftype($h); if (! $ref) { ok($check->($h), "Assert value is $name"); } elsif ($ref eq 'HASH') { # Hash while (my($key, $value) = each %$h) { ok($check->($key), "Assert key is $name"); if (ref($value)) { $func->($value); } else { ok($check->($value), "Assert value is $name"); } } } elsif ($ref eq 'ARRAY') { # Array foreach (@$h) { if (ref($_)) { $func->($_); } else { ok($check->($_), "Assert value is $name"); } } } elsif ($ref eq 'SCALAR') { ok($check->($$h), "Assert value is $name"); } }; return $func; } 1;