Dist-Dzpl

 view release on metacpan or  search on metacpan

lib/Dist/Dzpl.pm  view on Meta::CPAN

    }
    elsif ( -d $file ) {
        my @try = qw/ dzpl dz.pl dist.pl /;
        for ( map { "$file/$_" } @try ) {
            -e $_ and ( $source = $_ ) and last;
        }
        croak "Could not find ", join( ' or ', map { "\"$_\"" } @try ), " in $file" unless $source;
    }
    else {
        croak "Missing file";
    }
    croak "Could not read \"$source\"" unless -r $source;

    my $dzpl = $self->_from_file_sandbox( $source );
    die "Error while loading $source: $@" if $@;
    return $dzpl;
}

sub _from_file_sandbox {
    my $self = shift;
    my $file = shift;

    my $package = $file;
    $package =~ s/([^A-Za-z0-9_])/sprintf("_%2x", unpack("C", $1))/eg;

    return eval sprintf <<'_END_', $package;
package Dist::Dzpl::Sandbox::%s;
{
    require Dzpl;
    do $file;
    Dzpl->dzpl_from_package( __PACKAGE__ ) or die $@;
}
_END_
}

sub from_arguments {
    my $self = shift;
    my $zilla = Dist::Dzpl::Parser->parse( @_ );
    return __PACKAGE__->new( zilla => $zilla );
}

sub run {
    my $self = shift;
    my @arguments = @_;

    my $zilla = $self->zilla;
    # TODO This should only be run once...
    $zilla->_setup_default_plugins;

    return unless @arguments;

    my $do = shift @arguments;

    if ( $do eq 'dzil' ) {
        require Dist::Zilla::App;
        my $app = Dist::Zilla::App->new;
        $app->{__chrome__} = $zilla->chrome;
        $app->{__PACKAGE__}{zilla} = $zilla; # Cover case 1...
        $app->{'Dist::Zilla::App'}{zilla} = $zilla; # ...and case 2
        {
            local @ARGV = @arguments;
            $app->run;
        }
    }
    else {
        die "Dist::Zilla cannot do \"$do\"" unless $zilla->can( $do );
        warn "Dropping arguments [@arguments]" if @arguments;
        return $zilla->$do;
    }
}

sub _include_plugin_bundle {
    my $self = shift;
    my $name = shift;
    my $package = shift;
    my $payload = shift;
    my $filter = shift;

    Class::MOP::load_class( $package );

    my @bundle = $package->bundle_config({ 
        name => $name,
        zilla => $self->zilla,
        payload => $payload,
    });

    for my $plugin ( @bundle ) {
        my ( $name, $package, $payload ) = @$plugin;
        next if $filter && $package =~ $filter;
        $self->_include_plugin( $name, $package, $payload );
    }
}

sub _include_plugin {
    my $self = shift;
    my $name = shift;
    my $package = shift;
    my $payload = shift;

    Class::MOP::load_class( $package );

    my @arguments;
    if ( ref $payload eq 'HASH' ) {
        push @arguments, payload => $payload;
    }
    elsif ( ref $payload eq 'ARRAY' ) {
        push @arguments, @$payload;
    }
    elsif ( defined $payload ) {
        die "Invalid payload ($payload)";
    }

    $self->zilla->plugins->push( $package->new( 
        plugin_name => $name,
        zilla => $self->zilla,
        @arguments,
    ) );
}

sub plugin {
    my $self = shift;



( run in 0.819 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )