Blame inc/Module/Install.pm

Packit 549706
#line 1
Packit 549706
package Module::Install;
Packit 549706
Packit 549706
# For any maintainers:
Packit 549706
# The load order for Module::Install is a bit magic.
Packit 549706
# It goes something like this...
Packit 549706
#
Packit 549706
# IF ( host has Module::Install installed, creating author mode ) {
Packit 549706
#     1. Makefile.PL calls "use inc::Module::Install"
Packit 549706
#     2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install
Packit 549706
#     3. The installed version of inc::Module::Install loads
Packit 549706
#     4. inc::Module::Install calls "require Module::Install"
Packit 549706
#     5. The ./inc/ version of Module::Install loads
Packit 549706
# } ELSE {
Packit 549706
#     1. Makefile.PL calls "use inc::Module::Install"
Packit 549706
#     2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install
Packit 549706
#     3. The ./inc/ version of Module::Install loads
Packit 549706
# }
Packit 549706
Packit 549706
use 5.005;
Packit 549706
use strict 'vars';
Packit 549706
Packit 549706
use vars qw{$VERSION $MAIN};
Packit 549706
BEGIN {
Packit 549706
	# All Module::Install core packages now require synchronised versions.
Packit 549706
	# This will be used to ensure we don't accidentally load old or
Packit 549706
	# different versions of modules.
Packit 549706
	# This is not enforced yet, but will be some time in the next few
Packit 549706
	# releases once we can make sure it won't clash with custom
Packit 549706
	# Module::Install extensions.
Packit 549706
	$VERSION = '0.91';
Packit 549706
Packit 549706
	# Storage for the pseudo-singleton
Packit 549706
	$MAIN    = undef;
Packit 549706
Packit 549706
	*inc::Module::Install::VERSION = *VERSION;
Packit 549706
	@inc::Module::Install::ISA     = __PACKAGE__;
Packit 549706
Packit 549706
}
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
# Whether or not inc::Module::Install is actually loaded, the
Packit 549706
# $INC{inc/Module/Install.pm} is what will still get set as long as
Packit 549706
# the caller loaded module this in the documented manner.
Packit 549706
# If not set, the caller may NOT have loaded the bundled version, and thus
Packit 549706
# they may not have a MI version that works with the Makefile.PL. This would
Packit 549706
# result in false errors or unexpected behaviour. And we don't want that.
Packit 549706
my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm';
Packit 549706
unless ( $INC{$file} ) { die <<"END_DIE" }
Packit 549706
Packit 549706
Please invoke ${\__PACKAGE__} with:
Packit 549706
Packit 549706
	use inc::${\__PACKAGE__};
Packit 549706
Packit 549706
not:
Packit 549706
Packit 549706
	use ${\__PACKAGE__};
