sub _private_sub { die "_private_sub is private!" unless caller eq __PACKAGE__; # private stuff # } #### sub PROTECTED { my $self = shift; my @caller = caller(1); $caller[3] =~ m{(.*)::(.*)$}; my ($pack, $sub) = ($1,$2); local $Carp::CarpLevel += 1; confess "method '$sub' is protected by '$pack'" unless ($caller[0]->can($sub)); return $self; } #### use base 'BaseClass'; # some stuff # sub _protected_sub { my $self = shift->PROTECTED; print "This is a protected sub!"; } #### method 'test2' is protected by 'LocalTest' at LocalTest.pm line 12 LocalTest::test2('LocalTest2=HASH(0x18633a4)') called at test.pl line 15 main::test() called at test.pl line 20