It's a little hard to know what you mean, but if you want Object A to call a method on Object B and have B know that A was the object that called it, then you can just pass A as an argument. In other words, you define a consistent API where the @_ array always contains self and the calling object.
sub foo { my ($self, $caller, @targets) = @_; for my $obj ( @targets ) { $obj->bar($self, ... ); } } sub bar { my ($self, $caller, @args) = @_; ... }
The examples above don't do anything with $caller, but you can see how $self is included as an argument to the bar method call.
For a real-world example of this kind of thing, look at POE, which defines array-offset constants to pick out specific objects that are always passed as arguments. For example:
sub handle_event { my ($kernel, $heap, $parameter) = @_[KERNEL, HEAP, ARG0]; ...; }
It seems a little clunky at first glance, but when used consistently across all POE modules, it actually starts seeming elegant.
-xdg
Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.
In reply to Re: A caller() by any other name
by xdg
in thread A caller() by any other name
by Bloodnok
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |