Acme-AutoLoad
view release on metacpan or search on metacpan
lib/Acme/AutoLoad.pm view on Meta::CPAN
package Acme::AutoLoad;
use strict;
use warnings;
use base qw(Exporter);
our $VERSION = '0.09';
our $last_fetched = "";
our $lib = "lib";
our $hook = \&inc;
sub ignore {}
sub import {
warn "DEBUG: Congratulations! Acme::AutoLoad has been loaded.\n" if $ENV{AUTOLOAD_DEBUG};
$lib = $ENV{AUTOLOAD_LIB} if $ENV{AUTOLOAD_LIB};
if ($lib =~ m{^[^/]}) {
eval {
require Cwd;
$lib = Cwd::abs_path($lib);
};
}
push @INC, $lib, $hook if $hook;
$hook = undef;
return \&ignore;
}
sub mkbase {
my $path = shift;
if ($path =~ s{/+[^/]*$ }{}x) {
return 1 if -d $path;
}
die "$path: Not a directory\n" if lstat $path;
if (mkbase($path)) {
warn "DEBUG: mkbase: Creating [$path] ...\n" if $ENV{AUTOLOAD_DEBUG};
return mkdir $path, 0755;
}
return 0;
}
sub fetch {
my $url = shift;
my $recurse = shift || {};
$url = full($url) unless $url =~ m{^\w+://};
my $contents = get($url);
$last_fetched = $url;
if ($contents =~ m{The document has moved <a href="([^<>]+)">}) {
my $bounce = $1;
return $contents if ++$recurse->{$bounce} > 3;
return fetch($bounce, $recurse) if ++$recurse->{total} < 21;
}
return $contents;
}
# full
# Turn a relative URL into a full URL
sub full {
my $rel = shift;
if ($rel =~ m{http://} || $last_fetched !~ m{^(http://[^/]+)(/?.*)}) {
return $rel;
}
my $h = $1;
my $p = $2;
if ($rel =~ m{^/}) {
return "$h$rel";
}
$p =~ s{[^/]*$ }{}x;
return "$h$p$rel";
}
# fly
# Create a stub module to load the real file on-the-fly if needed.
sub fly {
my $inc = shift;
my $url = shift;
my $write = shift;
warn "DEBUG: Creating stub for [$inc] in order to download [$url] later if needed.\n" if $ENV{AUTOLOAD_DEBUG};
my $contents = q{
my $url = q{$URL};
my $myself = $INC{"$inc"} || __FILE__;
warn "DEBUG: Downloading [$url] right now ...\n" if $ENV{AUTOLOAD_DEBUG};
my $m = Acme::AutoLoad::fetch($url);
if ($m =~ /package/) {
warn "DEBUG: Contents appear fine. Commencing BRICK OVER ...\n" if $ENV{AUTOLOAD_DEBUG};
( run in 1.337 second using v1.01-cache-2.11-cpan-d80b1682f3f )