File Coverage

blib/lib/Dist/Zilla/PluginBundle/Author/KENTNL.pm
Criterion Covered Total %
statement 181 207 87.4
branch 28 60 46.6
condition 5 14 35.7
subroutine 26 26 100.0
pod 4 5 80.0
total 244 312 78.2


line stmt bran cond sub pod time code
1 5     5   846803 use 5.006;
  5         17  
2 5     5   22 use strict;
  5         7  
  5         127  
3 5     5   20 use warnings;
  5         12  
  5         450  
4              
5             package Dist::Zilla::PluginBundle::Author::KENTNL;
6              
7             # ABSTRACT: BeLike::KENTNL when you build your distributions.
8              
9             our $VERSION = '2.025021';
10              
11             our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
12              
13 5     5   467 use Moose qw( with has );
  5         312161  
  5         50  
14 5     5   23658 use Moose::Util::TypeConstraints qw(enum);
  5         15  
  5         63  
15 5     5   4300 use Dist::Zilla::Util::CurrentCmd qw( current_cmd );
  5         48370  
  5         29  
16              
17             with 'Dist::Zilla::Role::PluginBundle';
18             with 'Dist::Zilla::Role::PluginBundle::PluginRemover';
19             with 'Dist::Zilla::Role::PluginBundle::Config::Slicer';
20             with 'Dist::Zilla::Role::BundleDeps';
21              
22 5     5   1594 use namespace::autoclean;
  5         5811  
  5         61  
