Alien-Build
view release on metacpan or search on metacpan
lib/Alien/Build/Manual/PluginAuthor.pod view on Meta::CPAN
# By default this just returns the value of $ENV{ALIEN_INSTALL_TYPE}
sub override {
return $ENV{ALIEN_INSTALL_TYPE};
}
# Default download implementation; can be
# replaced by specifying a different download
# hook. See Alien::Build::Plugin::Core::Download
# for detailed implementation.
sub download {
my $response = fetch();
if($response->{type} eq 'html' || $response->{type} eq 'dir_listing') {
# decode will transform an HTML listing (html) or a FTP directory
# listing (dir_listing) into a regular list
$response = decode($response);
}
if($response->{type} eq 'list') {
# prefer will filter bad entries in the list
# and sort them so that the first one is
# the one that we want
$response = prefer($response);
my $first_preferred = $res->{list}->[0];
# prefer can sometimes infer the version from the
# filename.
if(defined $first_preferred->{version}) {
# not a hook
runtime_prop->{version} = $first_preferred->{version};
}
$response = fetch($first_preferred);
}
if($response->{type} eq 'file') {
# not a hook
write_file_to_disk $response;
}
}
=head1 DESCRIPTION
This document explains how to write L<Alien::Build> plugins using the
L<Alien::Build::Plugin> base class.
=head2 Writing plugins
Plugins use L<Alien::Build::Plugin>, which sets the appropriate base
class, and provides you with the C<has> property builder. C<has> takes
two arguments, the name of the property and the default value. (As
with L<Moose> and L<Moo>, you should use a code reference to specify
default values for non-string defaults). No B<not> set this as your
plugin's base class directly:
use parent qw( Alien::Build::Plugin ); # wrong
use Alien::Build::Plugin; # right
The only method that you need to implement is C<init>. From this method
you can add hooks to change the behavior of the L<alienfile> recipe.
This is a very simple example of a probe hook, with the actual probe
logic removed:
sub init
{
my($self, $meta) = @_;
$meta->register_hook(
probe => sub {
my($build) = @_;
if( ... )
{
return 'system';
}
else
{
return 'share';
}
},
);
}
Hooks get the L<Alien::Build> instance as their first argument, and depending
on the hook may get additional arguments.
=head2 Modifying hooks
You can also modify hooks using C<before_hook>, C<around_hook> and C<after_hook>,
similar to L<Moose> modifiers:
sub init
{
my($self, $meta) = @_;
$meta->before_hook(
build => sub {
my($build) = @_;
$build->log('this runs before the build');
},
);
$meta->after_hook(
build => sub {
my($build) = @_;
$build->log('this runs after the build');
},
);
$meta->around_hook(
build => sub {
my $orig = shift;
# around hooks are useful for setting environment variables
local $ENV{CPPFLAGS} = '-I/foo/include';
$orig->(@_);
},
( run in 1.141 second using v1.01-cache-2.11-cpan-524268b4103 )