Packit 549706
Packit 549706
END_DIE
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
# If the script that is loading Module::Install is from the future,
Packit 549706
# then make will detect this and cause it to re-run over and over
Packit 549706
# again. This is bad. Rather than taking action to touch it (which
Packit 549706
# is unreliable on some platforms and requires write permissions)
Packit 549706
# for now we should catch this and refuse to run.
Packit 549706
if ( -f $0 ) {
Packit 549706
	my $s = (stat($0))[9];
Packit 549706
Packit 549706
	# If the modification time is only slightly in the future,
Packit 549706
	# sleep briefly to remove the problem.
Packit 549706
	my $a = $s - time;
Packit 549706
	if ( $a > 0 and $a < 5 ) { sleep 5 }
Packit 549706
Packit 549706
	# Too far in the future, throw an error.
Packit 549706
	my $t = time;
Packit 549706
	if ( $s > $t ) { die <<"END_DIE" }
Packit 549706
Packit 549706
Your installer $0 has a modification time in the future ($s > $t).
Packit 549706
Packit 549706
This is known to create infinite loops in make.
Packit 549706
Packit 549706
Please correct this, then run $0 again.
Packit 549706
Packit 549706
END_DIE
Packit 549706
}
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
# Build.PL was formerly supported, but no longer is due to excessive
Packit 549706
# difficulty in implementing every single feature twice.
Packit 549706
if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" }
Packit 549706
Packit 549706
Module::Install no longer supports Build.PL.
Packit 549706
Packit 549706
It was impossible to maintain duel backends, and has been deprecated.
Packit 549706
Packit 549706
Please remove all Build.PL files and only use the Makefile.PL installer.
Packit 549706
Packit 549706
END_DIE
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
# To save some more typing in Module::Install installers, every...
Packit 549706
# use inc::Module::Install
Packit 549706
# ...also acts as an implicit use strict.
Packit 549706
$^H |= strict::bits(qw(refs subs vars));
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
use Cwd        ();
Packit 549706
use File::Find ();
Packit 549706
use File::Path ();
Packit 549706
use FindBin;
Packit 549706
Packit 549706
sub autoload {
Packit 549706
	my $self = shift;
Packit 549706
	my $who  = $self->_caller;
Packit 549706
	my $cwd  = Cwd::cwd();
Packit 549706
	my $sym  = "${who}::AUTOLOAD";
Packit 549706
	$sym->{$cwd} = sub {
Packit 549706
		my $pwd = Cwd::cwd();
Packit 549706
		if ( my $code = $sym->{$pwd} ) {
Packit 549706
			# Delegate back to parent dirs
Packit 549706
			goto &$code unless $cwd eq $pwd;
Packit 549706
		}
Packit 549706
		$$sym =~ /([^:]+)$/ or die "Cannot autoload $who - $sym";
Packit 549706
		my $method = $1;
Packit 549706
		if ( uc($method) eq $method ) {
Packit 549706
			# Do nothing
Packit 549706
			return;
Packit 549706
		} elsif ( $method =~ /^_/ and $self->can($method) ) {
Packit 549706
			# Dispatch to the root M:I class
Packit 549706
			return $self->$method(@_);
Packit 549706
		}
Packit 549706
Packit 549706
		# Dispatch to the appropriate plugin
Packit 549706
		unshift @_, ( $self, $1 );
Packit 549706
		goto &{$self->can('call')};
Packit 549706
	};
Packit 549706
}
Packit 549706
Packit 549706
sub import {
Packit 549706
	my $class = shift;
Packit 549706
	my $self  = $class->new(@_);
Packit 549706
	my $who   = $self->_caller;
Packit 549706
Packit 549706
	unless ( -f $self->{file} ) {
Packit 549706
		require "$self->{path}/$self->{dispatch}.pm";
Packit 549706
		File::Path::mkpath("$self->{prefix}/$self->{author}");
Packit 549706
		$self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self );
Packit 549706
		$self->{admin}->init;
Packit 549706
		@_ = ($class, _self => $self);
Packit 549706
		goto &{"$self->{name}::import"};
Packit 549706
	}
Packit 549706
Packit 549706
	*{"${who}::AUTOLOAD"} = $self->autoload;
Packit 549706
	$self->preload;
Packit 549706
Packit 549706
	# Unregister loader and worker packages so subdirs can use them again
Packit 549706
	delete $INC{"$self->{file}"};
Packit 549706
	delete $INC{"$self->{path}.pm"};
Packit 549706
Packit 549706
	# Save to the singleton
Packit 549706
	$MAIN = $self;
Packit 549706
Packit 549706
	return 1;
Packit 549706
}
Packit 549706
Packit 549706
sub preload {
Packit 549706
	my $self = shift;
Packit 549706
	unless ( $self->{extensions} ) {
Packit 549706
		$self->load_extensions(
Packit 549706
			"$self->{prefix}/$self->{path}", $self
Packit 549706
		);
Packit 549706
	}
Packit 549706
Packit 549706
	my @exts = @{$self->{extensions}};
Packit 549706
	unless ( @exts ) {
Packit 549706
		@exts = $self->{admin}->load_all_extensions;
Packit 549706
	}
Packit 549706
Packit 549706
	my %seen;
Packit 549706
	foreach my $obj ( @exts ) {
Packit 549706
		while (my ($method, $glob) = each %{ref($obj) . '::'}) {
Packit 549706
			next unless $obj->can($method);
Packit 549706
			next if $method =~ /^_/;
Packit 549706
			next if $method eq uc($method);
Packit 549706
			$seen{$method}++;
Packit 549706
		}
Packit 549706
	}
Packit 549706
Packit 549706
	my $who = $self->_caller;
Packit 549706
	foreach my $name ( sort keys %seen ) {
Packit 549706
		*{"${who}::$name"} = sub {
Packit 549706
			${"${who}::AUTOLOAD"} = "${who}::$name";
Packit 549706
			goto &{"${who}::AUTOLOAD"};
Packit 549706
		};
Packit 549706
	}
Packit 549706
}
Packit 549706
Packit 549706
sub new {
Packit 549706
	my ($class, %args) = @_;
Packit 549706
Packit 549706
	# ignore the prefix on extension modules built from top level.
Packit 549706
	my $base_path = Cwd::abs_path($FindBin::Bin);
Packit 549706
	unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) {
Packit 549706
		delete $args{prefix};
Packit 549706
	}
