I was hoping for something like this:
use strict;
use warnings;
use Type::Tiny;
my $Is_A_Duck = "Type::Tiny"->new(
name => "DuckCheck",
constraint => sub { $_->{speech} eq "QUACK" and $_->{walk} eq "WADD
+LE" },
message => sub { "$_->{name} is not a duck!" },
);
my @candidates = (
{name=>"Daffy", speech=> "QUACK", walk=> "WADDLE"},
{name=>"Daisy", speech=> "QUACK", walk=> "WADDLE"},
{name=>"Donald", speech=> "Bizarre", walk=> "WADDLE"},
{name=>"Platypus",speech=>"QUACK", walk=> "SHUFFLE"},
);
for my $c (@candidates){
if (my $msg= $Is_A_Duck->validate($c)){
print "$_\n" for @{ $Is_A_Duck->validate_explain($c, $c->{name})
+};
}else{
print "$c->{name} is a Duck!\n";
}
}
print "Exiting...\n";
This outputs:
>perl typetest.pl
Daffy is a Duck!
Daisy is a Duck!
Donald is not a duck! (in Donald)
"DuckCheck" is defined as: sub { $_->{'walk'} eq 'WADDLE' if $_->{'spe
+ech'} eq 'QUACK'; }
Platypus is not a duck! (in Platypus)
"DuckCheck" is defined as: sub { $_->{'walk'} eq 'WADDLE' if $_->{'spe
+ech'} eq 'QUACK'; }
Exiting...
"From there to here, from here to there, funny things are everywhere." -- Dr. Seuss
|