$! = "$_ validation failed"; #### =head1 METHODS =head2 factorial INPUT : a non-negative integer, n OUTPUT: the factorial of n =cut sub factorial { my $number = shift; return 1 if $number <= 1; return ($number * factorial($number-1)) ; } sub validate_non_negative { $_[0] >= 0 } sub validate_integer { 1 } # how do you do this? sub validate { my $input = shift; my %arg = @_; for (@{$arg{as}}) { my $func = "validate_$_"; my $r = eval "$func($input)"; unless ($r) { $! = "$_ validation failed"; return 0; } } warn "validated $input"; return 1; } sub get { print "input? "; $_[0] = <>; } my $input; get($input) and (validate($input, as => [qw(non_negative integer)]) or die "error: $!") and print factorial($input);