Package-Butcher

 view release on metacpan or  search on metacpan

lib/Package/Butcher.pm  view on Meta::CPAN

package Package::Butcher;

use warnings;
use strict;

use Package::Butcher::Inflator;
use Carp ();

use constant VALID_PACKAGE_RE => qr/^\w+(?:::\w+)*$/;
use constant VALID_SUBROUTINE_RE  => qr/^[_[:alpha:]][[:word:]]*$/;

our $VERSION = '0.02';

sub new {
    my ( $class, $arg_for ) = @_;
    my $self = bless {} => $class;
    return $self->_initialize($arg_for);
}

sub _initialize {
    my ( $self, $arg_for ) = @_;
    my %default_for = (
        package           => delete $arg_for->{package},
        import_on_use     => delete $arg_for->{import_on_use},
        is_package_loaded => 0,
        subs_installed    => {},
    );
    foreach my $method ( keys %default_for ) {
        $self->{$method} = $default_for{$method};
        no strict 'refs';
        *$method = sub { $_[0]->{$method} };
    }
    $self->_do_not_load( delete $arg_for->{do_not_load} );
    # _sub() must be called before _predeclare
    $self->_subs( delete $arg_for->{subs} );
    $self->_predeclare( delete $arg_for->{predeclare} );
    $self->_method_chains( delete $arg_for->{method_chains} );

    return $self;
}

sub _is_package_loaded { $_[0]->{is_package_loaded} = $_[1] }

sub _assert_looks_like_package {
    my ( $proto, $package ) = @_;
    unless ( $package =~ VALID_PACKAGE_RE ) {
        Carp::confess(
            "'$package' does not look like a valid package name to me");
    }
}

sub _assert_looks_like_subroutine {
    my ( $proto, $subroutine ) = @_;
    unless ( $subroutine =~ VALID_SUBROUTINE_RE ) {
        Carp::confess("'$subroutine' does not look like a valid subroutine name to me");
    }        
}

sub _do_not_load {
    my ( $self, $packages ) = @_;
    return unless $packages;
    $packages = [$packages] unless 'ARRAY' eq ref $packages;
    foreach my $package (@$packages) {
        $self->_assert_looks_like_package($package);
        my $file = "$package.pm";
        $file =~ s{::}{/}g;
        my $butcher = ref $self;
        my $message = "loaded via '$butcher'";
        if ( $INC{$file} && $INC{$file} ne $message ) {
            Carp::cluck("'$package' already loaded via '$INC{$file}'");
        }
        else {
            $INC{$file} = $message;

            # This ensures that "use Foo 'bar'" won't generate "package Foo
            # doesn't export bar" errors

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 1.340 second using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )