home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl501m.zip / lib / AutoLoader.pm < prev    next >
Text File  |  1995-07-03  |  2KB  |  73 lines

  1. package AutoLoader;
  2. use Carp;
  3.  
  4. =head1 NAME
  5.  
  6. AutoLoader - load functions only on demand
  7.  
  8. =head1 SYNOPSIS
  9.  
  10.     package FOOBAR;
  11.     use Exporter;
  12.     use AutoLoader;
  13.     @ISA = (Exporter, AutoLoader);
  14.  
  15. =head1 DESCRIPTION
  16.  
  17. This module tells its users that functions in the FOOBAR package are to be
  18. autoloaded from F<auto/$AUTOLOAD.al>.  See L<perlsub/"Autoloading">.
  19.  
  20. =cut
  21.  
  22. AUTOLOAD {
  23.     my $name = "auto/$AUTOLOAD.al";
  24.     $name =~ s#::#/#g;
  25.     eval {require $name};
  26.     if ($@) {
  27.     # The load might just have failed because the filename was too
  28.     # long for some old SVR3 systems which treat long names as errors.
  29.     # If we can succesfully truncate a long name then it's worth a go.
  30.     # There is a slight risk that we could pick up the wrong file here
  31.     # but autosplit should have warned about that when splitting.
  32.     if ($name =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
  33.         eval {require $name};
  34.     }
  35.     elsif ($AUTOLOAD =~ /::DESTROY$/) {
  36.         eval "sub $AUTOLOAD {}";
  37.     }
  38.     if ($@){
  39.         $@ =~ s/ at .*\n//;
  40.         croak $@;
  41.     }
  42.     }
  43.     goto &$AUTOLOAD;
  44. }
  45.                             
  46. sub import {
  47.     my ($callclass, $callfile, $callline,$path,$callpack) = caller(0);
  48.     ($callpack = $callclass) =~ s#::#/#;
  49.     # Try to find the autosplit index file.  Eg., if the call package
  50.     # is POSIX, then $INC{POSIX.pm} is something like
  51.     # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
  52.     # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
  53.     #
  54.     # However, if @INC is a relative path, this might not work.  If,
  55.     # for example, @INC = ('lib'), then
  56.     # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
  57.     # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
  58.     #
  59.     if (defined($path = $INC{$callpack . '.pm'})) {
  60.     # Try absolute path name.
  61.     $path =~ s#^(.*)$callpack\.pm$#$1auto/$callpack/autosplit.ix#;
  62.     eval { require $path; };
  63.     # If that failed, try relative path with normal @INC searching.
  64.     if ($@) {
  65.         $path ="auto/$callpack/autosplit.ix";
  66.         eval { require $path; };
  67.     }
  68.     carp $@ if ($@);  
  69.     } 
  70. }
  71.  
  72. 1;
  73.