=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)) ; } our %validate = ( non_negative => sub { $_[0] >= 0 }, integer => sub { 1 } ); sub validate { my $input = shift; my %arg = @_; for (@{$arg{as}}) { my $func = $validate{$_}; my $r = $func->($input); die "$_ validation failed" unless $r ; } return 1; } sub get { print "input? "; $_[0] = <>; } my $input; get($input) and validate($input, as => [qw(non_negative integer)]) and print factorial($input);