modperl-small_hints_building_modules_with_directives

This is part of The Pile, a partial archive of some open source mailing lists and newsgroups.



To: "modperl@apache.org" <modperl@perl.apache.org>
From: "Jay Lawrence" <Jay@Lawrence.Net>
Subject: FYI Small hints for modules using directives
Date: Sat, 16 Mar 2002 09:51:52 -0500

If anyone out there's building modules with directives you'll know 
that its a tricky business. I ran across two problems and related 
solutions. (Thanks for nudging me along for #1 Geoff - but #2 I solved 
 all by my lonesome!)
 
 FIRST HINT - Modules compirised of several files and make Apache 
 Directives:
 
  - Apache::ExtUtils is a bit more fussy than the regular ExtUtils 
    about paths for loading subfiles of a package.
 
  - Can't load main module to resolve function prototypes at 
    perl Makefile.PL
 
 I found I had to take the following approach. Imagine that I have a
sub module to Apache::Clean (see Listing 7.9 as a basis) called, say,
Apache::Clean::Exception. That means in my module's directory I would
have:
 
   Clean.pm
   Clean/Exception.pm
 
 In the module Clean.pm I would load the related Exception module:
 
   use Apache::Clean::Exception;
 
 In modules that I have written where it does not use Apache::ExtUtils
in Makefile.PL this is not a problem - so I know I'm not toally out to 
lunch! Turns out what is happening is that Apache::ExtUtils tries to 
 "use Apache::Clean" which ends up failing because the "use 
 Apache::Clean::Exception" therein fails. The INC path isn't tweaked 
 appropriately.
 
 I tried to structure my packages like:
 
   lib/Apache/Clean.pm
   lib/Apache/Clean/Exception.pm
 
 and
 
   Apache/Clean.pm
   Apache/Clean/Exception.pm
 
 They didn't work either. Hmmm. Odd. Well, I still want that module to 
 load at some point - so what do I do?
 
 Once the module is built and properly installed things go away - so my 
 module isn't really problem - that leaves Makefile.PL and friends. Ah 
 ha! Why not pre-load Apache::Clean::Exception (the problem in the 
 first place) from Makefile.PL?
 
 So put my files back to how I wanted them in the first place:
 
   Clean.pm
   Clean/Exception.pm
   Makefile.PL
 
 And inside of Makefile.PL I put:
 
 package Apache::Clean;
 
 require "Clean/Exception.pm";
# however that doesn't quite do the trick since
# it must show as Apache::Clean::Exception having been loaded
# this is just Clean::Exception - which is not the same
# - solution? Fiddle with %INC
 
 $INC{'Apache/Clean/Exception.pm'}=$INC{'Clean/Exception'};
 
 # Of course you could change your module's directory structure to
# feature Apache in the path to begin with.
 
 __END__
 Now things work nicely for me!
 
 
 ------------------
 SECOND HINT - Modules that use directives are testy about being tested
 
 If you reference one of these modules via PREREQ_PM or try some tests 
 outside of Apache (it IS possible after all) they will fail at the 
 bootstrap method.
 
 in your module (ie/ Clean.pm) change:
 
 PACKAGE__->bootstrap($VERSION);
 
 to
 
 PACKAGE__->bootstrap($VERSION) if $ENV{'mod_perl'};
 
 Voila - at least now you should have no complaints via MakeMaker 
 checking for PREREQ_PM and you can even do some tests - which no doubt 
 you've been anxious to write!!
 
===


the rest of The Pile (a partial mailing list archive)

doom@kzsu.stanford.edu