(caller)[3] eq 'fib' or ($nth !~ m{^\d+\z}a or @_) and die $fib_die_msg;
####
use strict; use warnings;
use 5.20.0;
use Attribute::Handlers;
package Uint {
require Tie::Scalar;
@Uint::ISA = qw(Tie::StdScalar);
sub STORE {
my ($p,$f,$l) = caller;
$_[1] !~ /^\d+\z/a
and die "not a positive integer in package $p file $f line $l, aborted";
${$_[0]} = $_[1];
};
}
sub UNIVERSAL::Uint : ATTR(SCALAR) { tie ${$_[2]}, 'Uint' }
sub fib {
my $nth : Uint = shift; # check for extra items in @_ missing
return $nth if $nth <= 1;
return fib( $nth - 1 ) + fib( $nth - 2 );
}
say fib @ARGV;
##
##
sub fib :prototype($) ($nth : Uint) {
# check for 1 == @_ already done
...
}