[DOC PATCH] The coderef-in-@INC feature
Rafael Garcia-Suarez [Fri, 24 Aug 2001 23:34:13 +0000 (01:34 +0200)]
Message-Id:  <20010824233413.A1285@rafael>

p4raw-id: //depot/perl@11743

pod/perlfunc.pod
pod/perlvar.pod

index 56937f4..b4c3711 100644 (file)
@@ -3808,6 +3808,57 @@ will complain about not finding "F<Foo::Bar>" 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<Foo/Bar.pm>").  The
+subroutine should return C<undef> or a filehandle, from which the file to
+include will be read.  If C<undef> is returned, C<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
+C<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(...);
+
 For a yet-more-powerful import facility, see L</use> and L<perlmod>.
 
 =item reset EXPR
index 3f4c2f5..cdbd53f 100644 (file)
@@ -1062,6 +1062,10 @@ loaded also:
     use lib '/mypath/libdir/';
     use SomeMod;
 
+You can also insert hooks into the file inclusion system by putting Perl
+code directly into @INC.  Those hooks may be subroutine references, array
+references or blessed objects.  See L<perlfunc/require> for details.
+
 =item @_
 
 Within a subroutine the array @_ contains the parameters passed to that