23              
24              
25              
26              
27              
28              
29              
30              
31              
32              
33              
34              
35              
36              
37              
38              
39              
40              
41              
42              
43              
44              
45              
46              
47              
48              
49             sub mvp_multivalue_args { return qw( auto_prereqs_skip copy_files ) }
50              
51             sub mvp_aliases {
52             return {
53 4     4 0 549 'bumpversions' => 'bump_versions',
54             'srcreadme' => 'src_readme',
55             'copyfiles' => 'copy_files',
56             };
57             }
58              
59              
60              
61              
62              
63              
64              
65              
66              
67              
68              
69             has 'plugins' => ( 'is' => 'ro' =>, 'isa' => 'ArrayRef', 'init_arg' => undef, 'lazy' => 1, 'default' => sub { [] } );
70              
71              
72              
73              
74              
75              
76              
77              
78              
79              
80              
81              
82              
83             has 'normal_form' => ( 'is' => ro =>, 'isa' => 'Str', lazy => 1, default => sub { 'numify' } );
84              
85              
86              
87              
88              
89              
90              
91              
92              
93              
94              
95             has 'mantissa' => (
96             'is' => ro =>,
97             'isa' => 'Int',
98             'lazy' => 1,
99             'default' => sub {
100             return 6;
101             },
102             );
103              
104              
105              
106              
107              
108              
109              
110              
111              
112              
113              
114              
115              
116              
117              
118              
119              
120              
121              
122             has 'git_versions' => ( is => 'ro', isa => 'Any', lazy => 1, default => sub { undef } );
123              
124              
125              
126              
127              
128              
129              
130              
131              
132             has 'authority' => ( is => 'ro', isa => 'Str', lazy => 1, default => sub { 'cpan:KENTNL' }, );
133              
134              
135              
136              
137              
138              
139              
140              
141              
142             has 'auto_prereqs_skip' => (
143             is => 'ro',
144             isa => 'ArrayRef',
145             predicate => 'has_auto_prereqs_skip',
146             lazy => 1,
147             default => sub { [] },
148             );
149              
150              
151              
152              
153              
154              
155              
156              
157              
158             has 'twitter_extra_hash_tags' => (
159             is => 'ro',
160             'isa' => 'Str',
161             lazy => 1,
162             predicate => 'has_twitter_extra_hash_tags',
163             default => sub { q[] },
164             );
165              
166              
167              
168              
169              
170              
171              
172              
173              
174             has 'twitter_hash_tags' => (
175             is => 'ro',
176             isa => 'Str',
177             lazy => 1,
178             default => sub {
179             my ($self) = @_;
180             return '#perl #cpan' unless $self->has_twitter_extra_hash_tags;
181              
182             return '#perl #cpan ' . $self->twitter_extra_hash_tags;
183             },
184             );
185              
186              
187              
188              
189              
190              
191              
192              
193              
194             has 'tweet_url' => (
195             is => 'ro',
196             isa => 'Str',
197             lazy => 1,
198             default => sub {
199             ## no critic (RequireInterpolationOfMetachars)
200             return q[https://metacpan.org/release/{{$AUTHOR_UC}}/{{$DIST}}-{{$VERSION}}{{$TRIAL}}#whatsnew];
201             },
202             );
203              
204              
205              
206              
207              
208              
209              
210              
211              
212              
213              
214              
215              
216              
217              
218              
219              
220              
221              
222              
223              
224             has 'toolkit_hardness' => (
225             is => ro =>,
226             isa => enum( [ 'hard', 'soft' ] ),
227             lazy => 1,
228             default => sub { 'hard' },
229             );
230              
231              
232              
233              
234              
235              
236              
237              
238              
239              
240              
241              
242              
243              
244              
245              
246              
247              
248              
249             has 'toolkit' => (
250             is => ro =>,
251             isa => enum( [ 'mb', 'mbtiny', 'eumm' ] ),
252             lazy => 1,
253             default => sub { 'mb' },
254             );
255              
256              
257              
258              
259              
260              
261              
262              
263              
264              
265             has 'bump_versions' => (
266             is => ro =>,
267             isa => 'Bool',
268             lazy => 1,
269             default => sub { undef },
270             );
271              
272              
273              
274              
275              
276              
277              
278              
279              
280              
281              
282              
283              
284              
285              
286              
287             has copy_files => (
288             is => ro =>,
289             isa => 'ArrayRef[ Str ]',
290             lazy => 1,
291             default => sub { [ 'LICENSE', 'Makefile.PL' ] },
292             );
293              
294              
295              
296              
297              
298              
299              
300              
301              
302             has src_readme => (
303             is => ro =>,
304             isa => enum( [ 'pod', 'mkdn', 'none' ] ),
305             lazy => 1,
306             default => sub { return 'mkdn'; },
307             );
308              
309             __PACKAGE__->meta->make_immutable;
310 5     5   2134 no Moose;
  5         12  
  5         24  
311 5     5   410 no Moose::Util::TypeConstraints;
  5         11  
  5         40  
312              
313              
314              
315              
316              
317              
318              
319             sub add_plugin {
320 172     172 1 192 my ( $self, $suffix, $conf ) = @_;
321 172 50       234 if ( not defined $conf ) {
322 0         0 $conf = {};
323             }
324 172 50 33     434 if ( not ref $conf or not 'HASH' eq ref $conf ) {
325 0         0 require Carp;
326 0         0 Carp::croak('Conf must be a hash');
327             }
328             ## no critic (RequireInterpolationOfMetachars)
329 172         152 push @{ $self->plugins }, [ q{@Author::KENTNL/} . $suffix, 'Dist::Zilla::Plugin::' . $suffix, $conf ];
  172         6187  
330 172         183 return;
331             }
332              
333              
334              
335              
336              
337              
338              
339             sub add_named_plugin {
340 36     36 1 50 my ( $self, $name, $suffix, $conf ) = @_;
341 36 50       64 if ( not defined $conf ) {
342 0         0 $conf = {};
343             }
344 36 50 33     124 if ( not ref $conf or not 'HASH' eq ref $conf ) {
345 0         0 require Carp;
346 0         0 Carp::croak('Conf must be a hash');
347             }
348             ## no critic (RequireInterpolationOfMetachars)
349 36         29 push @{ $self->plugins }, [ q{@Author::KENTNL/} . $name, 'Dist::Zilla::Plugin::' . $suffix, $conf ];
  36         1249  
350 36         44 return;
351             }
352              
353              
354              
355              
356              
357              
358              
359 16   33 16   41 sub _is_bake { return ( current_cmd() and 'bakeini' eq current_cmd() ) }
360              
361             sub _configure_bump_versions_version {
362 4     4   8 my ( $self, ) = @_;
363 4 50       172 return if $self->bump_versions;
364 0         0 $self->add_plugin(
365             'Git::NextVersion::Sanitized' => {
366             version_regexp => '^(.*)-source$',
367             first_version => '0.001000',
368             normal_form => $self->normal_form,
369             mantissa => $self->mantissa,
370             },
371             );
372 0         0 return;
373             }
374              
375             sub _configure_basic_metadata {
376 4     4   7 my ( $self, ) = @_;
377              
378 4         16 $self->add_plugin( 'MetaConfig' => {}, );
379 4         15 $self->add_plugin( 'GithubMeta' => { issues => 1 }, );
380 4         16 $self->add_plugin( 'MetaProvides::Package' => { ':version' => '1.14000001' }, );
381              
382 4         38 my $builtwith_options = {
383             ':version' => '1.004000',
384             show_config => 1,
385             use_external_file => 'only',
386             };
387              
388 4 50       32 if ( 'linux' eq $^O ) {
389 4         9 $builtwith_options->{show_uname} = 1;
390 4         9 $builtwith_options->{uname_args} = q{-s -o -r -m -i};
391             }
392              
393 4         11 $self->add_plugin( 'MetaData::BuiltWith' => $builtwith_options );
394 4         40 $self->add_plugin(
395             'Git::Contributors' => {
396             ':version' => '0.006',
397             include_authors => 0,
398             include_releaser => 0,
399             order_by => 'name',
400             },
401             );
402              
403 4         4 return;
404             }
405              
406             sub _none_match {
407 4     4   10 my ( $item, @list ) = @_;
408 4         9 for my $list_item (@list) {
409 8 50       22 return if $item eq $list_item;
410             }
411 4         13 return 1;
412             }
413              
414             sub _configure_basic_files {
415 4     4   8 my ($self) = @_;
416 4         12 my (@ignore_files) = qw( README README.mkdn README.pod CONTRIBUTING.pod );
417 4         7 my (@copy_files) = ();
418              
419 4 50       5 if ( _none_match 'none', @{ $self->copy_files } ) {
  4         157  
420 4         7 push @copy_files, @{ $self->copy_files };
  4         164  
421             }
422 4         10 push @ignore_files, @copy_files;
423              
424 4         39 $self->add_plugin(
425             'Git::GatherDir' => {
426             include_dotfiles => 1,
427             exclude_filename => [@ignore_files],
428             },
429             );
430 4         15 $self->add_plugin( 'License' => {} );
431              
432 4         11 $self->add_plugin( 'MetaJSON' => {} );
433 4         13 $self->add_plugin( 'MetaYAML::Minimal' => {} );
434 4         19 $self->add_plugin( 'Manifest' => {} );
435 4         12 $self->add_plugin( 'Author::KENTNL::TravisCI' => { ':version' => '0.001002' } );
436 4         36 $self->add_plugin(
437             'Author::KENTNL::CONTRIBUTING' => {
438             ':version' => '0.001003',
439             document_version => '0.1',
440             '-location' => 'root', # Assuming my patches get merged in future
441             '-phase' => 'build',
442             },
443             );
444              
445 4 50       14 if (@copy_files) {
446 4         30 $self->add_named_plugin( 'CopyXBuild' => 'CopyFilesFromBuild', { copy => [@copy_files] } );
447             }
448              
449 4         8 return;
450             }
451              
452             sub _configure_basic_tests {
453 4     4   6 my ($self) = @_;
454 4         11 $self->add_plugin( 'MetaTests' => {} );
455 4         11 $self->add_plugin( 'PodCoverageTests' => {} );
456 4         9 $self->add_plugin( 'PodSyntaxTests' => {} );
457 4         10 $self->add_plugin( 'Test::ReportPrereqs' => {} );
458 4         18 $self->add_plugin( 'Test::Kwalitee' => {} );
459 4         22 $self->add_plugin( 'Test::EOL' => { trailing_whitespace => 1, } );
460 4         12 $self->add_plugin( 'Test::MinimumVersion' => {} );
461 4         20 $self->add_plugin(
462             'Test::Compile::PerFile' => {
463             ':version' => '0.003902',
464             'test_template' => '02-raw-require.t.tpl',
465             },
466             );
467 4         13 $self->add_plugin( 'Test::Perl::Critic' => {} );
468 4         4 return;
469             }
470              
471             sub _configure_pkgversion_munger {
472 4     4   18 my ($self) = @_;
473 4 50       148 if ( not $self->bump_versions ) {
474 0         0 $self->add_plugin( 'PkgVersion' => {} );
475 0         0 return;
476             }
477             $self->add_plugin(
478 4         160 'RewriteVersion::Sanitized' => {
479             normal_form => $self->normal_form,
480             mantissa => $self->mantissa,
481             },
482             );
483 4         5 return;
484             }
485              
486             sub _configure_bundle_develop_suggests {
487 4     4   8 my ($self) = @_;
488 4         20 my $deps = {
489             -phase => 'develop',
490             -type => 'suggests',
491             };
492 4 50       11 if ( _is_bake() ) {
493 0         0 $deps->{'Dist::Zilla::PluginBundle::Author::KENTNL'} = $VERSION;
494 0         0 $deps->{'Dist::Zilla::App::Command::bakeini'} = '0.001000';
495             }
496             else {
497 4         975 $deps->{'Dist::Zilla::PluginBundle::Author::KENTNL::Lite'} = '1.3.0';
498             }
499 4         16 $self->add_named_plugin( 'BundleDevelSuggests' => 'Prereqs' => $deps );
500 4         6 return;
501             }
502              
503             sub _configure_bundle_develop_requires {
504 4     4   12 my ($self) = @_;
505 4 50       10 return if _is_bake();
506 4         754 $self->add_named_plugin(
507             'BundleDevelRequires' => 'Prereqs' => {
508             -phase => 'develop',
509             -type => 'requires',
510             'Dist::Zilla::PluginBundle::Author::KENTNL' => $VERSION,
511             },
512             );
513 4         6 return;
514             }
515              
516             sub _configure_toolkit {
517 4     4   20 my ($self) = @_;
518 4         160 my $tk = $self->toolkit;
519             tc_select: {
520 4 50       6 if ( 'mb' eq $tk ) {
  4         15  
521 0         0 $self->add_plugin( 'ModuleBuild' => { default_jobs => 10 } );
522 0         0 last tc_select;
523             }
524 4 50       14 if ( 'eumm' eq $tk ) {
525 4         17 $self->add_plugin( 'MakeMaker' => { default_jobs => 10 } );
526 4         10 last tc_select;
527             }
528 0 0       0 if ( 'mbtiny' eq $tk ) {
529 0         0 $self->add_plugin( 'ModuleBuildTiny' => { default_jobs => 10 } );
530 0         0 last tc_select;
531             }
532             }
533 4         16 $self->add_plugin( 'Author::KENTNL::RecommendFixes' => { ':version' => '0.004002' } );
534 4         6 return;
535             }
536              
537             sub _configure_toolkit_prereqs {
538 4     4   239 my ($self) = @_;
539              
540 4         17 my $extra_match_installed = { 'Test::More' => '0.99', };
541              
542 4 50       160 $extra_match_installed->{'Module::Build'} = '0.4004' if 'mb' eq $self->toolkit;
543 4 50       154 $extra_match_installed->{'Module::Build::Tiny'} = '0.032' if 'mbtiny' eq $self->toolkit;
544 4 50       126 $extra_match_installed->{'ExtUtils::MakeMaker'} = '7.00' if 'eumm' eq $self->toolkit;
545              
546 4 50       143 if ( 'hard' eq $self->toolkit_hardness ) {
547             $self->add_plugin(
548             'Prereqs::MatchInstalled' => {
549 0         0 modules => [ sort keys %{$extra_match_installed} ],
  0         0  
550             },
551             );
552             }
553              
554             $self->add_plugin(
555             'Prereqs::Upgrade' => {
556 4         9 %{$extra_match_installed},
  4         53  
557             'Moose' => '2.000', # Module::Runtime crap
558             'Moo' => '1.000008', # lazy_build => sub
559             'Path::Tiny' => '0.058', # ->sibling
560             'File::ShareDir::Install' => '0.10', # dotfiles
561             'Dist::Zilla' => '5', # encoding
562             'Test::File::ShareDir' => '1.000000', # 5.8 version compat
563             'Dist::Zila::Plugin::MetaProvides::Package' => '2.000000', # sane version
564             },
565             );
566              
567 4         7 my $applymap = [ 'develop.requires = develop.requires', ];
568              
569 4 50       10 $applymap = [ 'develop.suggests = develop.suggests', ] if _is_bake();
570              
571 4         771 my @bundles = ('Dist::Zilla::PluginBundle::Author::KENTNL');
572              
573 4 50       11 push @bundles, 'Dist::Zilla::App::Command::bakeini' if _is_bake();
574              
575 4         672 $self->add_named_plugin(
576             'always_latest_develop_bundle' => 'Prereqs::Recommend::MatchInstalled' => {
577             applyto_map => $applymap,
578             applyto_phase => [ 'develop', ],
579             modules => [@bundles],
580             },
581             );
582 4         12 $self->add_plugin( 'RemovePrereqs::Provided' => {} );
583 4         9 return;
584             }
585              
586             sub _configure_readmes {
587 4     4   7 my ($self) = @_;
588              
589 4         14 $self->add_named_plugin( 'ShippedReadme' => 'Readme::Brief' => {}, );
590              
591 4         131 my $type = $self->src_readme;
592              
593 4 50       17 return if 'none' eq $type;
594              
595 4         6 my $map = {};
596 4         24 $map->{mkdn} = { type => 'markdown', filename => 'README.mkdn' };
597 4         14 $map->{pod} = { type => 'pod', filename => 'README.pod' };
598              
599 4 50       15 if ( not exists $map->{$type} ) {
600 0         0 require Carp;
601 0         0 return Carp::confess("No known readme type $type");
602             }
603              
604 4         7 $self->add_plugin( 'ReadmeAnyFromPod' => { location => 'root', %{ $map->{$type} } }, );
  4         22  
605              
606 4         14 return;
607             }
608              
609             sub configure {
610 4     4 1 8 my ($self) = @_;
611              
612             # Version
613 4         15 $self->_configure_bump_versions_version;
614              
615             # MetaData
616 4         11 $self->_configure_basic_metadata;
617              
618             # Gather Files
619 4         16 $self->_configure_basic_files;
620 4         13 $self->_configure_basic_tests;
621              
622             # Prune files
623              
624 4         10 $self->add_plugin( 'ManifestSkip' => {} );
625              
626             # Mungers
627 4         16 $self->_configure_pkgversion_munger;
628 4         15 $self->add_plugin(
629             'PodWeaver' => {
630             replacer => 'replace_with_blank',
631             },
632             );
633              
634             # Prereqs
635              
636             {
637 4         6 my $autoprereqs_hash = {};
  4         7  
638 4 50       203 $autoprereqs_hash->{skips} = $self->auto_prereqs_skip if $self->has_auto_prereqs_skip;
639 4         15 $self->add_plugin( 'AutoPrereqs' => $autoprereqs_hash );
640             }
641              
642 4         16 $self->_configure_bundle_develop_suggests();
643 4         13 $self->_configure_bundle_develop_requires();
644              
645 4         15 $self->add_plugin( 'Prereqs::AuthorDeps' => {} );
646              
647 4         15 $self->add_plugin( 'MinimumPerl' => {} );
648 4         142 $self->add_plugin(
649             'Authority' => {
650             ':version' => '1.006',
651             authority => $self->authority,
652             do_metadata => 1,
653             locate_comment => 1,
654             },
655             );
656              
657 4         23 $self->_configure_toolkit;
658              
659 4         20 $self->_configure_readmes;
660              
661 4         12 $self->add_plugin( 'Test::CPAN::Changes' => {} );
662 4         13 $self->add_plugin( 'RunExtraTests' => { default_jobs => 10 } );
663 4         11 $self->add_plugin( 'TestRelease' => {} );
664 4         12 $self->add_plugin( 'ConfirmRelease' => {} );
665              
666 4         16 $self->add_plugin( 'Git::Check' => { filename => 'Changes' } );
667 4         9 $self->add_named_plugin( 'commit_dirty_files' => 'Git::Commit' => {} );
668 4         13 $self->add_named_plugin( 'tag_master', => 'Git::Tag' => { tag_format => '%v-source' } );
669 4         23 $self->add_plugin(
670             'Git::NextRelease' => {
671             ':version' => '0.004000',
672             time_zone => 'UTC',
673             format => q[%v %{yyyy-MM-dd'T'HH:mm:ss}dZ %h],
674             default_branch => 'master',
675             },
676             );
677              
678 4 50       189 if ( $self->bump_versions ) {
679 4         23 $self->add_plugin( 'BumpVersionAfterRelease' => {} );
680             }
681             $self->add_named_plugin(
682 4         16 'commit_release_changes' => 'Git::Commit' => {
683             allow_dirty_match => '^lib/',
684             },
685             );
686              
687 4         28 $self->add_plugin( 'Git::CommitBuild' => { branch => 'builds', release_branch => 'releases' } );
688 4         16 $self->add_named_plugin( 'tag_release', 'Git::Tag' => { branch => 'releases', tag_format => '%v' } );
689 4         11 $self->add_plugin( 'UploadToCPAN' => {} );
690 4         141 $self->add_plugin(
691             'Twitter' => {
692             hash_tags => $self->twitter_hash_tags,
693             tweet_url => $self->tweet_url,
694             url_shortener => 'none',
695             },
696             );
697              
698 4         16 $self->_configure_toolkit_prereqs;
699              
700 4         6 return;
701             }
702              
703             sub BUILDARGS {
704 4     4 1 10 my ( $self, $config, @args ) = @_;
705              
706 4 50 50     40 if ( @args or not 'HASH' eq ( ref $config || q[] ) ) {
      33        
707 0         0 $config = { $config, @args };
708             }
709 4         7 my (%init_args);
710 4         22 for my $attr ( $self->meta->get_all_attributes ) {
711 56 100       510 next unless my $arg = $attr->init_arg;
712 52         73 $init_args{$arg} = 1;
713             }
714              
715             # A weakened warn-only filter-supporting StrictConstructor
716 4         13 for my $key ( keys %{$config} ) {
  4         20  
717 28 50       57 next if exists $init_args{$key};
718 0 0       0 next if $key =~ /\A-remove/msx;
719 0 0       0 next if $key =~ /\A[^.]+[.][^.]/msx;
720 0         0 require Carp;
721 0         0 Carp::carp("Unknown key $key");
722             }
723 4         170 return $config;
724             }
725              
726             sub bundle_config {
727             my ( $self, $section ) = @_;
728             my $class = ( ref $self ) || $self;
729              
730             my $wanted_version;
731             if ( exists $section->{payload}->{':version'} ) {
732             $wanted_version = delete $section->{payload}->{':version'};
733             }
734             my $instance = $class->new( $section->{payload} );
735              
736             $instance->configure();
737              
738             return @{ $instance->plugins };
739             }
740              
741             1;
742              
743             __END__
744              
745             =pod
746              
747             =encoding UTF-8
748              
749             =head1 NAME
750              
751             Dist::Zilla::PluginBundle::Author::KENTNL - BeLike::KENTNL when you build your distributions.
752              
753             =head1 VERSION
754              
755             version 2.025021
756              
757             =head1 SYNOPSIS
758              
759             [@Author::KENTNL]
760             normal_form = numify ; Mandatory for this bundle indicating normal form.
761             ; see DZP::Git::NextVersion::Sanitized
762              
763             mantissa = 6 ; Mandatory for this bundle if normal_form is numify.
764             ; see DZP::Git::NextVersion::Sanitized
765              
766             authority = cpan:KENTNL ; Optional, defaults to cpan:KENTNL
767              
768             auto_prereqs_skip = Some::Module ; Hide these from autoprereqs
769             auto_prereqs_skip = Other::Module
770              
771             toolkit = mb ; Which toolkit to use. Either eumm or mb
772             ; mb is default.
773              
774             toolkit_hardness = hard ; Whether to upgrade *require* deps to the latest
775             ; or wether to make them merely recomendations.
776             ; Either 'soft' ( recommend ) or 'hard' ( require )
777             ; default is 'hard'
778              
779             twitter_extra_hash_tags = #foo #bar ; non-default hashtags to append to the tweet
780              
781             =head1 DESCRIPTION
782              
783             This is the plug-in bundle that KENTNL uses. It exists mostly because he is very lazy
784             and wants others to be using what he's using if they want to be doing work on his modules.
785              
786             =head1 NAMING SCHEME
787              
788             As I blogged about on L<< C<blog.fox.geek.nz> : Making a Minting Profile as a CPANized Dist |http://bit.ly/hAwl4S >>,
789             this bundle advocates a new naming system for people who are absolutely convinced they want their C<Author-Centric> distribution
790             uploaded to CPAN.
791              
792             As we have seen with Dist::Zilla there have been a slew of PluginBundles with CPANID's in their name, to the point that there is
793             a copious amount of name-space pollution in the PluginBundle name-space, and more Author bundles than task-bundles, which was
794             really what the name-space was designed for, and I'm petitioning you to help reduce this annoyance in future modules.
795              
796             From a CPAN testers perspective, the annoyance of lots of CPANID-dists is similar to the annoyance of the whole DPCHRIST::
797             subspace, and that if this pattern continues, it will mean for the testers who do not wish to test everyones personal modules,
798             that they will have to work hard to avoid this. If DPCHRIST:: had used something like Author::DPCHRIST:: instead, I doubt so many
799             people would be horrified by it, because you can just have a policy/rule that excludes ^Author::, and everyone else who goes that
800             way can be quietly ignored.
801              
802             Then we could probably rationally add that same restriction to the irc announce bots, the "recent modules" list and so-forth, and
803             possibly even apply special indexing restrictions or something so people wouldn't even have to know those modules exist on cpan!
804              
805             So, for the sake of cleanliness, semantics, and general global sanity, I ask you to join me with my Author:: naming policy to
806             voluntarily segregate modules that are most likely of only personal use from those that have more general application.
807              
808             Dist::Zilla::Plugin::Foo # [Foo] dist-zilla plugins for general use
809             Dist::Zilla::Plugin::Author::KENTNL::Foo # [Author::KENTNL::Foo] foo that only KENTNL will probably have use for
810             Dist::Zilla::PluginBundle::Classic # [@Classic] A bundle that can have practical use by many
811             Dist::Zilla::PluginBundle::Author::KENTNL # [@Author::KENTNL] KENTNL's primary plugin bundle
812             Dist::Zilla::MintingProfile::Default # A minting profile that is used by all
813             Dist::Zilla::MintingProfile::Author::KENTNL # A minting profile that only KENTNL will find of use.
814              
815             =head2 Current Proponents
816              
817             I wish to give proper respect to the people out there already implementing this scheme:
818              
819             =over 4
820              
821             =item L<< C<@Author::DOHERTY> |Dist::Zilla::PluginBundle::Author::DOHERTY >> - Mike Doherty's, Author Bundle.
822              
823             =item L<< C<@Author::OLIVER> |Dist::Zilla::PluginBundle::Author::OLIVER >> - Oliver Gorwits', Author Bundle.
824              
825             =item L<< C<Dist::Zilla::PluginBundle::Author::> namespace |http://bit.ly/dIovQI >> - Oliver Gorwit's blog on the subject.
826              
827             =item L<< C<@Author::LESPEA> |Dist::Zilla::PluginBundle::Author::LESPEA >> - Adam Lesperance's, Author Bundle.
828              
829             =item L<< C<@Author::ALEXBIO> |Dist::Zilla::PluginBundle::Author::ALEXBIO >> - Alessandro Ghedini's, Author Bundle.
830              
831             =item L<< C<@Author::RWSTAUNER> |Dist::Zilla::PluginBundle::Author::RWSTAUNER >> - Randy Stauner's, Author Bundle.
832              
833             =item L<< C<@Author::WOLVERIAN> |Dist::Zilla::PluginBundle::Author::WOLVERIAN >> - Ilmari Vacklin's, Author Bundle.
834              
835             =item L<< C<@Author::YANICK> |Dist::Zilla::PluginBundle::Author::YANICK >> - Yanick Champoux's, Author Bundle.
836              
837             =item L<< C<@Author::RUSSOZ> |Dist::Zilla::PluginBundle::Author::RUSSOZ >> - Alexei Znamensky's, Author Bundle.
838              
839             =back
840              
841             =head1 METHODS
842              
843             =head2 C<bundle_config>
844              
845             See L<< the C<PluginBundle> role|Dist::Zilla::Role::PluginBundle >> for what this is for, it is a method to satisfy that role.
846              
847             =head2 C<add_plugin>
848              
849             $bundle_object->add_plugin("Basename" => { config_hash } );
850              
851             =head2 C<add_named_plugin>
852              
853             $bundle_object->add_named_plugin("alias" => "Basename" => { config_hash } );
854              
855             =head2 C<configure>
856              
857             Called by in C<bundle_config> after C<new>
858              
859             =head1 ATTRIBUTES
860              
861             =head2 C<plugins>
862              
863             B<INTERNAL>.
864              
865             ArrayRef, ro, default = [], no init arg.
866              
867             Populated during C<< $self->configure >> and returned from C<< ->bundle_config >>
868              
869             =head2 C<normal_form>
870              
871             Str, ro, lazy
872              
873             A C<normal_form> to pass to L<< C<[Git::NextVersion::Sanitized]>|Dist::Zilla::Plugin::Git::NextVersion::Sanitized >>.
874              
875             Defaults to C<numify>
876              
877             See L<< C<[::Role::Version::Sanitize]>|Dist::Zilla::Role::Version::Sanitize >>
878              
879             =head2 C<mantissa>
880              
881             Int, ro, defaults to 6.
882              
883             Defines the length of the mantissa when normal form is C<numify>.
884              
885             See L<< C<[Git::NextVersion::Sanitized]>|Dist::Zilla::Plugin::Git::NextVersion::Sanitized >> and L<< C<[::Role::Version::Sanitize]>|Dist::Zilla::Role::Version::Sanitize >>
886              
887             =head2 C<git_versions>
888              
889             Any, unused.
890              
891             =over 4
892              
893             =item * B<UNUSED>
894              
895             =back
896              
897             Since C<2.020>, this field is no longer required, and is unused, simply supported for legacy reasons.
898              
899             Things may not work if code has not been portaged to be C<Git::NextVersion> safe, but that's better than going "bang".
900              
901             But code will be assumed to be using C<Git::NextVersion>.
902              
903             =head2 C<authority>
904              
905             Str, ro, default = cpan:KENTNL
906              
907             An authority string to use for C<< [Authority] >>.
908              
909             =head2 C<auto_prereqs_skip>
910              
911             ArrayRef, ro, multivalue, default = []
912              
913             A list of prerequisites to pass to C<< [AutoPrereqs].skips >>
914              
915             =head2 C<twitter_extra_hash_tags>
916              
917             Str, ro, default = ""
918              
919             Additional hash tags to append to twitter
920              
921             =head2 C<twitter_hash_tags>
922              
923             Str, ro, default = '#perl #cpan' . extras()
924              
925             Populates C<extras> from C<twitter_extra_hash_tags>
926              
927             =head2 C<tweet_url>
928              
929             Str, ro, default = q[https://metacpan.org/release/{{$AUTHOR_UC}}/{{$DIST}}-{{$VERSION}}{{$TRIAL}}#whatsnew]
930              
931             The C<URI> to tweet to C<@kentnlrelease>
932              
933             =head2 C<toolkit_hardness>
934              
935             enum( hard, soft ), ro, default = hard
936              
937             =over 4
938              
939             =item * C<hard>
940              
941             Copy the versions of important toolkit components the author was using as C<required> dependencies,
942             forcing consumers to update aggressively on those parts.
943              
944             =item * C<soft>
945              
946             Copy the versions of important toolkit components the author was using as C<recommended> dependencies,
947             so that only consumers who are installing with C<--with-recommended> get given the forced upgrade path.
948              
949             =back
950              
951             =head2 C<toolkit>
952              
953             enum( mb, mbtiny, eumm ), ro, default = mb
954              
955             Determines which tooling to generate the distribution with
956              
957             =over 4
958              
959             =item * C<mb> : L<< C<Module::Build>|Module::Build >>
960              
961             =item * C<mbtiny> : L<< C<Module::Build::Tiny>|Module::Build::Tiny >>
962              
963             =item * C<eumm> : L<< C<ExtUtils::MakeMaker>|ExtUtils::MakeMaker >>
964              
965             =back
966              
967             =head2 C<bump_versions>
968              
969             bump_versions = 1
970              
971             If true, use C<[BumpVersionAfterRelease]> and C<[RewriteVersions::Sanitized]> instead of C<[PkgVersion]> and
972             C<[Git::NextVersion::Sanitized]>
973              
974             =head2 C<copy_files>
975              
976             An array of files generated by C<Dist::Zilla> build to copy from the built dist back to the source dist
977              
978             If not specified, the default contents are as follows:
979              
980             copy_files = LICENSE
981             copy_files = Makefile.PL
982              
983             These defaults can be wiped with:
984              
985             copy_files = none
986              
987             =head2 C<src_readme>
988              
989             src_readme = pod ; # generate README.pod on the source side
990             src_readme = mkdn ; # generate README.mkdn on the source side
991             src_readme = none ; # don't generate README on the source side
992              
993             =begin MetaPOD::JSON v1.1.0
994              
995             {
996             "namespace":"Dist::Zilla::PluginBundle::Author::KENTNL",
997             "interface":"class",
998             "inherits":"Moose::Object",
999             "does":"Dist::Zilla::Role::PluginBundle"
1000             }
1001              
1002              
1003             =end MetaPOD::JSON
1004              
1005             =for Pod::Coverage mvp_multivalue_args
1006             mvp_aliases
1007             bundle_config_inner
1008              
1009             =head1 AUTHOR
1010              
1011             Kent Fredric <kentnl@cpan.org>
1012              
1013             =head1 COPYRIGHT AND LICENSE
1014              
1015             This software is copyright (c) 2017 by Kent Fredric <kentfredric@gmail.com>.
1016              
1017             This is free software; you can redistribute it and/or modify it under
1018             the same terms as the Perl 5 programming language system itself.
1019              
1020             =cut