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',
);
}
####
HOME => main.cgi?mode=home
REPORTS => reports.cgi
LOGOUT => main.cgi?mode=logout
##
##
package My::Application::Reports;
use My::Application::Base;
our @ISA = qw( My::Application::Base );
sub setup
{
my $self = shift;
$self->runmodes([qw(
choose
display
)]);
}
sub choose
{
# Display some method of choosing reports, probably with some authorization
# checks in there
}
sub display
{
# Do the actual display of the report.
}