—use
5.008;
# pragma utf8
use
strict;
use
warnings;
use
utf8;
our
$VERSION
=
'1.002000'
;
# TRIAL
# ABSTRACT: Add all Dist::Zilla plugins presently in use as prerequisites.
our
$AUTHORITY
=
'cpan:KENTNL'
;
# AUTHORITY
has
phase
=> (
is
=>
ro
=>,
isa
=> Str,
lazy
=> 1,
default
=>
sub
{
'develop'
}, );
has
relation
=> (
is
=>
ro
=>,
isa
=> Str,
lazy
=> 1,
default
=>
sub
{
'requires'
}, );
has
exclude
=> (
is
=>
ro
=>,
isa
=> ArrayRef [Str],
lazy
=> 1,
default
=>
sub
{ [] } );
has
_exclude_hash
=> (
is
=>
ro
=>,
isa
=> HashRef [Str],
lazy
=> 1,
builder
=>
'_build__exclude_hash'
);
has
_sequence
=> (
is
=>
ro
=>,
required
=> 1 );
sub
mvp_multivalue_args {
return
qw(exclude)
}
sub
_build__exclude_hash {
my
(
$self
, ) =
@_
;
return
{
map
{ (
$_
=> 1 ) } @{
$self
->exclude } };
}
around
'dump_config'
=> config_dumper( __PACKAGE__,
qw( phase relation exclude )
);
sub
register_prereqs {
my
(
$self
) =
@_
;
my
$zilla
=
$self
->zilla;
my
$phase
=
$self
->phase;
my
$relation
=
$self
->relation;
## no critic (Subroutines::ProtectPrivateSubs)
for
my
$section
(
values
%{
$self
->_sequence->_sections } ) {
next
if
q[_]
eq
$section
->name;
my
$package
=
$section
->
package
;
next
if
exists
$self
->_exclude_hash->{
$package
};
my
$payload
=
$section
->payload;
my
$version
=
'0'
;
if
(
exists
$payload
->{
':version'
} ) {
$version
=
$payload
->{
':version'
};
}
$zilla
->register_prereqs( {
phase
=>
$phase
,
type
=>
$relation
},
$package
,
$version
);
}
return
$zilla
->prereqs;
}
around
plugin_from_config
=>
sub
{
my
(
$orig
,
$plugin_class
,
$name
,
$arg
,
$own_section
) =
@_
;
$arg
->{_sequence} =
$own_section
->sequence;
return
$plugin_class
->
$orig
(
$name
,
$arg
,
$own_section
);
};
__PACKAGE__->meta->make_immutable;
no
Moose;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Dist::Zilla::Plugin::Prereqs::Plugins - Add all Dist::Zilla plugins presently in use as prerequisites.
=head1 VERSION
version 1.002000
=head1 SYNOPSIS
[Prereqs::Plugins]
; all plugins are now develop.requires deps
[Prereqs::Plugins]
phase = runtime ; all plugins are now runtime.requires deps
=head1 DESCRIPTION
This is mostly because I am lazy, and the lengthy list of hand-updated dependencies
on my C<@Author::> bundle started to get overwhelming, and I'd periodically miss something.
This module is kinda C<AutoPrereqs>y, but in ways that I can't imagine being plausible with
a generic C<AutoPrereqs> tool, at least, not without requiring some nasty re-implementation
of how C<dist.ini> is parsed.
=head1 METHODS
=head2 C<mvp_multivalue_args>
The list of attributes that can be specified multiple times
exclude
=head2 C<register_prereqs>
See L<<< C<< Dist::Zilla::Role::B<PrereqSource> >>|Dist::Zilla::Role::PrereqSource >>>
=head1 ATTRIBUTES
=head2 C<phase>
The target installation phase to inject into:
=over 4
=item * C<runtime>
=item * C<configure>
=item * C<build>
=item * C<test>
=item * C<develop>
=back
=head2 C<relation>
The type of dependency relation to create:
=over 4
=item * C<requires>
=item * C<recommends>
=item * C<suggests>
=item * C<conflicts>
Though think incredibly hard before using this last one ;)
=back
=head2 C<exclude>
Specify anything you want excluded here.
May Be specified multiple times.
[Prereqs::Plugins]
exclude = Some::Module::Thingy
exclude = Some::Other::Module::Thingy
=head1 PRIVATE ATTRIBUTES
=head2 C<_exclude_hash>
=head2 C<_sequence>
This is the dark magic that makes this work.
This is a required attribute that is injected during C<plugin_from_config>
=head1 PRIVATE METHODS
=head2 C<_build__exclude_hash>
=head1 LIMITATIONS
=over 4
=item * This module will B<NOT> report C<@Bundles> as dependencies at present.
=item * This module will B<NOT> I<necessarily> include B<ALL> dependencies, but is only intended to include the majority of them.
Some plugins, such as my own C<Bootstrap::lib> don't add themselves to the C<dzil> C<< ->plugins() >> list, and as such, it will be invisible to this module.
=back
=head1 AUTHOR
Kent Fredric <kentnl@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Kent Fredric <kentfredric@gmail.com>.
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