package My::Application::Base; use CGI::Application; our @ISA = qw( CGI::Application ); sub setup { # Do basic stuff, including run_modes everyone has, like 'redirect_login' } sub cgiapp_prerun { # Do $dbh and $user setup, including standard cookie handling } sub print { my $self = shift; my ($display_type, $template_name, @params) = @_; # This is my method. I have to potentially display in a number of formats. # I use different templating modules to do that, like PDF::Template or # Excel::Template, instead of just HTML::Template. This does that for me. } -------- package My::Application::Main; use My::Application::Base; our @ISA = qw( My::Application::Base ); sub setup { my $self = shift; $self->run_modes([qw( login validate home logout )]; } sub login { my $self = shift; my ($error) = @_; my %params; $params{ERROR} = $error if defined $error; $self->print( 'html', 'login', %params, ); } sub validate { my $self = shift; if (BAD_LOGIN) { return $self->login($SOME_ERROR); } # Set the cookie up, and possibly a session. Hand this off # to other modules / functions / objects $self->home; } sub home { my $self = shift; $self->print( 'html', 'home', ); } sub logout { my $self = shift; # Destroy the session and the cookie $self->print( 'html', 'logout', ); }