package My::App; use strict; use warnings; use base qw(CGI::Application BLL::OtherPackage); sub setup { my $self = shift; $self->mode_param('section'); $self->start_mode('home'); $self->run_modes( 'here_sub' => 'here_sub', 'test_rm' => 'sub_in_other_file', ); } sub here_sub { my $self = shift; # no problems using self here } 1; ### Separate file package BLL::OtherPackage; use strict; use warnings; sub sub_in_other_file { my $self = shift; # $self would be what I expected if I didn't put this in # the 'use base' or @ISA for that matter. What an abuse. } 1;