package Handler; use strict; use CGI; sub new { my $self = shift; return bless { _cgi => CGI->new() }, $self; } sub cgi { my $self = shift; my $caller = caller(); return ( $caller eq 'Handler' ? $self->{_cgi} : $self->SUPER::->{_cgi} ); } package HandlerMethods; use strict; use base qw/ Handler /; sub doSomething { my $self = shift; my $page = $self->cgi->param('foo'); return 1; }