You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by "Philippe M. Chiasson" <go...@ectoplasm.org> on 2009/01/08 06:31:38 UTC

Re: Apache::Reload - ModPerl::Util::unload_package under perl 5.10 use base directive malfunction


On 26/12/08 20:39, David Ihnen wrote:
> 1. Problem Description:
>
> While developing with CGI::Application and utilizing Apache::Reload, we
> encountered an issue where our modules were not being succesfully
> reinitialized on reload.  It was traced down to @ISA not containing the
> proper values after a 'use base' directive, but only on automatic
> reload, and freshly on perl 5.10, not our previous version of perl 5.8.8!
>
> I determined that when ModPerl::Util::unload_package is used to unload a
> package, when it is then re-required in perl 5.10, 'use base' directives
> don't function as expected.
>
> I recreated the problem with this simple use case.  It happens when a
> sub-module (required by something else) is unloaded then re-required.  I
> included the workaround using the push @ISA method to contrast working
> with not working.
>
> This is the output when the program below is run.
>
> $ perl t.pl
> X
> X
> V
> Not a CODE reference at t.pl line 14.
>
> Where did the inheritance go after the require of v?  Is this a bug in
> the do-file functionality utilized by require?  Did
> ModPerl::Util::unload_package not do something it was supposed to?  Is
> there a subtle interaction between 5.10 and ModPerl::Util?
>
> I was initially going to submit this to the perl bug database, but
> realized that the unload_package function was a ModPerl functionality,
> so this is my first place to go.   Five files to test with itemized
> below.  As you can see, I can recreate it without utilizing the mod_perl
> environment specifically.
>
> --- begin t.pl ---
> #!/usr/bin/perl
> use ModPerl::Util;
> # Using push @ISA
> require w;
> w->x();
> ModPerl::Util::unload_package('w');
> require w;
> w->x();
> # Using use base
> require u;
> u->v();
> ModPerl::Util::unload_package('v');
> require u;

This is strange, as you are unloading 'v' and reloading 'u', probably not
what was intended.

-- 
Philippe M. Chiasson     GPG: F9BFE0C2480E7680 1AE53631CB32A107 88C3A5A5
http://gozer.ectoplasm.org/       m/gozer\@(apache|cpan|ectoplasm)\.org/