Here's a little bit of madness I cooked up for using named arguments natively in perl5:
use strict; use warnings;
use PadWalker 'peek_sub'; use List::Util 'first';
## Map named arguments to variables of those names. sub getargs { my %args = do { package DB; () = caller 1; @DB::args }; my $vals = peek_sub \&{(caller 1)[3]}; my %res = map { $_ => $args{substr($_, 1)} } grep exists $args{substr($_, 1)}, keys %$vals; my %map = map { my $orig_arg = \$_; my($ref_name) = first { $orig_arg == $vals->{$_} } keys %$vals; $ref_name => $orig_arg; } @_;
${ $map{$_} } = $res{$_} for keys %res;
return \%res; }
## Basic test of getargs(); sub foo { getargs my($this, $that, $theother); print "this is: $this\nthat is: $that\nand the other is: $theother\n"; }
## Have these pairs mapped to variables of the same name. foo this => "an argument", that => "used to refer to things", theother => "is something else altogether";
this is: an argument that is: used to refer to things and the other is: is something else altogether
I don’t think it’s at all crazy or mad. Good job! Looking forward to the module.