package NewObj; sub new { return bless {},$_[0] }; package Foo; our @ISA=qw(NewObj); sub call_bar { my ($self,$bar)=@_; $bar->who_called; } package Bar; use strict; use warnings; use overload; #VITAL! our @ISA=qw(NewObj); sub who_called { my ($self)=@_; package DB; unless (my (undef,undef,undef,$sub)=caller(1)) { print "Called from main\n"; } else { print "Called from $sub\n"; if (ref($DB::args[0]) and overload::StrVal($DB::args[0])=~/=/) { print "\tWhich is a method that was invoked on ".overload::StrVal($DB::args[0])."\n"; } else { print "@DB::args"; } } } package main; my $obj1=Foo->new(); my $obj2=Bar->new(); print "OBJ1 (Foo) : ".overload::StrVal($obj1)."\n" $obj1->call_bar($obj2);