Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

package magic or am I missing something?

by vladb (Vicar)
on Jun 18, 2002 at 19:40 UTC ( [id://175474]=perlquestion: print w/replies, xml ) Need Help??

vladb has asked for the wisdom of the Perl Monks concerning the following question:

As the saying goes, "Forever live, forever learn." (I'm not entirely sure if the wording is right, though ;). Even having reached the level of saint, doesn't imply that one is a trully accomplished all-knowing Perl hacker. From time to time, things that I find hard to explain do happen.

Just today, I was coding away happily until I came upon an error message saying

Can't locate object method "try" via package FOO

(note: FOO is a hypothetical package.. ).

When I looked at the code, I noticed that I really wanted to have 'eval' instead of 'try' there. So, I made the correction and went on. However, immediately, I thought "Home come Perl was looking for method 'try' in package FOO?". Indeed, could anyone explain to me the 'magic' (if only there's anything 'magical' about it :) behind this? How is it possible to invoke a package method like in the code provided below?:
use strict; package FOO; sub new {}; sub try { print "Trying...?\n"; } package main; try { new FOO; };
And the output, of course, is:
Trying...?
I appreciate your help ;).

_____________________
# Under Construction

Replies are listed 'Best First'.
Re: package magic or am I missing something?
by janx (Monk) on Jun 18, 2002 at 20:00 UTC
    That's a good one.

    It's a wonderful example of indirect object syntax. See The Bag'o'Tricks.
    Use B::Deparse shows what happens:
    Update: Rather

    perl -MO=Deparse
    shows what happens:
    sub FOO::new { package FOO; use strict 'refs'; } sub FOO::try { package FOO; use strict 'refs'; print "Trying...?\n"; } use strict 'refs'; do { 'FOO'->new }->try;

    As you see, the

    do { 'FOO'->new }
    gives you the object, which you can happily call a method on ;-)

    Kay

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://175474]
Approved by dws
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (6)
As of 2024-04-18 09:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found