File Coverage

lib/Dist/Zilla/PluginBundle/Author/KENTNL.pm
Criterion Covered Total %
statement 180 206 87.3
branch 28 60 46.6
condition 5 14 35.7
subroutine 25 25 100.0
pod 4 4 100.0
total 242 309 78.3


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