On Mon, Jul 01, 2002 at 09:57:24AM -0500, Andy Lester wrote:
> I can do this:
> 
>     use PHP::Session 0.10;
> 
> to ensure a version number, but I can't do this:
> 
>     use_ok( 'PHP::Session', '0.10' );
> 
> because I get this error:
> 
> alester@flr4[~/tw/Dev]$ more Modules.t
> #!/usr/bin/perl -w
> 
> use strict;
> use Test::More tests => 1;
> 
> use_ok( 'PHP::Session', '0.10' );
> 
> 
> alester@flr4[~/tw/Dev]$ perl Modules.t
> 1..1
> not ok 1 - use PHP::Session;
> #     Failed test (Modules.t at line 6)
> #     Tried to use 'PHP::Session'.
> #     Error:  Can't locate object method "require_version" via package 
>"PHP::Session" (perhaps you forgot to load "PHP::Session"?) at 
>/usr/local/lib/perl5/5.6.1/Exporter/Heavy.pm line 105.
> # Looks like you failed 1 tests of 1.
> 
> ....
> 
> Before I go digging into a patch, is this something that we even want to
> allow?  I know I'd like to allow it, because I'd like to have one .t
> file that ensures that I have proper module prereqs for my entire source
> tree.

This is due to a quirk in the way "use Foo VERSION" is handled.

     use PHP::Session 0.10;

this is handled directly by Perl itself and uses UNIVERSAL::VERSION to get
$PHP::Session::VERSION.

     require PHP::Session;
     PHP::Session->import(0.10);

In this case, PHP::Session::import would be used, or an inherited method,
usually Exporter::import.  But PHP::Session doesn't inherit from Exporter,
yet we're winding up in there anyway.

The problem is, using PHP::Session is defining a UNIVERSAL::import somehow.

  DB<1> x defined &UNIVERSAL::import
0  ''
  DB<2> use PHP::Session

  DB<3> x defined &UNIVERSAL::import
0  1

PHP::Session uses UNIVERSAL::require which has to use UNIVERSAL.pm for an
obscure ambiguity warning [1].  UNIVERSAL.pm does

        require Exporter;
        *import = \&Exporter::import;

so all classes suddenly have an import method, but they never inherited from
Exporter!  So Bad Things happen.  The fact that UNIVERSAL.pm has an import
method is a historical accident.

It's only limited to situations when UNIVERSAL.pm is loaded.  Since "use
UNIVERSAL" is rather pointless, I'm going to change UNIVERSAL::require so it
no longer pre-loads UNIVERSAL.pm and tell the Email::Valid author to remove
his "use UNIVERSAL" line which is what started the problem in the first
place.


[1] To see this bug, download UNIVERSAL::require 0.02 and do:

$ cd UNIVERSAL-exports-0.02
$ perl -Ilib -MUNIVERSAL::require -MUNIVERSAL -wle 1
Ambiguous call resolved as CORE::require(), qualify as such or use & at 
/usr/share/perl/5.6.1/UNIVERSAL.pm line 6.


-- 
This sig file temporarily out of order.

Reply via email to