File Coverage

blib/lib/Dist/Zilla/PluginBundle/NGLENN.pm
Criterion Covered Total %
statement 58 60 96.6
branch n/a
condition n/a
subroutine 20 20 100.0
pod n/a
total 78 80 97.5


line stmt bran cond sub pod time code
1 1     1   527852 use strict;
  1         2  
  1         37  
2 1     1   4 use warnings;
  1         2  
  1         62  
3              
4             package Dist::Zilla::PluginBundle::NGLENN;
5             # ABSTRACT: Dist::Zilla plugin configuration for me
6              
7             our $VERSION = '0.01';
8              
9             # Dependencies
10 1     1   3 use Moose 0.99;
  1         28  
  1         6  
11 1     1   4863 use namespace::autoclean 0.09;
  1         22  
  1         6  
12              
13 1     1   64 use Dist::Zilla 5.014; # default_jobs
  1         18  
  1         25  
14              
15 1     1   558 use Dist::Zilla::PluginBundle::Filter ();
  1         14992  
  1         30  
16 1     1   541 use Dist::Zilla::PluginBundle::Git 1.121010 ();
  1         422783  
  1         40  
17              
18 1     1   685 use Dist::Zilla::Plugin::Authority 1.006 ();
  1         182228  
  1         41  
19 1     1   684 use Dist::Zilla::Plugin::Bugtracker 1.110 ();
  1         28319  
  1         47  
20 1     1   664 use Dist::Zilla::Plugin::BumpVersionAfterRelease 0.003 (); # tweak Makefile.PL
  1         33184  
  1         39  
21 1     1   691 use Dist::Zilla::Plugin::CheckChangesHasContent ();
  1         36969  
  1         34  
22 1     1   665 use Dist::Zilla::Plugin::RunExtraTests ();
  1         31193  
  1         39  
23 1     1   642 use Dist::Zilla::Plugin::CheckMetaResources 0.001 ();
  1         38752  
  1         44  
24 1     1   931 use Dist::Zilla::Plugin::CheckPrereqsIndexed 0.002 ();
  1         17573  
  1         43  
25 1     1   703 use Dist::Zilla::Plugin::Git::Contributors 0.007 ();
  1         100863  
  1         35  
26 1     1   637 use Dist::Zilla::Plugin::CopyFilesFromBuild ();
  1         43484  
  1         41  
27 1     1   692 use Dist::Zilla::Plugin::CPANFile ();
  1         82621  
  1         31  
28 1     1   735 use Dist::Zilla::Plugin::Git::NextVersion ();
  1         64216  
  1         39  
29             # use Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch ();
30 1     1   831 use Dist::Zilla::Plugin::GithubMeta 0.36 ();
  1         108320  
  1         31  
31 1     1   256 use Dist::Zilla::Plugin::TravisYML ();
  0            
  0            
