sub is_string { return sub { return $_[0] ne ""; }; } sub is_number { return sub { return $_[0] =~ m{^\d+$}; }; } sub is_range($$) { (my $l, my $u) = @_; return sub { return $_[0] =~ m{^\d+$} && $_[0] >= $l && $_[0] <= $u; }; } sub is_in_list($) { my $l = shift; return sub { return (grep { $_[0] eq $_ } @{$l}) != 0; }; } sub is_email { return sub { return $_[0] =~ m{^[-.+a-z0-9]+\@[-.+a-z0-9]+$}i; }; } sub is_required { my $t = shift; return sub { defined $_[0] and &{$t}($_[0]); }; } sub is_optional { my $t = shift; return sub { return defined $_[0] ? &{$t}($_[0]) : 1; }; } sub is_equal { my $v = shift; return sub { $_[0] eq $v ? 1 : 0; } }