Spaces:
Running
Running
| package CPAN::Plugin; | |
| use strict; | |
| use warnings; | |
| our $VERSION = '0.97'; | |
| require CPAN; | |
| ###################################################################### | |
| sub new { # ; | |
| my ($class, %params) = @_; | |
| my $self = +{ | |
| (ref $class ? (%$class) : ()), | |
| %params, | |
| }; | |
| $self = bless $self, ref $class ? ref $class : $class; | |
| unless (ref $class) { | |
| local $_; | |
| no warnings 'once'; | |
| $CPAN::META->use_inst ($_) for $self->plugin_requires; | |
| } | |
| $self; | |
| } | |
| ###################################################################### | |
| sub plugin_requires { # ; | |
| } | |
| ###################################################################### | |
| sub distribution_object { # ; | |
| my ($self) = @_; | |
| $self->{distribution_object}; | |
| } | |
| ###################################################################### | |
| sub distribution { # ; | |
| my ($self) = @_; | |
| my $distribution = $self->distribution_object->id; | |
| CPAN::Shell->expand("Distribution",$distribution) | |
| or $self->frontend->mydie("Unknowns distribution '$distribution'\n"); | |
| } | |
| ###################################################################### | |
| sub distribution_info { # ; | |
| my ($self) = @_; | |
| CPAN::DistnameInfo->new ($self->distribution->id); | |
| } | |
| ###################################################################### | |
| sub build_dir { # ; | |
| my ($self) = @_; | |
| my $build_dir = $self->distribution->{build_dir} | |
| or $self->frontend->mydie("Distribution has not been built yet, cannot proceed"); | |
| } | |
| ###################################################################### | |
| sub is_xs { # | |
| my ($self) = @_; | |
| my @xs = glob File::Spec->catfile ($self->build_dir, '*.xs'); # quick try | |
| unless (@xs) { | |
| require ExtUtils::Manifest; | |
| my $manifest_file = File::Spec->catfile ($self->build_dir, "MANIFEST"); | |
| my $manifest = ExtUtils::Manifest::maniread($manifest_file); | |
| @xs = grep /\.xs$/, keys %$manifest; | |
| } | |
| scalar @xs; | |
| } | |
| ###################################################################### | |
| package CPAN::Plugin; | |
| 1; | |
| __END__ | |
| =pod | |
| =head1 NAME | |
| CPAN::Plugin - Base class for CPAN shell extensions | |
| =head1 SYNOPSIS | |
| package CPAN::Plugin::Flurb; | |
| use parent 'CPAN::Plugin'; | |
| sub post_test { | |
| my ($self, $distribution_object) = @_; | |
| $self = $self->new (distribution_object => $distribution_object); | |
| ...; | |
| } | |
| =head1 DESCRIPTION | |
| =head2 Alpha Status | |
| The plugin system in the CPAN shell was introduced in version 2.07 and | |
| is still considered experimental. | |
| =head2 How Plugins work? | |
| See L<CPAN/"Plugin support">. | |
| =head1 METHODS | |
| =head2 plugin_requires | |
| returns list of packages given plugin requires for functionality. | |
| This list is evaluated using C<< CPAN->use_inst >> method. | |
| =head2 distribution_object | |
| Get current distribution object. | |
| =head2 distribution | |
| =head2 distribution_info | |
| =head2 build_dir | |
| Simple delegatees for misc parameters derived from distribution | |
| =head2 is_xs | |
| Predicate to detect whether package contains XS. | |
| =head1 AUTHOR | |
| Branislav Zahradnik <[email protected]> | |
| =cut | |