This is in response to LTJake's examples of setting up a generic base controller with Catalyst
Here's what the same thing would look like using CGI::Application.
# Normally one CGI::App dispatch table is used for
# an entire application, not just one module. 
use CGI::Application::Dispatch;
CGI::Application::Dispatch->dispatch( 
prefix  => 'MyApp::Controller::Admin::Account',
    table => [
        'admin/account/:id/:rm'  => {},
        'admin/account/:rm'      => {},
        ''                       => {},
    ]
);
package MyApp::Controller::Admin::Account;
use base 'CGI::Application';
use CGI::Application::Plugin::AutoRunmode;
use strict;
use warnings;
# default  for /admin/account/
sub list     : StartRunmode { die "index of accounts" }
# methods on /admin/account/$rm
sub create   : Runmode { die "create an account" }
# methods on /admin/account/$id/[$rm]
sub instance : Runmode { # do something with $self->param('id') }
sub view     : Runmode { die "view account" }
sub update   : Runmode { die "update account" }
1;
The amount of code needed in both cases is comparable, but there are two
important philosophical differences here: