Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Calls the caller's method

by anazawa (Scribe)
on Jul 10, 2012 at 15:33 UTC ( #980893=perlquestion: print w/replies, xml ) Need Help??
anazawa has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I'm working on the following situation:
# Foo.pm package Foo; use strict; use warnings; use Bar; sub foo { warn 'Foo::foo was called' } Bar->bar; 1;
A package Foo calls Bar's bar() method. Foo defines foo() method which prints a message to STDERR. On the other hand, Bar.pm looks as follows:
# Bar.pm package Bar; use strict; use warnings; sub bar { Foo->foo } 1;
Bar defines bar() method which calls Foo's foo() method. I executed Foo.pm and confirmed the script output 'Foo::foo was called':
$ ls Foo.pm Bar.pm $ perl Foo.pm Foo::foo was called

This result shows us that Bar can call Foo's foo() method without loading Foo.pm (I mean, without 'use Foo;') In other words, Bar can call the caller's method ( Foo::foo() ). If so, why is this possible? Is this one of well-known specifications? Which perldoc helps me understand this result?

Sincerely,
Ryo

Replies are listed 'Best First'.
Re: Calls the caller's method
by tobyink (Abbot) on Jul 10, 2012 at 16:16 UTC

    If you're calling a function as a method (i.e. with ->) or calling it using a fully-qualified name (e.g. Scalar::Util::blessed()), then you do not need to use the module in question - all that is important is that it's been loaded (i.e. use, require or do) somewhere in this process. (And your caller has always been at least partially loaded before you were.)

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
      Thank for your suggestion. I totally agree with you. I was blind to this issue :-)
Re: Calls the caller's method
by daxim (Chaplain) on Jul 10, 2012 at 15:56 UTC
    When sub Bar::bar executes, the package Foo is already loaded and the symbol Foo::foo is already installed (as subroutine).
      That makes sense. Foo::foo() is globalized, right? I remember 'our' declaration globalizes variables.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://980893]
Approved by kcott
help
Chatterbox?
[robby_dobby]: Likewise! I haven't seen a lot of people with HAs back where I come from, so I figured it might be the same around here too...
[robby_dobby]: Oh, shit -- I was replying to someone, but it wound up here. -_-
robby_dobby is still not used to PM's interface. /o\
[oiskuu]: War. War never changes.
[robby_dobby]: "My cat is a very good mouser" -- that's a great way to identify a Brit among a crowd :-)
thezip looks around to see no one else dancing to Piazzola...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (14)
As of 2017-11-17 19:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    In order to be able to say "I know Perl", you must have:













    Results (272 votes). Check out past polls.

    Notices?