# Dispatcher
my %action = (
'search' => \&controller_search,
'view' => \&controller_view,
'save' => post_only(\&controller_edit),
'delete' => post_only(\&controller_delete),
'index' => \&controller_index,
);
if(exists $action{$q->param('do')}){
$action{$q->param('do')}->();
}else{
$action{'index'}->();
}
exit;Quickie older-style perl alternative structure where I use AUTOLOAD to figure out the exists/can situation:
use strict;
use warnings;
package Controller;
sub search {...}
sub view {...}
sub save {...}
sub delete {...}
sub AUTOLOAD {
# Do index stuff
}
...
package main;
...
my $method = $q->param('do');
Controller->$method;In your example not so much, but if the params to that call were also under the user's control. Say IO::File was loaded and I went to 'do=IO::File::open', I might be able to read/write files.
(running commands was not the best example, i've gotta admit)
Thanks for the feedback!
If I put all those functions into a class and then called $class_object->can($method), I get the same effect, only without the crazy hash. Perl has built-in dispatching.
I can add new methods to my perl classes at any time. Better yet, if I do it all with Class::MOP (and/or Moose), I can make it cleaner, since then I can choose to add methods to the object vs the whole class. In addition, my "dispatch tables" get the potential benefits of inheritance, roles, and other abstraction tools.
It might be a good starting exercise in rolling your own dispatch tables, but you would probably get a lot more out of reading Art of the Metaobject Protocol and trying to implement a good class system (aka reimplement Moose).
[1] http://search.cpan.org/dist/Moose/lib/Moose/Util/TypeConstra...
I'm really not sure what the difference between "scripting" and "programming" is ... could you point me at a rant on the topic?
nothing wrong with helping others up onto the shoulders of giants though...