Packit 549706
Packit 549706
	return $args{_self} if $args{_self};
Packit 549706
Packit 549706
	$args{dispatch} ||= 'Admin';
Packit 549706
	$args{prefix}   ||= 'inc';
Packit 549706
	$args{author}   ||= ($^O eq 'VMS' ? '_author' : '.author');
Packit 549706
	$args{bundle}   ||= 'inc/BUNDLES';
Packit 549706
	$args{base}     ||= $base_path;
Packit 549706
	$class =~ s/^\Q$args{prefix}\E:://;
Packit 549706
	$args{name}     ||= $class;
Packit 549706
	$args{version}  ||= $class->VERSION;
Packit 549706
	unless ( $args{path} ) {
Packit 549706
		$args{path}  = $args{name};
Packit 549706
		$args{path}  =~ s!::!/!g;
Packit 549706
	}
Packit 549706
	$args{file}     ||= "$args{base}/$args{prefix}/$args{path}.pm";
Packit 549706
	$args{wrote}      = 0;
Packit 549706
Packit 549706
	bless( \%args, $class );
Packit 549706
}
Packit 549706
Packit 549706
sub call {
Packit 549706
	my ($self, $method) = @_;
Packit 549706
	my $obj = $self->load($method) or return;
Packit 549706
        splice(@_, 0, 2, $obj);
Packit 549706
	goto &{$obj->can($method)};
Packit 549706
}
Packit 549706
Packit 549706
sub load {
Packit 549706
	my ($self, $method) = @_;
Packit 549706
Packit 549706
	$self->load_extensions(
Packit 549706
		"$self->{prefix}/$self->{path}", $self
Packit 549706
	) unless $self->{extensions};
Packit 549706
Packit 549706
	foreach my $obj (@{$self->{extensions}}) {
Packit 549706
		return $obj if $obj->can($method);
Packit 549706
	}
Packit 549706
Packit 549706
	my $admin = $self->{admin} or die <<"END_DIE";
Packit 549706
The '$method' method does not exist in the '$self->{prefix}' path!
Packit 549706
Please remove the '$self->{prefix}' directory and run $0 again to load it.
Packit 549706
END_DIE
Packit 549706
Packit 549706
	my $obj = $admin->load($method, 1);
Packit 549706
	push @{$self->{extensions}}, $obj;
Packit 549706
Packit 549706
	$obj;
Packit 549706
}
Packit 549706
Packit 549706
sub load_extensions {
Packit 549706
	my ($self, $path, $top) = @_;
Packit 549706
Packit 549706
	unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) {
Packit 549706
		unshift @INC, $self->{prefix};
Packit 549706
	}
Packit 549706
Packit 549706
	foreach my $rv ( $self->find_extensions($path) ) {
Packit 549706
		my ($file, $pkg) = @{$rv};
Packit 549706
		next if $self->{pathnames}{$pkg};
Packit 549706
Packit 549706
		local $@;
Packit 549706
		my $new = eval { require $file; $pkg->can('new') };
Packit 549706
		unless ( $new ) {
Packit 549706
			warn $@ if $@;
Packit 549706
			next;
Packit 549706
		}
Packit 549706
		$self->{pathnames}{$pkg} = delete $INC{$file};
Packit 549706
		push @{$self->{extensions}}, &{$new}($pkg, _top => $top );
Packit 549706
	}
Packit 549706
Packit 549706
	$self->{extensions} ||= [];
Packit 549706
}
Packit 549706
Packit 549706
sub find_extensions {
Packit 549706
	my ($self, $path) = @_;
Packit 549706
Packit 549706
	my @found;
Packit 549706
	File::Find::find( sub {
Packit 549706
		my $file = $File::Find::name;
Packit 549706
		return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is;
Packit 549706
		my $subpath = $1;
Packit 549706
		return if lc($subpath) eq lc($self->{dispatch});
Packit 549706
Packit 549706
		$file = "$self->{path}/$subpath.pm";
Packit 549706
		my $pkg = "$self->{name}::$subpath";
Packit 549706
		$pkg =~ s!/!::!g;
Packit 549706
Packit 549706
		# If we have a mixed-case package name, assume case has been preserved
Packit 549706
		# correctly.  Otherwise, root through the file to locate the case-preserved
Packit 549706
		# version of the package name.
Packit 549706
		if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) {
Packit 549706
			my $content = Module::Install::_read($subpath . '.pm');
Packit 549706
			my $in_pod  = 0;
Packit 549706
			foreach ( split //, $content ) {
Packit 549706
				$in_pod = 1 if /^=\w/;
Packit 549706
				$in_pod = 0 if /^=cut/;
Packit 549706
				next if ($in_pod || /^=cut/);  # skip pod text
Packit 549706
				next if /^\s*#/;               # and comments
Packit 549706
				if ( m/^\s*package\s+($pkg)\s*;/i ) {
Packit 549706
					$pkg = $1;
Packit 549706
					last;
Packit 549706
				}
Packit 549706
			}
Packit 549706
		}
Packit 549706
Packit 549706
		push @found, [ $file, $pkg ];
Packit 549706
	}, $path ) if -d $path;
