Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re^3: Overriding the built-in require function (@INC)

by blahblahblah (Priest)
on Feb 05, 2008 at 02:35 UTC ( #666178=note: print w/replies, xml ) Need Help??

in reply to Re^2: Overriding the built-in require function (@INC)
in thread Overriding the built-in require function

That's precisely the point: @INC is the list of paths that perl will search when it goes to load your module. If you put a code ref into @INC, perl will recognize it and execute it (rather than treating it as a path to search). By pushing your sub onto the front of @INC, you'll ensure that perl checks it first. By returning undef, you'll cause perl to keep looking until it finds the real path.

The very end of the doc that tye linked, require, describes this in detail. The same @INC method works for use.

  • Comment on Re^3: Overriding the built-in require function (@INC)

Replies are listed 'Best First'.
Re^4: Overriding the built-in require function (@INC)
by Tanktalus (Canon) on Feb 06, 2008 at 23:06 UTC

    I think the OP's example is misleading you somewhat. When /dev/urandom says "That would not serve my purposes, as any modules in question will not yet be loaded when the subref receives it." I take that to mean that what /dev/urandom will do with the repurposed require function is to actually manipulate the module the instant it gets loaded, before anyone else can do anything with it. The original post said that it illustrated the issue, but not the why of it. Perhaps a better illustration would be:

    *CORE::GLOBAL::require = sub { CORE::require($_[0]); if ($_[0] eq 'Net/') { $Net::Ping::TIMEOUT = 5000; # milliseconds } };
    I believe the OP means that they want to do something like that (I don't think that the code there would work even if everything else works - I don't think Net::Ping has a $TIMEOUT available). Perhaps check the $VERSION, or whatever. Modifying the @INC to include a code ref wouldn't allow for this - you merely return the code (via a filehandle), but at this point, it hasn't been compiled, so you can't interact with it yet.

    I suspect it'd be better to derive from Net::Ping, and change the code to require that module instead... but we really don't have enough details to be definitive about this.

      Modifying the @INC to include a code ref wouldn't allow for this - you merely return the code (via a filehandle), but at this point, it hasn't been compiled, so you can't interact with it yet.

      Oh, but you can :-). You just have to do a bit of work. I just recently described this in Re^3: Notification on module load, and redefinition of module methods.. Enjoy!


        I'm pretty sure that that node would constitute Cruel and Unusual Punishment for the perl interpreter ... nevermind any maintenance personnel that has to try to decipher it six months from now... :-)


        (Oh, and ++thanks for pointing out how to do that.)

        The OP was correct, my intention from the start was to manipulate the loaded module before anything else could use it.

        Anyway, I tried to do something similar, before I posted the initial question. Basically, in the @INC callback, it would remove itself from the @INC, use require to load the module in question, the put itself back in the @INC. The only problem was, that I had to somehow return a valid filehandle, otherwise, perl would continue down the @INC, and still load the module, even though I've loaded it beforehand, thus, overwriting my changes. The filehandle proved to be the most difficult task, since I had to return a filehandle to a valid file, yet, upon read, I'd have to just return '1;' as code, so as not to overwrite my changes. And I gave up at that point :)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://666178]
[LanX]: ...
[sierpinski]: test passed?
[sierpinski]: It's really weird seeing that I have 20 votes now.. I've been at 18 for so long
[LanX]: yes, test passed :)
[sierpinski]: woo hoo! you can go home for the day now
[Eily]: does this mean you'll give up the random prefix solution LanX?

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (8)
As of 2017-03-28 12:56 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (331 votes). Check out past polls.