Sure. I'll post a condensation of what I'm working on right now. The plan is this - you have a main C::A, where you handle logging in, the home page, and logging out. You also have a C::A that handles how reporting works. Remember - some of your users might not have the authority to run reports, so it's easier to just disallow the whole C::A than it is to disallow certain run-modes.
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::Templat
+e 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',
);
}
Ok, so far so good. But, we don't have another C::A yet. I personally do my navigation through some header that I've TMPL_INCLUDE'd into all the relevant templates. (All of them, except login and logout.) The header basically has
HOME => main.cgi?mode=home
REPORTS => reports.cgi
LOGOUT => main.cgi?mode=logout
But, you wanted to see the other C::A. Here ya go:
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 auth
+orization
# checks in there
}
sub display
{
# Do the actual display of the report.
}
That's it. No handling of cookies, no handling of nothing. In fact, there's absolutely no way the cookies are NOT going to be handled. You can't forget to add it to the top. You can't forget to do standard processing. It's quite ... nice to be able to forget that you have it cause it just works.
------
We are the carpenters and bricklayers of the Information Age.
Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.