Packit 549706
Packit 549706
	@found;
Packit 549706
}
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
Packit 549706
#####################################################################
Packit 549706
# Common Utility Functions
Packit 549706
Packit 549706
sub _caller {
Packit 549706
	my $depth = 0;
Packit 549706
	my $call  = caller($depth);
Packit 549706
	while ( $call eq __PACKAGE__ ) {
Packit 549706
		$depth++;
Packit 549706
		$call = caller($depth);
Packit 549706
	}
Packit 549706
	return $call;
Packit 549706
}
Packit 549706
Packit 549706
sub _read {
Packit 549706
	local *FH;
Packit 549706
	if ( $] >= 5.006 ) {
Packit 549706
		open( FH, '<', $_[0] ) or die "open($_[0]): $!";
Packit 549706
	} else {
Packit 549706
		open( FH, "< $_[0]"  ) or die "open($_[0]): $!";
Packit 549706
	}
Packit 549706
	my $string = do { local $/; <FH> };
Packit 549706
	close FH or die "close($_[0]): $!";
Packit 549706
	return $string;
Packit 549706
}
Packit 549706
Packit 549706
sub _readperl {
Packit 549706
	my $string = Module::Install::_read($_[0]);
Packit 549706
	$string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg;
Packit 549706
	$string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s;
Packit 549706
	$string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg;
Packit 549706
	return $string;
Packit 549706
}
Packit 549706
Packit 549706
sub _readpod {
Packit 549706
	my $string = Module::Install::_read($_[0]);
Packit 549706
	$string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg;
Packit 549706
	return $string if $_[0] =~ /\.pod\z/;
Packit 549706
	$string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg;
Packit 549706
	$string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg;
Packit 549706
	$string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg;
Packit 549706
	$string =~ s/^\n+//s;
Packit 549706
	return $string;
Packit 549706
}
Packit 549706
Packit 549706
sub _write {
Packit 549706
	local *FH;
Packit 549706
	if ( $] >= 5.006 ) {
Packit 549706
		open( FH, '>', $_[0] ) or die "open($_[0]): $!";
Packit 549706
	} else {
Packit 549706
		open( FH, "> $_[0]"  ) or die "open($_[0]): $!";
Packit 549706
	}
Packit 549706
	foreach ( 1 .. $#_ ) {
Packit 549706
		print FH $_[$_] or die "print($_[0]): $!";
Packit 549706
	}
Packit 549706
	close FH or die "close($_[0]): $!";
Packit 549706
}
Packit 549706
Packit 549706
# _version is for processing module versions (eg, 1.03_05) not
Packit 549706
# Perl versions (eg, 5.8.1).
Packit 549706
sub _version ($) {
Packit 549706
	my $s = shift || 0;
Packit 549706
	my $d =()= $s =~ /(\.)/g;
Packit 549706
	if ( $d >= 2 ) {
Packit 549706
		# Normalise multipart versions
Packit 549706
		$s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg;
Packit 549706
	}
Packit 549706
	$s =~ s/^(\d+)\.?//;
Packit 549706
	my $l = $1 || 0;
Packit 549706
	my @v = map {
Packit 549706
		$_ . '0' x (3 - length $_)
Packit 549706
	} $s =~ /(\d{1,3})\D?/g;
Packit 549706
	$l = $l . '.' . join '', @v if @v;
Packit 549706
	return $l + 0;
Packit 549706
}
Packit 549706
Packit 549706
sub _cmp ($$) {
Packit 549706
	_version($_[0]) <=> _version($_[1]);
Packit 549706
}
Packit 549706
Packit 549706
# Cloned from Params::Util::_CLASS
Packit 549706
sub _CLASS ($) {
Packit 549706
	(
Packit 549706
		defined $_[0]
Packit 549706
		and
Packit 549706
		! ref $_[0]
Packit 549706
		and
Packit 549706
		$_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s
Packit 549706
	) ? $_[0] : undef;
Packit 549706
}
Packit 549706
Packit 549706
1;
Packit 549706
Packit 549706
# Copyright 2008 - 2009 Adam Kennedy.