http://www.perlmonks.org?node_id=1009707


in reply to effects of ampersand and non ampersand when referencing a sub name

Using a coderef at all bypasses prototypes. (As does calling a sub as a method.)

If you need to check the number of arguments passed to a sub, do it in the sub! Prototypes are just to help the Perl parser parse argument lists more sanely.

sub execute { @_==3 or croak "execute() needs three arguments!!"; ...; }
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'