package ExtUtils::Builder::Action; $ExtUtils::Builder::Action::VERSION = '0.016'; use strict; use warnings; sub new { my ($class, %args) = @_; return bless { %args }, $class; } sub preference { my ($self, @possibilities) = @_; my $map = $self->_preference_map; my @keys = @possibilities ? @possibilities : keys %{$map}; my ($ret) = reverse sort { $map->{$a} <=> $map->{$b} } @keys; return $ret; } sub to_code_hash { my ($self, %opts) = @_; return { code => $self->to_code(%opts), } } 1; #ABSTRACT: The ExtUtils::Builder Action role __END__ =pod =encoding UTF-8 =head1 NAME ExtUtils::Builder::Action - The ExtUtils::Builder Action role =head1 VERSION version 0.016 =head1 SYNOPSIS $_->execute for @actions; open my $script, '>', 'foo.sh'; print $script shell_quote(@{$_}) for map { $_->to_command } @actions; =head1 DESCRIPTION Actions are the cornerstone of the ExtUtils::Builder framework. They provide an interface between build tools (L<ExtUtils::MakeMaker|ExtUtils::MakeMaker>, L<Module::Build|Module::Build>) and building extensions. This allows both sides to be completely independent from each other. It is a flexible abstraction around pieces of work, this work can be a piece of perl code, an external command, a mix of those or possibly other things. =head1 OVERVIEW An action can be consumed in many ways. It can be C<execute>d, which is often the simplest way to deal with them. It can be serialized to commands that can be passed on to system or strings that can be C<eval>led. If a consumer can deal with multiple of these, the C<preference> method can be used to choose between options. On L<composite|ExtUtils::Builder::Action::Composite> actions, C<flatten> can be called to retrieve the constituent actions, on L<primitive|ExtUtils::Builder::Action::Primitive> actions it's just an identity operator. This is particularly useful before calling preference, because different sub-actions are likely to have different preferences. =head1 METHODS =head2 execute(%arguments) Execute this action immediately. This may throw an exception on errors, but doesn't otherwise return anything. C<%arguments> may be used by the command. =over 4 =item * quiet If true, this suppresses logging. =back =head2 to_command(%options) Convert the action into a set of platform appropriate commands. It returns a list of array-refs, each array-ref being an individual command that can be passes to C<system> or equivalent. C<%options> can influence how something is serialized in action-type specific ways, but shouldn't fundamentally affect the action that is performed. All options are optional. =over 4 =item perl This contains the path to the current perl interpreter. =item config This should contain an ExtUtils::Config object, or equivalent. =back =head2 to_code(%options) This returns a list of strings that can be evalled to sub-refs. C<%options> can influence how something is serialized in action-type specific ways, but shouldn't fundamentally affect the action that is performed. =head2 to_code_hash(%options) This returns a list of hashes that can be used to create L<Action::Code|ExtUtils::Builder::Action::Code> objects. =head2 preference(@possibilities) This action returns the favored out of C<@possibilities>. Valid values are C<execute>, C<code>, C<command>, C<flatten>. If no arguments are given, the favorite from all valid values is given. =head2 flatten This action returns all actions behind this action. It may return itself, it may return a long list of actions, it may even return an empty list. =for Pod::Coverage new =head1 AUTHOR Leon Timmermans <fawaka@gmail.com> =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2013 by Leon Timmermans. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut