This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to CPAN-1.83_58
[perl5.git] / lib / autouse.pm
index 179c382..67c4e01 100644 (file)
@@ -3,7 +3,7 @@ package autouse;
 #use strict;           # debugging only
 use 5.003_90;          # ->can, for my $var
 
-$autouse::VERSION = '1.02';
+$autouse::VERSION = '1.05';
 
 $autouse::DEBUG ||= 0;
 
@@ -39,7 +39,7 @@ sub import {
 
        my $closure_import_func = $func;        # Full name
        my $closure_func = $func;               # Name inside package
-       my $index = index($func, '::');
+       my $index = rindex($func, '::');
        if ($index == -1) {
            $closure_import_func = "${callpkg}::$func";
        } else {
@@ -50,10 +50,10 @@ sub import {
 
        my $load_sub = sub {
            unless ($INC{$pm}) {
-               eval {require $pm};
-               die if $@;
+               require $pm;
                vet_import $module;
            }
+            no warnings 'redefine';
            *$closure_import_func = \&{"${module}::$closure_func"};
            print "autousing $module; "
                  ."imported $closure_func as $closure_import_func\n"
@@ -62,7 +62,8 @@ sub import {
        };
 
        if (defined $proto) {
-           *$closure_import_func = eval "sub ($proto) { &\$load_sub }";
+           *$closure_import_func = eval "sub ($proto) { goto &\$load_sub }"
+               || die;
        } else {
            *$closure_import_func = $load_sub;
        }
@@ -72,9 +73,10 @@ sub import {
 sub vet_import ($) {
     my $module = shift;
     if (my $import = $module->can('import')) {
-       croak "autoused module has unique import() method"
+       croak "autoused module $module has unique import() method"
            unless defined(&Exporter::import)
-                  && $import == \&Exporter::import;
+                  && ($import == \&Exporter::import ||
+                      $import == \&UNIVERSAL::import)
     }
 }
 
@@ -95,28 +97,40 @@ autouse - postpone load of modules until a function is used
 
 If the module C<Module> is already loaded, then the declaration
 
-  use autouse 'Module' => qw(func1 func2($;$) Module::func3);
+  use autouse 'Module' => qw(func1 func2($;$));
 
 is equivalent to
 
   use Module qw(func1 func2);
 
-if C<Module> defines func2() with prototype C<($;$)>, and func1() and
-func3() have no prototypes.  (At least if C<Module> uses C<Exporter>'s
-C<import>, otherwise it is a fatal error.)
+if C<Module> defines func2() with prototype C<($;$)>, and func1() has
+no prototypes.  (At least if C<Module> uses C<Exporter>'s C<import>,
+otherwise it is a fatal error.)
 
 If the module C<Module> is not loaded yet, then the above declaration
-declares functions func1() and func2() in the current package, and
-declares a function Module::func3().  When these functions are called,
-they load the package C<Module> if needed, and substitute themselves
-with the correct definitions.
+declares functions func1() and func2() in the current package.  When
+these functions are called, they load the package C<Module> if needed,
+and substitute themselves with the correct definitions.
+
+=begin _deprecated
+
+   use Module qw(Module::func3);
+
+will work and is the equivalent to:
+
+   use Module qw(func3);
+
+It is not a very useful feature and has been deprecated.
+
+=end _deprecated
+
 
 =head1 WARNING
 
 Using C<autouse> will move important steps of your program's execution
 from compile time to runtime.  This can
 
-=over
+=over 4
 
 =item *