use strict; use warnings; use Type::Tiny; my $Is_A_Duck = "Type::Tiny"->new( name => "DuckCheck", constraint => sub { $_->{speech} eq "QUACK" and $_->{walk} eq "WADDLE" }, 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"; #### >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 $_->{'speech'} eq 'QUACK'; } Platypus is not a duck! (in Platypus) "DuckCheck" is defined as: sub { $_->{'walk'} eq 'WADDLE' if $_->{'speech'} eq 'QUACK'; } Exiting...