32             use Dist::Zilla::Plugin::InsertCopyright 0.001 ();
33             use Dist::Zilla::Plugin::MetaNoIndex ();
34             use Dist::Zilla::Plugin::MetaProvides::Package 1.14 (); # hides private packages
35             use Dist::Zilla::Plugin::MinimumPerl ();
36             use Dist::Zilla::Plugin::PodWeaver ();
37             use Dist::Zilla::Plugin::PromptIfStale 0.011 ();
38             use Dist::Zilla::Plugin::Prereqs::AuthorDeps ();
39             use Dist::Zilla::Plugin::RewriteVersion ();
40             use Dist::Zilla::Plugin::ReadmeFromPod 0.19 (); # for dzil v5
41             use Dist::Zilla::Plugin::TaskWeaver 0.101620 ();
42             use Dist::Zilla::Plugin::Test::Compile 2.036 (); # various features
43             use Dist::Zilla::Plugin::Test::MinimumVersion 2.000003 ();
44             use Dist::Zilla::Plugin::Test::Perl::Critic ();
45             use Dist::Zilla::Plugin::Test::PodSpelling 2.006001 (); # Pod::Wordlist
46             use Test::Portability::Files 0.06 (); # buggy before that
47             use Dist::Zilla::Plugin::Test::Portability ();
48             use Dist::Zilla::Plugin::Test::ReportPrereqs 0.016 (); # better reporting & bug fixes
49             use Dist::Zilla::Plugin::Test::Version ();
50              
51             with qw(
52             Dist::Zilla::Role::PluginBundle::Easy
53             Dist::Zilla::Role::PluginBundle::Config::Slicer
54             Dist::Zilla::Role::PluginBundle::PluginRemover
55             );
56              
57             sub mvp_multivalue_args { qw/stopwords/ }
58              
59             has stopwords => (
60             is => 'ro',
61             isa => 'Maybe[ArrayRef]',
62             lazy => 1,
63             default => sub {
64             exists $_[0]->payload->{stopwords} ? $_[0]->payload->{stopwords} : undef;
65             },
66             );
67              
68             has fake_release => (
69             is => 'ro',
70             isa => 'Bool',
71             lazy => 1,
72             default => sub { $_[0]->payload->{fake_release} },
73             );
74              
75             has no_git => (
76             is => 'ro',
77             isa => 'Bool',
78             lazy => 1,
79             default => sub { $_[0]->payload->{no_git} },
80             );
81              
82             has no_critic => (
83             is => 'ro',
84             isa => 'Bool',
85             lazy => 1,
86             default => sub {
87             exists $_[0]->payload->{no_critic} ? $_[0]->payload->{no_critic} : 0;
88             },
89             );
90              
91             has no_spellcheck => (
92             is => 'ro',
93             isa => 'Bool',
94             lazy => 1,
95             default => sub {
96             exists $_[0]->payload->{no_spellcheck}
97             ? $_[0]->payload->{no_spellcheck}
98             : 0;
99             },
100             );
101              
102             has no_coverage => (
103             is => 'ro',
104             isa => 'Bool',
105             lazy => 1,
106             default => sub {
107             exists $_[0]->payload->{no_coverage}
108             ? $_[0]->payload->{no_coverage}
109             : 0;
110             },
111             );
112              
113             has no_minimum_perl => (
114             is => 'ro',
115             isa => 'Bool',
116             lazy => 1,
117             default => sub {
118             exists $_[0]->payload->{no_minimum_perl}
119             ? $_[0]->payload->{no_minimum_perl}
120             : 0;
121             },
122             );
123              
124             has is_task => (
125             is => 'ro',
126             isa => 'Bool',
127             lazy => 1,
128             default => sub { $_[0]->payload->{is_task} },
129             );
130              
131             has auto_prereq => (
132             is => 'ro',
133             isa => 'Bool',
134             lazy => 1,
135             default => sub {
136             exists $_[0]->payload->{auto_prereq} ? $_[0]->payload->{auto_prereq} : 1;
137             },
138             );
139              
140             has tag_format => (
141             is => 'ro',
142             isa => 'Str',
143             lazy => 1,
144             default => sub {
145             exists $_[0]->payload->{tag_format} ? $_[0]->payload->{tag_format} : 'release-%v',;
146             },
147             );
148              
149             has version_regexp => (
150             is => 'ro',
151             isa => 'Str',
152             lazy => 1,
153             default => sub {
154             exists $_[0]->payload->{version_regexp}
155             ? $_[0]->payload->{version_regexp}
156             : '^release-(.+)$',
157             ;
158             },
159             );
160              
161             has weaver_config => (
162             is => 'ro',
163             isa => 'Str',
164             lazy => 1,
165             default => sub { $_[0]->payload->{weaver_config} || '@NGLENN' },
166             );
167              
168             has github_issues => (
169             is => 'ro',
170             isa => 'Str',
171             lazy => 1,
172             default => sub {
173             exists $_[0]->payload->{github_issues} ? $_[0]->payload->{github_issues} : 1;
174             },
175             );
176              
177             has git_remote => (
178             is => 'ro',
179             isa => 'Str',
180             lazy => 1,
181             default => sub {
182             exists $_[0]->payload->{git_remote} ? $_[0]->payload->{git_remote} : 'origin',;
183             },
184             );
185              
186             has authority => (
187             is => 'ro',
188             isa => 'Str',
189             lazy => 1,
190             default => sub {
191             exists $_[0]->payload->{authority} ? $_[0]->payload->{authority} : 'cpan:NGLENN';
192             },
193             );
194              
195             has darkpan => (
196             is => 'ro',
197             isa => 'Bool',
198             lazy => 1,
199             default => sub {
200             exists $_[0]->payload->{darkpan} ? $_[0]->payload->{darkpan} : 0;
201             },
202             );
203              
204             has auto_version => (
205             is => 'ro',
206             isa => 'Bool',
207             lazy => 1,
208             default => sub { $_[0]->payload->{auto_version} },
209             );
210              
211             sub configure {
212             my $self = shift;
213              
214             my @push_to = ('origin');
215             push @push_to, $self->git_remote if $self->git_remote ne 'origin';
216              
217             $self->add_plugins(
218              
219             # version number
220             ( $self->auto_version ? 'AutoVersion' : 'RewriteVersion' ),
221              
222             # contributors
223             (
224             $self->no_git
225             ? ()
226             : 'Git::Contributors'
227             ),
228              
229             # gather and prune
230             (
231             $self->no_git
232             ? [ 'GatherDir' => { exclude_filename => [qw/README.mkdn cpanfile Makefile.PL/] }
233             ] # core
234             : [
235             'Git::GatherDir' => { exclude_filename => [qw/README.mkdn cpanfile Makefile.PL/] }
236             ]
237             ),
238             'PruneCruft', # core
239             'ManifestSkip', # core
240              
241             # file munging
242             ( $self->auto_version ? 'PkgVersion' : () ),
243             'InsertCopyright',
244             (
245             $self->is_task
246             ? 'TaskWeaver'
247             : [
248             'PodWeaver' => {
249             config_plugin => $self->weaver_config,
250             replacer => 'replace_with_comment',
251             post_code_replacer => 'replace_with_nothing',
252             }
253             ]
254             ),
255              
256             # generated distribution files
257             'ReadmeFromPod', # in build dir
258             'License', # core
259              
260             # Travis config file
261             (
262             $self->no_git
263             ? ()
264             : [
265             'TravisYML' => {
266             build_branch => 'master',
267             }
268             ]
269             ),
270              
271             # generated t/ tests
272             [
273             'Test::Compile' => {
274             fake_home => 1,
275             xt_mode => 1,
276             }
277             ],
278             (
279             $self->no_minimum_perl
280             ? ()
281             : [ 'Test::MinimumVersion' => { max_target_perl => '5.010' } ]
282             ),
283             'Test::ReportPrereqs',
284              
285             # generated xt/ tests
286             (
287             $self->no_spellcheck ? ()
288             : [
289             'Test::PodSpelling' => $self->stopwords ? { stopwords => $self->stopwords } : ()
290             ]
291             ),
292             (
293             $self->no_critic ? ()
294             : ('Test::Perl::Critic')
295             ),
296             'MetaTests', # core
297             'PodSyntaxTests', # core
298             (
299             $self->no_coverage
300             ? ()
301             : ('PodCoverageTests') # core
302             ),
303             [ 'Test::Portability' => { options => "test_one_dot = 0" } ],
304             'Test::Version',
305              
306             # metadata
307             [
308             'Authority' => {
309             authority => $self->authority,
310             do_munging => 0,
311             }
312             ],
313             'MinimumPerl',
314             (
315             $self->auto_prereq
316             ? [ 'AutoPrereqs' => { skip => "^t::lib" } ]
317             : ()
318             ),
319             [
320             MetaNoIndex => {
321             directory => [qw/t xt examples corpus/],
322             'package' => [qw/DB/]
323             }
324             ],
325             [ 'MetaProvides::Package' => { meta_noindex => 1 } ], # AFTER MetaNoIndex
326             (
327             $self->darkpan
328             ? ()
329             : [
330             GithubMeta => {
331             remote => [qw(origin github)],
332             issues => $self->github_issues,
333             }
334             ],
335             ),
336             (
337             ( $self->no_git || $self->darkpan || !$self->github_issues ) ? (
338             # fake out Pod::Weaver::Section::Support
339             [
340             'Bugtracker' =>
341             { mailto => '', $self->darkpan ? ( web => "http://localhost/" ) : () }
342             ],
343             )
344             : ()
345             ),
346             (
347             ( $self->no_git || $self->darkpan )
348             ? (
349             # fake out Pod::Weaver::Section::Support
350             [
351             'MetaResources' => { map { ; "repository.$_" => "http://localhost/" } qw/url web/ }
352             ],
353             )
354             : ()
355             ),
356              
357             'Prereqs::AuthorDeps',
358             'MetaYAML', # core
359             'MetaJSON', # core
360             'CPANFile',
361              
362             # build system
363             'ExecDir', # core
364             'ShareDir', # core
365             [ 'MakeMaker' => { eumm_version => '6.17', default_jobs => 9 } ], # core
366              
367             # are we up to date?
368             [
369             'PromptIfStale' => {
370             modules => [qw/Dist::Zilla Dist::Zilla::PluginBundle::NGLENN/],
371             check_all_plugins => 1,
372             }
373             ],
374              
375             # copy files from build back to root for inclusion in VCS;
376             # for auto_version we want cpanfile. For embedded version we want Makefile.PL
377             [
378             CopyFilesFromBuild => { copy => $self->auto_version ? 'cpanfile' : 'Makefile.PL' }
379             ],
380              
381             # manifest -- must come after all generated files
382             'Manifest', # core
383              
384             # before release
385             # (
386             # $self->no_git ? ()
387             # : ('Git::CheckFor::CorrectBranch')
388             # ),
389             (
390             $self->no_git ? ()
391             : [ 'Git::Check' => {
392             # these are copied to the root by CopyFilesFromBuild
393             allow_dirty => $self->auto_version ? 'cpanfile' : 'Makefile.PL'
394             }
395             ]
396             ),
397             'CheckMetaResources',
398             'CheckPrereqsIndexed',
399             'CheckChangesHasContent',
400             [ 'RunExtraTests' => { default_jobs => 9 } ],
401             'TestRelease', # core
402             'ConfirmRelease', # core
403              
404             # release
405             ( $self->fake_release || $self->darkpan ? 'FakeRelease' : 'UploadToCPAN' ), # core
406              
407             # after release
408             # Note -- NextRelease is here to get the ordering right with
409             # git actions. It is *also* a file munger that acts earlier
410              
411             (
412             $self->no_git
413             ? ()
414             : ( [ 'Git::Tag' => { tag_format => $self->tag_format } ], )
415             ),
416              
417             # bumps Changes
418             'NextRelease', # core (also munges files)
419              
420             # bumps $VERSION, maybe
421             ( $self->auto_version ? () : 'BumpVersionAfterRelease' ),
422              
423             (
424             $self->no_git ? ()
425             : (
426             [
427             'Git::Commit' => 'Commit_Changes' => {
428             $self->auto_version ? ( commit_msg => "After release: timestamp Changes" )
429             : (
430             commit_msg => "After release: bump \$VERSION and timestamp Changes",
431             allow_dirty => [qw/Changes Makefile.PL/],
432             allow_dirty_match => '^lib',
433             )
434             }
435             ],
436             [ 'Git::Push' => { push_to => \@push_to } ],
437             )
438             ),
439              
440             );
441              
442             }
443              
444             __PACKAGE__->meta->make_immutable;
445              
446             1;
447              
448             #
449             # This file is part of Dist-Zilla-PluginBundle-NGLENN
450             #
451             # This software is Copyright (c) 2014 by Nathan Glenn.
452             #
453             # This is free software, licensed under:
454             #
455             # The Apache License, Version 2.0, January 2004
456             #
457              
458             __END__
459              
460             =pod
461              
462             =encoding UTF-8
463              
464             =head1 NAME
465              
466             Dist::Zilla::PluginBundle::NGLENN - Dist::Zilla plugin configuration for me
467              
468             =head1 VERSION
469              
470             version 0.01
471              
472             =head1 SYNOPSIS
473              
474             # in dist.ini
475             [@NGLENN]
476              
477             =head1 DESCRIPTION
478              
479             This is a L<Dist::Zilla> PluginBundle. It is roughly equivalent to the
480             following dist.ini:
481              
482             ; version provider
483             [RewriteVersion] ; also munges
484              
485             ; collect contributors list
486             [Git::Contributors]
487              
488             ; choose files to include
489             [Git::GatherDir] ; everything from git ls-files
490             exclude_filename = README.pod ; skip this generated file
491             exclude_filename = README.mkdn ; skip this generated file
492             exclude_filename = META.json ; skip this generated file
493             exclude_filename = cpanfile ; skip this generated file
494              
495             [PruneCruft] ; default stuff to skip
496             [ManifestSkip] ; if -f MANIFEST.SKIP, skip those, too
497              
498             ; file modifications
499             [InsertCopyright ; add copyright at "# COPYRIGHT"
500             [PodWeaver] ; generate Pod
501             config_plugin = @NGLENN ; my own plugin allows Pod::WikiDoc
502             replacer = replace_with_comment
503             post_code_replacer = replace_with_nothing
504              
505             ; generated files
506             [License] ; boilerplate license
507             [ReadmeFromPod] ; from Pod (runs after PodWeaver)
508             [TravisYML] ; Travis-CI configuration
509             build_branch = master
510             ; t tests
511             [Test::ReportPrereqs] ; show prereqs in automated test output
512              
513             ; xt tests
514             [Test::MinimumVersion] ; xt/release/minimum-version.t
515             max_target_perl = 5.010 ; don't use syntax/features past 5.10
516             [Test::PodSpelling] ; xt/author/pod-spell.t
517             [Test::Perl::Critic]; xt/author/critic.t
518             [MetaTests] ; xt/release/meta-yaml.t
519             [PodSyntaxTests] ; xt/release/pod-syntax.t
520             [PodCoverageTests] ; xt/release/pod-coverage.t
521             [Test::Portability] ; xt/release/portability.t (of file name)
522             options = test_one_dot = 0
523             [Test::Version] ; xt/release/test-version.t
524             [Test::Compile] ; xt/author/00-compile.t
525             fake_home = 1 ; fakes $ENV{HOME} just in case
526             xt_mode = 1 ; make sure all files compile
527              
528             ; metadata
529             [AutoPrereqs] ; find prereqs from code
530             skip = ^t::lib
531              
532             [Authority]
533             authority = cpan:NGLENN
534             do_munging = 0
535              
536             [MinimumPerl] ; determine minimum perl version
537              
538             [MetaNoIndex] ; sets 'no_index' in META
539             directory = t
540             directory = xt
541             directory = examples
542             directory = corpus
543             package = DB ; just in case
544              
545             [GithubMeta] ; set META resources
546             remote = origin
547             remote = github
548             issues = 1
549              
550             [MetaProvides::Package] ; add 'provides' to META files
551             meta_noindex = 1 ; respect prior no_index directives
552              
553             [Prereqs::AuthorDeps] ; add authordeps as develop/requires
554             [MetaYAML] ; generate META.yml (v1.4)
555             [MetaJSON] ; generate META.json (v2)
556             [CPANFile] ; generate cpanfile
557              
558             ; build system
559             [ExecDir] ; include 'bin/*' as executables
560             [ShareDir] ; include 'share/' for File::ShareDir
561             [MakeMaker] ; create Makefile.PL
562             eumm_version = 6.17
563             default_jobs = 9
564              
565             ; manifest (after all generated files)
566             [Manifest] ; create MANIFEST
567              
568             ; copy cpanfile back to repo dis
569             [CopyFilesFromBuild]
570             copy = Makefile.PL
571              
572             ; before release
573              
574             [PromptIfStale] ; check if our build tools are out of date
575             module = Dist::Zilla
576             module = Dist::Zilla::PluginBundle::NGLENN
577             check_all_plugins = 1
578              
579             [Git::Check] ; ensure all files checked in
580             allow_dirty = dist.ini
581             allow_dirty = Changes
582             allow_dirty = cpanfile
583              
584             [CheckMetaResources] ; ensure META has 'resources' data
585             [CheckPrereqsIndexed] ; ensure prereqs are on CPAN
586             [CheckChangesHasContent] ; ensure Changes has been updated
587              
588             [RunExtraTests] ; ensure xt/ tests pass
589             default_jobs = 9
590              
591             [TestRelease] ; ensure t/ tests pass
592             [ConfirmRelease] ; prompt before uploading
593              
594             ; releaser
595             [UploadToCPAN] ; uploads to CPAN
596              
597             ; after release
598             [Git::Commit / Commit_Dirty_Files] ; commit Changes (as released)
599              
600             [Git::Tag] ; tag repo with custom tag
601             tag_format = release-%v
602              
603             ; NextRelease acts *during* pre-release to write $VERSION and
604             ; timestamp to Changes and *after* release to add a new {{$NEXT}}
605             ; section, so to act at the right time after release, it must actually
606             ; come after Commit_Dirty_Files but before Commit_Changes in the
607             ; dist.ini. It will still act during pre-release as usual
608              
609             [NextRelease]
610             [BumpVersionAfterRelease]
611              
612             [Git::Commit / Commit_Changes] ; commit Changes (for new dev)
613              
614             [Git::Push] ; push repo to remote
615             push_to = origin
616              
617             This distribution was forked from the DAGOLDEN plugin bundle. The
618             abstract should really be "Dist::Zilla configuration the way NGLENN,
619             who does it the way DAGOLDEN does it, does it", but that was too
620             long. I struggled with many complexities of writing a good dist.ini,
621             but found that David Golden had solved all of them.
622              
623             I tweaked it slightly to fit my needs, most importantly to make
624             everything work on Windows. I will probably continue to pull changes
625             made to the originating DAGOLDEN distribution. See the changes file
626             for more information.
627              
628             =head1 USAGE
629              
630             To use this PluginBundle, just add it to your dist.ini. You can provide
631             the following options:
632              
633             =over 4
634              
635             =item *
636              
637             C<is_task> — this indicates whether C<TaskWeaver> or C<PodWeaver> should be used.
638              
639             Default is 0.
640              
641             =item *
642              
643             C<authority> — specifies the C<x_authority> field for pause. Defaults to 'cpan:NGLENN'.
644              
645             =item *
646              
647             C<auto_prereq> — this indicates whether C<AutoPrereqs> should be used or not. Default is 1.
648              
649             # C<auto_version> - this indicates whether C<AutoVersion> should be used or not. Default is 0.
650              
651             =item *
652              
653             C<darkpan> — for private code; uses C<FakeRelease> and fills in dummy repo/bugtracker data
654              
655             =item *
656              
657             C<fake_release> — swaps C<FakeRelease> for C<UploadToCPAN>. Mostly useful for testing a dist.ini without risking a real release.
658              
659             =item *
660              
661             C<git_remote> — where to push after release
662              
663             =item *
664              
665             C<github_issues> — whether to use github issue tracker. Defaults is 1.
666              
667             =item *
668              
669             C<stopwords> — add stopword for C<Test::PodSpelling> (can be repeated)
670              
671             =item *
672              
673             C<tag_format> — given to C<Git::Tag>. Default is 'release-%v' to be more
674              
675             robust than just the version number when parsing versions for
676             L<Git::NextVersion>
677              
678             =item *
679              
680             C<weaver_config> — specifies a L<Pod::Weaver> bundle. Defaults to @NGLENN.
681              
682             =item *
683              
684             C<version_regexp> — given to L<Git::NextVersion>. Default
685              
686             is '^release-(.+)$'
687              
688             =item *
689              
690             C<no_git> — bypass all git-dependent plugins
691              
692             =item *
693              
694             C<no_critic> — omit C<Test::Perl::Critic> tests
695              
696             =item *
697              
698             C<no_spellcheck> — omit C<Test::PodSpelling> tests
699              
700             =item *
701              
702             C<no_coverage> — omit PodCoverage tests
703              
704             =item *
705              
706             C<no_minimum_perl> — omit C<Test::MinimumVersion> tests
707              
708             =back
709              
710             When running without git, C<GatherDir> is used instead of C<Git::GatherDir>.
711             and all git check and commit operations are disabled.
712              
713             By default, versions are taken/rewritten in the source file using C<RewriteVersion>
714             and C<BumpVersionAfterRelease>. If the C<auto_version> option is true, the version
715             is set by C<AutoVersion> and munged with C<PkgVersion>. For C<auto_version> the
716             generated C<cpanfile> is copied to the repo on build; otherwise, C<Makefile.PL> is
717             copied.
718              
719             This PluginBundle now supports C<ConfigSlicer>, so you can pass in options to the
720             plugins used like this:
721              
722             [@NGLENN]
723             Test::MinimumVersion.max_target_perl = 5.014
724             ExecDir.dir = scripts
725              
726             This PluginBundle also supports C<PluginRemover>, so dropping a plugin is as easy as this:
727              
728             [@NGLENN]
729             -remove = Test::Portability
730              
731             =for Pod::Coverage configure mvp_multivalue_args
732              
733             =head1 SEE ALSO
734              
735             =over 4
736              
737             =item *
738              
739             L<Dist::Zilla>
740              
741             =item *
742              
743             L<Dist::Zilla::Plugin::PodWeaver>
744              
745             =item *
746              
747             L<Dist::Zilla::Plugin::TaskWeaver>
748              
749             =item *
750              
751             L<Dist::Zilla::PluginBundle::DAGOLDEN>
752              
753             =back
754              
755             =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
756              
757             =head1 SUPPORT
758              
759             =head2 Bugs / Feature Requests
760              
761             Please report any bugs or feature requests through the issue tracker
762             at L<https://github.com/garfieldnate/Dist-Zilla-PluginBundle-NGLENN/issues>.
763             You will be notified automatically of any progress on your issue.
764              
765             =head2 Source Code
766              
767             This is open source software. The code repository is available for
768             public review and contribution under the terms of the license.
769              
770             L<https://github.com/garfieldnate/Dist-Zilla-PluginBundle-NGLENN>
771              
772             git clone https://github.com/garfieldnate/Dist-Zilla-PluginBundle-NGLENN.git
773              
774             =head1 AUTHOR
775              
776             Nate Glenn <nglenn@cpan.org>
777              
778             =head1 CONTRIBUTORS
779              
780             =for stopwords Christian Walde David Golden Eric Johnson Karen Etheridge Nathan Glenn Philippe Bruhat (BooK) Sergey Romanov
781              
782             =over 4
783              
784             =item *
785              
786             Christian Walde <walde.christian@googlemail.com>
787              
788             =item *
789              
790             David Golden <dagolden@cpan.org>
791              
792             =item *
793              
794             Eric Johnson <eric.git@iijo.org>
795              
796             =item *
797              
798             Karen Etheridge <ether@cpan.org>
799              
800             =item *
801              
802             Nathan Glenn <garfieldnate@gmail.com>
803              
804             =item *
805              
806             Philippe Bruhat (BooK) <book@cpan.org>
807              
808             =item *
809              
810             Sergey Romanov <complefor@rambler.ru>
811              
812             =back
813              
814             =head1 COPYRIGHT AND LICENSE
815              
816             This software is Copyright (c) 2014 by Nathan Glenn.
817              
818             This is free software, licensed under:
819              
820             The Apache License, Version 2.0, January 2004
821              
822             =cut