I actually agree it is sort of JAPHish - that's why I posted it as a question here. I went through thinking about a dispatch table exactly the way you proposed, as I already explained in my reply to chromatic, but it has the same problem as the switch-construct: adding an "action handler" requires maintaining the dispatch table. I could have put the handlers as anonymous subs right into the dispatch table, but then I have to define them before the body of the main program and they're very long. (The biggest one is 2.5 pages of straight-through code without any loops.)
I sort of like your eval proposition, though the idea of circumventing strict in whichever fashion irks me. :-)
Thinking about it some more I think the sole reason it turns JAPHish is the role I have given to new() - that's the single thing I would point out as contrived in retrospect. I wonder if it's possible (and what you'd think) of doing something along the following lines:
#!/usr/bin/perl
use warnings;
use strict;
print "\nfoo script\n\n";
my $action = shift(@ARGV);
die "Usage here\n" unless $action;
my $handler = can main "_$action";
die "Unknown action '$action'\n\nUsage here\n" unless ref $handler;
my %params;
GetOptions(\%params, qw(various options here));
# do more stuff with %params here
$handler->(\%params);
exit;
######################################################################
+##
######################################################################
+##
use Getopt::Long;
# use Other::Modules::Here;
# .. etc ..