package Foo; sub new { bless {} => shift } sub baz { "Hello from Foo::baz" } package Bar; use base 'Foo'; sub baz { # baz is private ... my $caller = caller; croak "Can't call private method from $caller" if $caller ne __PACKAGE__; "Hello from Bar::baz (private)"; } sub call_baz { (shift)->baz } package main; Bar->new->baz; # BOOM! #### package Foo; sub new { bless {} => shift } sub baz { "Hello from Foo::baz" } package Bar; use base 'Foo'; my $baz = sub { # baz is private ... my $caller = caller; croak "Can't call private method from $caller" if $caller ne __PACKAGE__; "Hello from Bar::baz (private)"; }; sub call_baz { (shift)->$baz() } package main; Bar->new->baz; # no more BOOM!