X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlfunc.pod;h=b4c37112c7a6e336b068d81448330c902181edaa;hb=d54b56d55c935aeda35fad4725273ab2eb5a71a5;hp=56937f4ddfe97f3761e01c817850cac9941d12e8;hpb=e14e2dc8035bb82ccaf583f5f04cf14f72dcd147;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index 56937f4..b4c3711 100644 --- a/pod/perlfunc.pod +++ b/pod/perlfunc.pod @@ -3808,6 +3808,57 @@ will complain about not finding "F" there. In this case you can do: eval "require $class"; +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. "F"). The +subroutine should return C or a filehandle, from which the file to +include will be read. If C is returned, C 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 +C
.) 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(...); + For a yet-more-powerful import facility, see L and L. =item reset EXPR