From the manual:
You can also insert hooks into the import facility, by putting
directly Perl code into the @INC array. There are three
forms of hooks: subroutine references, array references and blessed
objects.
Subroutine references are the simplest case. When the inclusion
system walks through @INC and encounters a subroutine, this
subroutine gets called with two parameters, the first being a
reference to itself, and the second the name of the file to be
included (e.g. "Foo/Bar.pm"). The subroutine should return
undef or a filehandle, from which the file to include will be
read. If undef is returned, require will look at
the remaining elements of @INC.
If the hook is an array reference, its first element must be a subroutine
reference. This subroutine is called as above, but the first parameter is
the array reference. This enables to pass indirectly some arguments to
the subroutine.
In other words, you can write:
push @INC, \&my_sub;
sub my_sub {
my ($coderef, $filename) = @_; # $coderef is \&my_sub
...
}
or:
push @INC, [ \&my_sub, $x, $y, ... ];
sub my_sub {
my ($arrayref, $filename) = @_;
# Retrieve $x, $y, ...
my @parameters = @$arrayref[1..$#$arrayref];
...
}
If the hook is an object, it must provide an INC method,
that will be called as above, the first parameter being the object
itself. (Note that you must fully qualify the sub's name, as it is
always forced into package main.) Here is a typical code
layout:
# In Foo.pm
package Foo;
sub new { ... }
sub Foo::INC {
my ($self, $filename) = @_;
...
}
# In the main program
push @INC, new Foo(...);
Note that these hooks are also permitted to set the %INC entry
corresponding to the files they have loaded. See perlvar/%INC.
For a yet-more-powerful import facility, see use and
perlmod.
--
Mark Dominus
Perl Paraphernalia
|