use strict; use warnings; use feature 'say'; package Foo { sub new { my $pkg = shift; return bless {}, $pkg } sub frob { my $self = shift; $self-> foo( \&cb ) } sub blurt { my $self = shift; $self-> foo( 'cb' ) } sub foo { my ( $self, $cb ) = @_; $self-> $cb } sub cb { my $self = shift; say ref $self, ' ', __PACKAGE__ } }; package Bar { our @ISA = ( 'Foo' ); sub cb { my $self = shift; say ref $self, ' ', __PACKAGE__ } }; my $foo = Foo-> new; my $bar = Bar-> new; $foo-> frob; $bar-> frob; $foo-> blurt; $bar-> blurt; #### Foo Foo Bar Foo Foo Foo Bar Bar #### sub setObjNum { my $self = shift; my $objnode = shift; my $objnum = shift; my $gennum = shift; $self->traverse(0, $objnode, \&_setObjNumCB, [$objnum, $gennum]); return; } #### $self->$func($objnode, $funcdata);