package Renderer; # a class w/common functionality in all "application" classes sub new { my ($class, $cgi) = @_; return bless { CGI => $cgi }, $class; } sub cgi { return shift->{CGI} } sub render { my ($self, $content) = @_; my $templateText = q{ Welcome }; my $template = HTML::Template->new_scalar_ref(\$templateText); $template->param(CONTENT => $content); print $self->cgi->header(-type => 'text/html'), $template->output; } package Welcome; use base 'Renderer'; sub GET { my $self = shift; $self->render(q{

Welcome. My name is Perl. What's your name?

}); } package NiceToMeetYou; use base 'Renderer'; sub POST { my $self = shift; my $name = $self->cgi->param('name'); # yes, it would be scrubbed in production code $self->render(qq{

Nice to meet you $name. Leaving already?

}); } package Goodbye; use base 'Renderer'; sub GET { my ($self, $name) = @_; $self->render("Goodbye, $name. It was nice visiting."); }