package MyStuff; use HTML::Template; use strict; use warnings; use CGI(); sub MyStuff::RunCGI { my $q = CGI->new; my( $headers, $body ) = MyStuff::DispatchCGI( $q ); print $headers, $body; } sub MyStuff::DispatchCGI { my( $q ) = @_; my $page = $q->page || 'default'; $page = 'ajax' if $q->request_method eq 'POST' and ...; return ThisPage( $q ) if $page eq 'thisone'; return ThatPage( $q ) if $page eq 'thatone'; return AjaxPage( $q ) if $page eq 'ajax'; } sub MyStuff::ThisPage { my( $q ) = @_; my $template = HTML::Template->new ...; $template->param( foo => scalar $q->param('foo') ); ... ... return $q->headers, $template->output; } sub MyStuff::AjaxPage { my( $q ) = @_; ... return $headers, $body; }