The answer to the trick question is that the subroutine name in package Sub::First is misspelled (missing a "t").
However, I think I would provide the Apache::Log object as a parameter to new() rather than twiddling with package vars to try to have it magically updated by Exporter. For example: package Sub::First; use strict; # simple constructor expects classname, log object sub new { my($class,$ap_log) = @_; return bless {apache_log=>$ap_log}, $class; } sub do_something { $self->{apache_log}->notice("this will work"); } package Sub::Second; use strict; # another simple constructor expects classname, log object sub new { my($class,$ap_log) = @_; return bless {apache_log=>$ap_log}, $class; } sub do_something_else { $self->{apache_log}->notice("this will work, too"); } package Site; use strict; use Sub::First; use Sub::Second; sub handler { my $r = shift; # test values for conditions my $some_case = 'true'; my $some_other_case = 'yes'; if ( $some_case eq 'true' ) { my $sub_first = Sub::First->new($r->log); $sub_first->do_something(); if ( $some_other_case eq 'yes' ) { my $sub_second = Sub::Second->new($r->log); $sub_first->do_something(); $sub_second->do_something_else(); } } } # End Example Regards, Tim Tompkins ---------------------------------------------- Programmer http://www.arttoday.com/ http://www.rebelartist.com/ ----------------------------------------------