File Coverage

lib/Dist/Zilla/Plugin/Author/SKIRMESS/RepositoryBase.pm
Criterion Covered Total %
statement 29 70 41.4
branch 0 14 0.0
condition 0 3 0.0
subroutine 10 17 58.8
pod 0 4 0.0
total 39 108 36.1


line stmt bran cond sub pod time code
1             package Dist::Zilla::Plugin::Author::SKIRMESS::RepositoryBase;
2              
3 1     1   1008 use 5.006;
  1         3  
4 1     1   5 use strict;
  1         2  
  1         20  
5 1     1   4 use warnings;
  1         2  
  1         46  
6              
7             our $VERSION = '0.031';
8              
9 1     1   5 use Moose;
  1         1  
  1         10  
10              
11             with(
12             'Dist::Zilla::Role::BeforeBuild',
13             'Dist::Zilla::Role::FileFinderUser' => {
14             method => 'found_module_files',
15             finder_arg_names => ['module_finder'],
16             default_finders => [':InstallModules'],
17             },
18             'Dist::Zilla::Role::FileFinderUser' => {
19             method => 'found_script_files',
20             finder_arg_names => ['script_finder'],
21             default_finders => [':PerlExecFiles'],
22             },
23             'Dist::Zilla::Role::FileMunger',
24             'Dist::Zilla::Role::TextTemplate',
25             );
26              
27             sub mvp_multivalue_args { return (qw( skip stopwords travis_ci_ignore_perl travis_ci_no_author_testing_perl travis_ci_osx_perl )) }
28              
29             has skip => (
30             is => 'ro',
31             isa => 'Maybe[ArrayRef]',
32             default => sub { [] },
33             );
34              
35             has stopwords => (
36             is => 'ro',
37             isa => 'Maybe[ArrayRef]',
38             default => sub { [] },
39             );
40              
41             has travis_ci_ignore_perl => (
42             is => 'ro',
43             isa => 'Maybe[ArrayRef]',
44             default => sub { [] },
45             );
46              
47             has travis_ci_no_author_testing_perl => (
48             is => 'ro',
49             isa => 'Maybe[ArrayRef]',
50             default => sub { [qw(5.8)] },
51             );
52              
53             has travis_ci_osx_perl => (
54             is => 'ro',
55             isa => 'ArrayRef[Str]',
56             default => sub { [qw(5.18)] },
57             );
58              
59             has _travis_available_perl => (
60             is => 'ro',
61             isa => 'ArrayRef[Str]',
62             default => sub { [qw( 5.8 5.10 5.12 5.14 5.16 5.18 5.20 5.22 5.24 5.26)] },
63             traits => ['Array'],
64             );
65              
66 1     1   6457 use Carp;
  1         3  
  1         73  
67 1     1   429 use Config::Std { def_sep => q{=} };
  1         11928  
  1         17  
68 1     1   58 use File::Spec;
  1         1  
  1         26  
69 1     1   375 use List::SomeUtils qw(uniq);
  1         5023  
  1         71  
70 1     1   8 use Path::Tiny;
  1         2  
  1         42  
71              
72 1     1   6 use namespace::autoclean;
  1         1  
  1         10  
73              
74             sub before_build {
75 0     0 0   my ($self) = @_;
76              
77             # Files must exist during the "gather files" phase and therefore we're
78             # forced to create them in the "before build" phase.
79 0           $self->_write_files();
80              
81 0           return;
82             }
83              
84             sub munge_files {
85 0     0 0   my ($self) = @_;
86              
87             # Files are already generated in the before build phase.
88              
89             # This module is part of the Author::SKIRMESS plugin bundle. The bundle
90             # is either used to release itself, but also to release other
91             # distributions. We must know which kind of build the current build is
92             # because if we build another distribution we are done, the files were
93             # already correctly generated during the "before build" phase.
94             #
95             # But if we are using the bundle to release itself we have to recreate
96             # the generated files because the new version of this plugin was not
97             # known during the "before build" phase.
98             #
99             # If __FILE__ is inside lib of the cwd we are run with Bootstrap::lib
100             # which means we are building the bundle. Otherwise we use the bundle to
101             # build another distribution.
102 0 0 0       if ( exists $ENV{DZIL_RELEASING} && path('lib')->realpath->subsumes( path(__FILE__)->realpath() ) ) {
103              
104             # Ok, we are releasing the bundle itself. That means that $VERSION of
105             # this module is not set correctly as the module was require'd before
106             # the $VERSION was adjusted in the file (during the "munge files"
107             # phase). We have to fix this now to write the correct version to the
108             # generated files.
109              
110             # NOTE: Just a reminder if someone wants to refactor this module.
111             # $self->zilla->version() must not be called in the "before build"
112             # phase because it calls _build_version which is going to fail the
113             # build. Besides that, VersionFromMainModule is run during the
114             # "munge files" phase and before that we can't even know the new
115             # version of the bundle.
116              
117 0           local $VERSION = $self->zilla->version;
118              
119             # re-write all generated files
120 0           $self->_write_files();
121              
122 0           return;
123             }
124              
125             # We are building, or releasing something else - not the bundle itself.
126              
127             # We always have to write t/00-load.t during the munge files phase
128             # because this file is not created correctly during the before
129             # build phase because the FileFinderUser isn't initialized that
130             # early
131 0           $self->_write_file('t/00-load.t');
132 0           return;
133             }
134              
135             sub _write_files {
136 0     0     my ($self) = @_;
137              
138 0 0         my %file_to_skip = map { $_ => 1 } grep { defined && !m{ ^ \s* $ }xsm } @{ $self->skip };
  0            
  0            
  0            
139              
140             FILE:
141 0           for my $file ( sort $self->files() ) {
142 0 0         if ( exists $file_to_skip{$file} ) {
143 0           next FILE;
144             }
145              
146 0           $self->_write_file($file);
147             }
148              
149 0           return;
150             }
151              
152             sub _write_file {
153 0     0     my ( $self, $file ) = @_;
154              
155 0           $file = path($file);
156              
157 0 0         if ( -e $file ) {
158 0           $file->remove();
159             }
160             else {
161             # If the file does not yet exist, the basedir might also not
162             # exist. Create it if required.
163 0           my $parent = $file->parent();
164 0 0         if ( !-e $parent ) {
165 0           $self->log("Creating directory $parent");
166 0           $parent->mkpath();
167             }
168             }
169              
170 0           $self->log("Generate file $file");
171              
172             # write the file to disk
173 0           $file->spew( $self->file($file) );
174              
175 0           return;
176             }
177              
178             =pod
179              
180             =encoding UTF-8
181              
182             =head1 NAME
183              
184             Dist::Zilla::Plugin::Author::SKIRMESS::RepositoryBase - Automatically create and update files
185              
186             =head1 VERSION
187              
188             Version 0.031
189              
190             =head1 SYNOPSIS
191              
192             This plugin is part of the
193             L<Dist::Zilla::PluginBundle::Author::SKIRMESS|Dist::Zilla::PluginBundle::Author::SKIRMESS>
194             bundle and should not be used outside of that.
195              
196             =head1 DESCRIPTION
197              
198             This plugin creates a collection of files that are shared between all my
199             CPAN distributions which makes it easy to keep them all up to date.
200              
201             The following files are created in the repository and in the distribution:
202              
203             =cut
204              
205             {
206             # Files to generate
207             my %file;
208              
209             sub files {
210 0     0 0   my ($self) = @_;
211              
212 0           return keys %file;
213             }
214              
215             sub file {
216 0     0 0   my ( $self, $filename ) = @_;
217              
218 0 0         if ( !exists $file{$filename} ) {
219 0           $self->log_fatal("File '$filename' is not defined");
220              
221             # log_fatal should die
222 0           croak 'internal error';
223             }
224              
225 0           my $file_content = $file{$filename};
226 0 0   0     if ( ref $file_content eq ref sub { } ) {
227 0           $file_content = $file_content->($self);
228             }
229              
230             # process the file template
231 0           return $self->fill_in_string(
232             $file_content,
233             {
234             plugin => \$self,
235             },
236             );
237             }
238              
239             =head2 .appveyor.yml
240              
241             The configuration file for AppVeyor.
242              
243             =cut
244              
245             $file{q{.appveyor.yml}} = <<'APPVEYOR_YML';
246             # Automatically generated file
247             # {{ ref $plugin }} {{ $plugin->VERSION() }}
248              
249             skip_tags: true
250              
251             cache:
252             - C:\strawberry -> appveyor.yml
253              
254             install:
255             - if not exist "C:\strawberry" cinst strawberryperl
256             - set PATH=C:\strawberry\perl\bin;C:\strawberry\perl\site\bin;C:\strawberry\c\bin;%PATH%
257             - cd %APPVEYOR_BUILD_FOLDER%
258             - cpanm --quiet --installdeps --notest --skip-satisfied --with-develop .
259              
260             build_script:
261             - perl Makefile.PL
262             - gmake
263              
264             test_script:
265             - set AUTOMATED_TESTING=1
266             - gmake test
267             - prove -lr xt/author
268             APPVEYOR_YML
269              
270             =head2 .perlcriticrc
271              
272             The configuration for L<Perl::Critic|Perl::Critic>. This file is created from
273             a default contained in this plugin and from distribution specific settings in
274             F<perlcriticrc.local>.
275              
276             =cut
277              
278             $file{q{.perlcriticrc}} = sub {
279             my ($self) = @_;
280              
281             my $perlcriticrc_template = <<'PERLCRITICRC_TEMPLATE';
282             # Automatically generated file
283             # {{ ref $plugin }} {{ $plugin->VERSION() }}
284              
285             only = 1
286             severity = 1
287             verbose = [%p] %m at %f line %l, near '%r'\n
288              
289             # ----------------------------------------------------------
290             # Core policies
291             # ----------------------------------------------------------
292              
293             [BuiltinFunctions::ProhibitBooleanGrep]
294             [BuiltinFunctions::ProhibitComplexMappings]
295             [BuiltinFunctions::ProhibitLvalueSubstr]
296             [BuiltinFunctions::ProhibitReverseSortBlock]
297             [BuiltinFunctions::ProhibitSleepViaSelect]
298             [BuiltinFunctions::ProhibitStringyEval]
299             [BuiltinFunctions::ProhibitStringySplit]
300             [BuiltinFunctions::ProhibitUniversalCan]
301             [BuiltinFunctions::ProhibitUniversalIsa]
302             [BuiltinFunctions::ProhibitUselessTopic]
303             [BuiltinFunctions::ProhibitVoidGrep]
304             [BuiltinFunctions::ProhibitVoidMap]
305             [BuiltinFunctions::RequireBlockGrep]
306             [BuiltinFunctions::RequireBlockMap]
307             [BuiltinFunctions::RequireGlobFunction]
308             [BuiltinFunctions::RequireSimpleSortBlock]
309             [ClassHierarchies::ProhibitAutoloading]
310             [ClassHierarchies::ProhibitExplicitISA]
311             [ClassHierarchies::ProhibitOneArgBless]
312             [CodeLayout::ProhibitHardTabs]
313             [CodeLayout::ProhibitParensWithBuiltins]
314             [CodeLayout::ProhibitQuotedWordLists]
315             [CodeLayout::ProhibitTrailingWhitespace]
316             [CodeLayout::RequireConsistentNewlines]
317             [CodeLayout::RequireTidyCode]
318             [CodeLayout::RequireTrailingCommas]
319             [ControlStructures::ProhibitCStyleForLoops]
320             [ControlStructures::ProhibitCascadingIfElse]
321             [ControlStructures::ProhibitDeepNests]
322             [ControlStructures::ProhibitLabelsWithSpecialBlockNames]
323             [ControlStructures::ProhibitMutatingListFunctions]
324             [ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions]
325             [ControlStructures::ProhibitPostfixControls]
326             [ControlStructures::ProhibitUnlessBlocks]
327             [ControlStructures::ProhibitUnreachableCode]
328             [ControlStructures::ProhibitUntilBlocks]
329             [ControlStructures::ProhibitYadaOperator]
330             #[Documentation::PodSpelling]
331             [Documentation::RequirePackageMatchesPodName]
332             [Documentation::RequirePodAtEnd]
333             [Documentation::RequirePodLinksIncludeText]
334             #[Documentation::RequirePodSections]
335              
336             [ErrorHandling::RequireCarping]
337             allow_in_main_unless_in_subroutine = 1
338              
339             [ErrorHandling::RequireCheckingReturnValueOfEval]
340             [InputOutput::ProhibitBacktickOperators]
341             [InputOutput::ProhibitBarewordFileHandles]
342             [InputOutput::ProhibitExplicitStdin]
343             [InputOutput::ProhibitInteractiveTest]
344             [InputOutput::ProhibitJoinedReadline]
345             [InputOutput::ProhibitOneArgSelect]
346             [InputOutput::ProhibitReadlineInForLoop]
347             [InputOutput::ProhibitTwoArgOpen]
348             [InputOutput::RequireBracedFileHandleWithPrint]
349             #[InputOutput::RequireBriefOpen]
350             [InputOutput::RequireCheckedClose]
351             [InputOutput::RequireCheckedOpen]
352              
353             [InputOutput::RequireCheckedSyscalls]
354             functions = :builtins
355             exclude_functions = print say sleep
356              
357             [InputOutput::RequireEncodingWithUTF8Layer]
358             [Miscellanea::ProhibitFormats]
359             [Miscellanea::ProhibitTies]
360             [Miscellanea::ProhibitUnrestrictedNoCritic]
361             [Miscellanea::ProhibitUselessNoCritic]
362             [Modules::ProhibitAutomaticExportation]
363             [Modules::ProhibitConditionalUseStatements]
364              
365             [Modules::ProhibitEvilModules]
366             modules = Class::ISA {Found use of Class::ISA. This module is deprecated by the Perl 5 Porters.} Pod::Plainer {Found use of Pod::Plainer. This module is deprecated by the Perl 5 Porters.} Shell {Found use of Shell. This module is deprecated by the Perl 5 Porters.} Switch {Found use of Switch. This module is deprecated by the Perl 5 Porters.} Readonly {Found use of Readonly. Please use constant.pm or Const::Fast.} base {Found use of base. Please use parent instead.} File::Slurp {Found use of File::Slurp. Please use Path::Tiny instead.} common::sense {Found use of common::sense. Please use strict and warnings instead.} Class::Load {Found use of Class::Load. Please use Module::Runtime instead.} Any::Moose {Found use of Any::Moose. Please use Moo instead.} Error {Found use of Error.pm. Please use Throwable.pm instead.} Getopt::Std {Found use of Getopt::Std. Please use Getopt::Long instead.} HTML::Template {Found use of HTML::Template. Please use Template::Toolkit.} IO::Socket::INET6 {Found use of IO::Socket::INET6. Please use IO::Socket::IP.} JSON {Found use of JSON. Please use JSON::MaybeXS or Cpanel::JSON::XS.} JSON::XS {Found use of JSON::XS. Please use JSON::MaybeXS or Cpanel::JSON::XS.} JSON::Any {Found use of JSON::Any. Please use JSON::MaybeXS.} List::MoreUtils {Found use of List::MoreUtils. Please use List::Util or List::UtilsBy.} Mouse {Found use of Mouse. Please use Moo.} Net::IRC {Found use of Net::IRC. Please use POE::Component::IRC, Net::Async::IRC, or Mojo::IRC.} XML::Simple {Found use of XML::Simple. Please use XML::LibXML, XML::TreeBuilder, XML::Twig, or Mojo::DOM.} Sub::Infix {Found use of Sub::Infix. Please do not use it.}
367              
368             #[Modules::ProhibitExcessMainComplexity]
369             [Modules::ProhibitMultiplePackages]
370             [Modules::RequireBarewordIncludes]
371             [Modules::RequireEndWithOne]
372             [Modules::RequireExplicitPackage]
373             [Modules::RequireFilenameMatchesPackage]
374             [Modules::RequireNoMatchVarsWithUseEnglish]
375             #[Modules::RequireVersionVar]
376             [NamingConventions::Capitalization]
377             [NamingConventions::ProhibitAmbiguousNames]
378             [Objects::ProhibitIndirectSyntax]
379             [References::ProhibitDoubleSigils]
380             [RegularExpressions::ProhibitCaptureWithoutTest]
381             [RegularExpressions::ProhibitComplexRegexes]
382             [RegularExpressions::ProhibitEnumeratedClasses]
383             [RegularExpressions::ProhibitEscapedMetacharacters]
384             [RegularExpressions::ProhibitFixedStringMatches]
385             [RegularExpressions::ProhibitSingleCharAlternation]
386             [RegularExpressions::ProhibitUnusedCapture]
387             [RegularExpressions::ProhibitUnusualDelimiters]
388             [RegularExpressions::ProhibitUselessTopic]
389             [RegularExpressions::RequireBracesForMultiline]
390             [RegularExpressions::RequireDotMatchAnything]
391             [RegularExpressions::RequireExtendedFormatting]
392             [RegularExpressions::RequireLineBoundaryMatching]
393             [Subroutines::ProhibitAmpersandSigils]
394             [Subroutines::ProhibitBuiltinHomonyms]
395             [Subroutines::ProhibitExcessComplexity]
396             [Subroutines::ProhibitExplicitReturnUndef]
397             [Subroutines::ProhibitManyArgs]
398             [Subroutines::ProhibitNestedSubs]
399             [Subroutines::ProhibitReturnSort]
400             [Subroutines::ProhibitSubroutinePrototypes]
401              
402             [Subroutines::ProhibitUnusedPrivateSubroutines]
403             private_name_regex = _(?!build_)\w+
404              
405             [Subroutines::ProtectPrivateSubs]
406             [Subroutines::RequireArgUnpacking]
407             [Subroutines::RequireFinalReturn]
408             [TestingAndDebugging::ProhibitNoStrict]
409             [TestingAndDebugging::ProhibitNoWarnings]
410             [TestingAndDebugging::ProhibitProlongedStrictureOverride]
411             [TestingAndDebugging::RequireTestLabels]
412             [TestingAndDebugging::RequireUseStrict]
413             [TestingAndDebugging::RequireUseWarnings]
414             [ValuesAndExpressions::ProhibitCommaSeparatedStatements]
415              
416             [ValuesAndExpressions::ProhibitComplexVersion]
417             forbid_use_version = 1
418              
419             [ValuesAndExpressions::ProhibitConstantPragma]
420             [ValuesAndExpressions::ProhibitEmptyQuotes]
421             [ValuesAndExpressions::ProhibitEscapedCharacters]
422             [ValuesAndExpressions::ProhibitImplicitNewlines]
423             [ValuesAndExpressions::ProhibitInterpolationOfLiterals]
424             [ValuesAndExpressions::ProhibitLeadingZeros]
425             [ValuesAndExpressions::ProhibitLongChainsOfMethodCalls]
426             [ValuesAndExpressions::ProhibitMagicNumbers]
427             [ValuesAndExpressions::ProhibitMismatchedOperators]
428             [ValuesAndExpressions::ProhibitMixedBooleanOperators]
429             [ValuesAndExpressions::ProhibitNoisyQuotes]
430             [ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters]
431             [ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator]
432             [ValuesAndExpressions::ProhibitVersionStrings]
433             [ValuesAndExpressions::RequireConstantVersion]
434             [ValuesAndExpressions::RequireInterpolationOfMetachars]
435             [ValuesAndExpressions::RequireNumberSeparators]
436             [ValuesAndExpressions::RequireQuotedHeredocTerminator]
437             [ValuesAndExpressions::RequireUpperCaseHeredocTerminator]
438             [Variables::ProhibitAugmentedAssignmentInDeclaration]
439             [Variables::ProhibitConditionalDeclarations]
440             [Variables::ProhibitEvilVariables]
441             [Variables::ProhibitLocalVars]
442             [Variables::ProhibitMatchVars]
443             [Variables::ProhibitPackageVars]
444             [Variables::ProhibitPerl4PackageNames]
445              
446             [Variables::ProhibitPunctuationVars]
447             allow = $@ $! $/ $0
448              
449             [Variables::ProhibitReusedNames]
450             [Variables::ProhibitUnusedVariables]
451             [Variables::ProtectPrivateVars]
452             [Variables::RequireInitializationForLocalVars]
453             [Variables::RequireLexicalLoopIterators]
454             [Variables::RequireLocalizedPunctuationVars]
455             [Variables::RequireNegativeIndices]
456              
457             # ----------------------------------------------------------
458             # Perl::Critic::Bangs
459             # ----------------------------------------------------------
460              
461             [Bangs::ProhibitBitwiseOperators]
462             #[Bangs::ProhibitCommentedOutCode]
463             [Bangs::ProhibitDebuggingModules]
464             [Bangs::ProhibitFlagComments]
465             #[Bangs::ProhibitNoPlan]
466             [Bangs::ProhibitNumberedNames]
467             [Bangs::ProhibitRefProtoOrProto]
468             [Bangs::ProhibitUselessRegexModifiers]
469             #[Bangs::ProhibitVagueNames]
470              
471             # ----------------------------------------------------------
472             # Perl::Critic::Moose
473             # ----------------------------------------------------------
474              
475             [Moose::ProhibitDESTROYMethod]
476             equivalent_modules = Moo Moo::Role
477              
478             [Moose::ProhibitLazyBuild]
479             equivalent_modules = Moo Moo::Role
480              
481             [Moose::ProhibitMultipleWiths]
482             equivalent_modules = Moo Moo::Role
483              
484             [Moose::ProhibitNewMethod]
485             equivalent_modules = Moo Moo::Role
486              
487             [Moose::RequireCleanNamespace]
488             [Moose::RequireMakeImmutable]
489              
490             # ----------------------------------------------------------
491             # Perl::Critic::Freenode
492             # ----------------------------------------------------------
493              
494             [Freenode::AmpersandSubCalls]
495             [Freenode::ArrayAssignAref]
496             [Freenode::BarewordFilehandles]
497             [Freenode::ConditionalDeclarations]
498             [Freenode::ConditionalImplicitReturn]
499             [Freenode::DeprecatedFeatures]
500             [Freenode::DiscouragedModules]
501             [Freenode::DollarAB]
502             [Freenode::Each]
503             #[Freenode::EmptyReturn]
504             [Freenode::IndirectObjectNotation]
505             [Freenode::ModPerl]
506             [Freenode::OpenArgs]
507             [Freenode::OverloadOptions]
508             [Freenode::PackageMatchesFilename]
509             [Freenode::POSIXImports]
510             [Freenode::Prototypes]
511             [Freenode::StrictWarnings]
512             [Freenode::Threads]
513             [Freenode::Wantarray]
514             [Freenode::WarningsSwitch]
515             [Freenode::WhileDiamondDefaultAssignment]
516              
517             # ----------------------------------------------------------
518             # Perl::Critic::Policy::HTTPCookies
519             # ----------------------------------------------------------
520              
521             [HTTPCookies]
522              
523             # ----------------------------------------------------------
524             # Perl::Critic::Itch
525             # ----------------------------------------------------------
526              
527             #[CodeLayout::ProhibitHashBarewords]
528              
529             # ----------------------------------------------------------
530             # Perl::Critic::Lax
531             # ----------------------------------------------------------
532              
533             [Lax::ProhibitComplexMappings::LinesNotStatements]
534             #[Lax::ProhibitEmptyQuotes::ExceptAsFallback]
535             #[Lax::ProhibitLeadingZeros::ExceptChmod]
536             #[Lax::ProhibitStringyEval::ExceptForRequire]
537             #[Lax::RequireConstantOnLeftSideOfEquality::ExceptEq]
538             #[Lax::RequireEndWithTrueConst]
539             #[Lax::RequireExplicitPackage::ExceptForPragmata]
540              
541             # ----------------------------------------------------------
542             # Perl::Critic::More
543             # ----------------------------------------------------------
544              
545             #[CodeLayout::RequireASCII]
546             #[Editor::RequireEmacsFileVariables]
547             #[ErrorHandling::RequireUseOfExceptions]
548             [Modules::PerlMinimumVersion]
549             [Modules::RequirePerlVersion]
550             #[ValuesAndExpressions::RequireConstantOnLeftSideOfEquality]
551             #[ValuesAndExpressions::RestrictLongStrings]
552              
553             # ----------------------------------------------------------
554             # Perl::Critic::PetPeeves::JTRAMMELL
555             # ----------------------------------------------------------
556              
557             [Variables::ProhibitUselessInitialization]
558              
559             # ----------------------------------------------------------
560             # Perl::Critic::Policy::BuiltinFunctions::ProhibitDeleteOnArrays
561             # ----------------------------------------------------------
562              
563             [BuiltinFunctions::ProhibitDeleteOnArrays]
564              
565             # ----------------------------------------------------------
566             # Perl::Critic::Policy::BuiltinFunctions::ProhibitReturnOr
567             # ----------------------------------------------------------
568              
569             [BuiltinFunctions::ProhibitReturnOr]
570              
571             # ----------------------------------------------------------
572             # Perl::Critic::Policy::Moo::ProhibitMakeImmutable
573             # ----------------------------------------------------------
574              
575             [Moo::ProhibitMakeImmutable]
576              
577             # ----------------------------------------------------------
578             # Perl::Critic::Policy::ValuesAndExpressions::ProhibitSingleArgArraySlice
579             # requires Perl 5.12
580             # ----------------------------------------------------------
581              
582             #[ValuesAndExpressions::ProhibitSingleArgArraySlice]
583              
584             # ----------------------------------------------------------
585             # Perl::Critic::Policy::Perlsecret
586             # ----------------------------------------------------------
587              
588             [Perlsecret]
589              
590             # ----------------------------------------------------------
591             # Perl::Critic::Policy::TryTiny::RequireBlockTermination
592             # ----------------------------------------------------------
593              
594             [TryTiny::RequireBlockTermination]
595              
596             # ----------------------------------------------------------
597             # Perl::Critic::Policy::TryTiny::RequireUse
598             # ----------------------------------------------------------
599              
600             [TryTiny::RequireUse]
601              
602             # ----------------------------------------------------------
603             # Perl::Critic::Policy::ValuesAndExpressions::PreventSQLInjection
604             # ----------------------------------------------------------
605              
606             [ValuesAndExpressions::PreventSQLInjection]
607              
608             # ----------------------------------------------------------
609             # Perl::Critic::Policy::Variables::ProhibitUnusedVarsStricter
610             # ----------------------------------------------------------
611              
612             [Variables::ProhibitUnusedVarsStricter]
613             allow_unused_subroutine_arguments = 1
614              
615             # ----------------------------------------------------------
616             # Perl::Critic::Pulp
617             # ----------------------------------------------------------
618              
619             [CodeLayout::ProhibitFatCommaNewline]
620             #[CodeLayout::ProhibitIfIfSameLine]
621             [CodeLayout::RequireFinalSemicolon]
622             [CodeLayout::RequireTrailingCommaAtNewline]
623             [Compatibility::ConstantLeadingUnderscore]
624             [Compatibility::ConstantPragmaHash]
625             #[Compatibility::Gtk2Constants]
626             [Compatibility::PerlMinimumVersionAndWhy]
627             #[Compatibility::PodMinimumVersion]
628             [Compatibility::ProhibitUnixDevNull]
629             [Documentation::ProhibitAdjacentLinks]
630             [Documentation::ProhibitBadAproposMarkup]
631             [Documentation::ProhibitDuplicateHeadings]
632             #[Documentation::ProhibitDuplicateSeeAlso]
633             [Documentation::ProhibitLinkToSelf]
634             [Documentation::ProhibitParagraphEndComma]
635             [Documentation::ProhibitParagraphTwoDots]
636             [Documentation::ProhibitUnbalancedParens]
637             [Documentation::ProhibitVerbatimMarkup]
638             [Documentation::RequireEndBeforeLastPod]
639             [Documentation::RequireFilenameMarkup]
640             #[Documentation::RequireFinalCut]
641             [Documentation::RequireLinkedURLs]
642             #[Miscellanea::TextDomainPlaceholders]
643             #[Miscellanea::TextDomainUnused]
644             [Modules::ProhibitModuleShebang]
645             [Modules::ProhibitPOSIXimport]
646             [Modules::ProhibitUseQuotedVersion]
647             [ValuesAndExpressions::ConstantBeforeLt]
648             [ValuesAndExpressions::NotWithCompare]
649             [ValuesAndExpressions::ProhibitArrayAssignAref]
650             [ValuesAndExpressions::ProhibitBarewordDoubleColon]
651             [ValuesAndExpressions::ProhibitDuplicateHashKeys]
652             [ValuesAndExpressions::ProhibitEmptyCommas]
653             #[ValuesAndExpressions::ProhibitFiletest_f]
654             [ValuesAndExpressions::ProhibitNullStatements]
655             [ValuesAndExpressions::ProhibitUnknownBackslash]
656             [ValuesAndExpressions::RequireNumericVersion]
657             [ValuesAndExpressions::UnexpandedSpecialLiteral]
658              
659             # ----------------------------------------------------------
660             # Perl::Critic::StricterSubs
661             # ----------------------------------------------------------
662              
663             [Modules::RequireExplicitInclusion]
664             #[Subroutines::ProhibitCallsToUndeclaredSubs]
665             #[Subroutines::ProhibitCallsToUnexportedSubs]
666             [Subroutines::ProhibitExportingUndeclaredSubs]
667             [Subroutines::ProhibitQualifiedSubDeclarations]
668              
669             # ----------------------------------------------------------
670             # Perl::Critic::Tics
671             # ----------------------------------------------------------
672              
673             #[Tics::ProhibitLongLines]
674             [Tics::ProhibitManyArrows]
675             [Tics::ProhibitUseBase]
676             PERLCRITICRC_TEMPLATE
677              
678             # Conig::Std will not preserve a comment on the last line, therefore
679             # we append at least one empty line at the end
680             $perlcriticrc_template .= "\n\n";
681              
682             read_config \$perlcriticrc_template, my %perlcriticrc;
683              
684             my $perlcriticrc_local = 'perlcriticrc.local';
685              
686             if ( -f $perlcriticrc_local ) {
687             $self->log("Adjusting Perl::Critic config from '$perlcriticrc_local'");
688              
689             read_config $perlcriticrc_local, my %perlcriticrc_local;
690              
691             my %local_seen;
692              
693             POLICY:
694             for my $policy ( keys %perlcriticrc_local ) {
695              
696             if ( $policy eq q{-} ) {
697             $self->log_fatal('We cannot disable the global settings');
698              
699             # log_fatal should die
700             croak 'internal error';
701             }
702              
703             my $policy_name = $policy =~ m{ ^ - (.+) }xsm ? $1 : $policy;
704              
705             if ( exists $local_seen{$policy_name} ) {
706             $self->log_fatal("There are multiple entries for policy '$policy_name' in '$perlcriticrc_local'.");
707              
708             # log_fatal should die
709             croak 'internal error';
710             }
711              
712             $local_seen{$policy_name} = 1;
713              
714             delete $perlcriticrc{$policy_name};
715              
716             if ( $policy =~ m{ ^ - }xsm ) {
717             $self->log("Disabling policy '$policy_name'");
718             next POLICY;
719             }
720              
721             if ( $policy eq q{} ) {
722             $self->log('Custom global settings');
723             }
724             else {
725             $self->log("Custom configuration for policy '$policy_name'");
726             }
727              
728             $perlcriticrc{$policy_name} = $perlcriticrc_local{$policy_name};
729             }
730             }
731              
732             if ( ( !exists $perlcriticrc{q{}}{only} ) or ( $perlcriticrc{q{}}{only} ne '1' ) ) {
733             $self->log(q{Setting global option 'only' back to '1'});
734             $perlcriticrc{q{}}{only} = '1';
735             }
736              
737             my $content;
738             write_config %perlcriticrc, \$content;
739              
740             return $content;
741             };
742              
743             =head2 .perltidyrc
744              
745             The configuration file for B<perltidy>.
746              
747             =cut
748              
749             $file{q{.perltidyrc}} = <<'PERLTIDYRC';
750             # Automatically generated file
751             # {{ ref $plugin }} {{ $plugin->VERSION() }}
752              
753             --maximum-line-length=0
754             --break-at-old-comma-breakpoints
755             --backup-and-modify-in-place
756             --output-line-ending=unix
757             PERLTIDYRC
758              
759             =head2 .travis.yml
760              
761             The configuration file for TravisCI. All known supported Perl versions are
762             enabled unless disabled with B<travis_ci_ignore_perl>.
763              
764             With B<travis_ci_osx_perl> you can specify one or multiple Perl versions to
765             be tested on OSX, in addition to on Linux. If omitted it defaults to one
766             single version.
767              
768             Use the B<travis_ci_no_author_testing_perl> option to disable author tests on
769             some Perl versions.
770              
771             =cut
772              
773             $file{q{.travis.yml}} = sub {
774             my ($self) = @_;
775              
776             my $travis_yml = <<'TRAVIS_YML_1';
777             # Automatically generated file
778             # {{ ref $plugin }} {{ $plugin->VERSION() }}
779              
780             language: perl
781              
782             cache:
783             directories:
784             - ~/perl5
785              
786             env:
787             global:
788             - AUTOMATED_TESTING=1
789              
790             matrix:
791             include:
792             TRAVIS_YML_1
793              
794             my %ignore_perl;
795             @ignore_perl{ @{ $self->travis_ci_ignore_perl } } = ();
796              
797             my %no_auth;
798             @no_auth{ @{ $self->travis_ci_no_author_testing_perl } } = ();
799              
800             my %osx_perl;
801             @osx_perl{ @{ $self->travis_ci_osx_perl } } = ();
802              
803             PERL:
804             for my $perl ( @{ $self->_travis_available_perl } ) {
805             next PERL if exists $ignore_perl{$perl};
806              
807             my @os = (undef);
808             if ( exists $osx_perl{$perl} ) {
809             push @os, 'osx';
810             }
811              
812             for my $os (@os) {
813             $travis_yml .= " - perl: '$perl'\n";
814              
815             if ( !exists $no_auth{$perl} ) {
816             $travis_yml .= " env: AUTHOR_TESTING=1\n";
817             }
818              
819             if ( defined $os ) {
820             $travis_yml .= " os: $os\n";
821             }
822              
823             $travis_yml .= "\n";
824             }
825             }
826              
827             $travis_yml .= <<'TRAVIS_YML';
828             before_install:
829             - |
830             case "${TRAVIS_OS_NAME}" in
831             "linux" )
832             ;;
833             "osx" )
834             # TravisCI extracts the broken perl archive with sudo which creates the
835             # $HOME/perl5 directory with owner root:staff. Subdirectories under
836             # perl5 are owned by user travis.
837             sudo chown "$USER" "$HOME/perl5"
838              
839             # The perl distribution TravisCI extracts on OSX is incomplete
840             sudo rm -rf "$HOME/perl5/perlbrew"
841              
842             # Install cpanm and local::lib
843             curl -L https://cpanmin.us | perl - App::cpanminus local::lib
844             eval $(perl -I $HOME/perl5/lib/perl5/ -Mlocal::lib)
845             ;;
846             esac
847              
848             install:
849             - |
850             if [ -n "$AUTHOR_TESTING" ]
851             then
852             cpanm --quiet --installdeps --notest --skip-satisfied --with-develop .
853             else
854             cpanm --quiet --installdeps --notest --skip-satisfied .
855             fi
856              
857             script:
858             - perl Makefile.PL && make test
859             - |
860             if [ -n "$AUTHOR_TESTING" ]
861             then
862             prove -lr xt/author
863             fi
864             TRAVIS_YML
865              
866             return $travis_yml;
867             };
868              
869             # test header
870             my $test_header = <<'_TEST_HEADER';
871             #!perl
872              
873             use 5.006;
874             use strict;
875             use warnings;
876              
877             # this test was generated with
878             # {{ ref $plugin }} {{ $plugin->VERSION() }}
879              
880             _TEST_HEADER
881              
882             =head2 t/00-load.t
883              
884             Verifies that all modules and perl scripts can be compiled with require_ok
885             from L<Test::More|Test::More>.
886              
887             =cut
888              
889             $file{q{t/00-load.t}} = sub {
890             my ($self) = @_;
891              
892             my %use_lib_args = (
893             lib => undef,
894             q{.} => undef,
895             );
896              
897             my @modules;
898             MODULE:
899             for my $module ( map { $_->name } @{ $self->found_module_files() } ) {
900             next MODULE if $module =~ m{ [.] pod $}xsm;
901              
902             my @dirs = File::Spec->splitdir($module);
903             if ( $dirs[0] eq 'lib' && $dirs[-1] =~ s{ [.] pm $ }{}xsm ) {
904             shift @dirs;
905             push @modules, join q{::}, @dirs;
906             $use_lib_args{lib} = 1;
907             next MODULE;
908             }
909              
910             $use_lib_args{q{.}} = 1;
911             push @modules, $module;
912             }
913              
914             my @scripts = map { $_->name } @{ $self->found_script_files() };
915             if (@scripts) {
916             $use_lib_args{q{.}} = 1;
917             }
918              
919             my $content = $test_header . <<'T_OO_LOAD_T';
920             use Test::More;
921              
922             T_OO_LOAD_T
923              
924             if ( !@scripts && !@modules ) {
925             $content .= qq{BAIL_OUT("No files found in distribution");\n};
926              
927             return $content;
928             }
929              
930             $content .= 'use lib qw(';
931             if ( defined $use_lib_args{lib} ) {
932             if ( defined $use_lib_args{q{.}} ) {
933             $content .= 'lib .';
934             }
935             else {
936             $content .= 'lib';
937             }
938             }
939             else {
940             $content .= q{.};
941             }
942             $content .= ");\n\n";
943              
944             $content .= "my \@modules = qw(\n";
945              
946             for my $module ( @modules, @scripts ) {
947             $content .= " $module\n";
948             }
949             $content .= <<'T_OO_LOAD_T';
950             );
951              
952             plan tests => scalar @modules;
953              
954             for my $module (@modules) {
955             require_ok($module) || BAIL_OUT();
956             }
957             T_OO_LOAD_T
958              
959             return $content;
960             };
961              
962             =head2 xt/author/clean-namespaces.t
963              
964             L<Test::CleanNamespaces|Test::CleanNamespaces> author test.
965              
966             =cut
967              
968             $file{q{xt/author/clean-namespaces.t}} = $test_header . <<'XT_AUTHOR_CLEAN_NAMESPACES_T';
969             use Test::More;
970             use Test::CleanNamespaces;
971              
972             if ( !Test::CleanNamespaces->find_modules() ) {
973             plan skip_all => 'No files found to test.';
974             }
975              
976             all_namespaces_clean();
977             XT_AUTHOR_CLEAN_NAMESPACES_T
978              
979             =head2 xt/author/critic.t
980              
981             L<Test::Perl::Critic|Test::Perl::Critic> author test.
982              
983             =cut
984              
985             $file{q{xt/author/critic.t}} = $test_header . <<'XT_AUTHOR_CRITIC_T';
986             use File::Spec;
987              
988             use Perl::Critic::Utils qw(all_perl_files);
989             use Test::More;
990             use Test::Perl::Critic;
991              
992             my @dirs = qw(bin lib t xt);
993              
994             my @ignores;
995             my %file;
996             @file{ all_perl_files(@dirs) } = ();
997             delete @file{@ignores};
998             my @files = keys %file;
999              
1000             if ( @files == 0 ) {
1001             BAIL_OUT('no files to criticize found');
1002             }
1003              
1004             all_critic_ok(@files);
1005             XT_AUTHOR_CRITIC_T
1006              
1007             =head2 xt/author/minimum_version.t
1008              
1009             L<Test::MinimumVersion|Test::MinimumVersion> author test.
1010              
1011             =cut
1012              
1013             $file{q{xt/author/minimum_version.t}} = $test_header . <<'XT_AUTHOR_MINIMUM_VERSION_T';
1014             use Test::MinimumVersion 0.008;
1015              
1016             all_minimum_version_from_metayml_ok();
1017             XT_AUTHOR_MINIMUM_VERSION_T
1018              
1019             =head2 xt/author/mojibake.t
1020              
1021             L<Test::Mojibake|Test::Mojibake> author test.
1022              
1023             =cut
1024              
1025             $file{q{xt/author/mojibake.t}} = $test_header . <<'XT_AUTHOR_MOJIBAKE_T';
1026             use Test::Mojibake;
1027              
1028             all_files_encoding_ok( grep { -d } qw( bin lib t xt ) );
1029             XT_AUTHOR_MOJIBAKE_T
1030              
1031             =head2 xt/author/no-tabs.t
1032              
1033             L<Test::NoTabs|Test::NoTabs> author test.
1034              
1035             =cut
1036              
1037             $file{q{xt/author/no-tabs.t}} = $test_header . <<'XT_AUTHOR_NO_TABS_T';
1038             use Test::NoTabs;
1039              
1040             all_perl_files_ok( grep { -d } qw( bin lib t xt ) );
1041             XT_AUTHOR_NO_TABS_T
1042              
1043             =head2 xt/author/pod-no404s.t
1044              
1045             L<Test::Pod::No404s|Test::Pod::No404s> author test.
1046              
1047             =cut
1048              
1049             $file{q{xt/author/pod-no404s.t}} = $test_header . <<'XT_AUTHOR_POD_NO404S_T';
1050             use Test::Pod::No404s;
1051              
1052             if ( exists $ENV{AUTOMATED_TESTING} ) {
1053             print "1..0 # SKIP these tests during AUTOMATED_TESTING\n";
1054             exit 0;
1055             }
1056              
1057             all_pod_files_ok();
1058             XT_AUTHOR_POD_NO404S_T
1059              
1060             =head2 xt/author/pod-spell.t
1061              
1062             L<Test::Spelling|Test::Spelling> author test. B<stopwords> are added as stopwords.
1063              
1064             =cut
1065              
1066             $file{q{xt/author/pod-spell.t}} = sub {
1067             my ($self) = @_;
1068              
1069             my $content = $test_header . <<'XT_AUTHOR_POD_SPELL_T';
1070             use Test::Spelling 0.12;
1071             use Pod::Wordlist;
1072              
1073             if ( exists $ENV{AUTOMATED_TESTING} ) {
1074             print "1..0 # SKIP these tests during AUTOMATED_TESTING\n";
1075             exit 0;
1076             }
1077              
1078             add_stopwords(<DATA>);
1079              
1080             all_pod_files_spelling_ok( grep { -d } qw( bin lib t xt ) );
1081             __DATA__
1082             XT_AUTHOR_POD_SPELL_T
1083              
1084             my @stopwords = grep { defined && !m{ ^ \s* $ }xsm } @{ $self->stopwords };
1085             push @stopwords, split /\s/xms, join q{ }, @{ $self->zilla->authors };
1086              
1087             $content .= join "\n", uniq( sort @stopwords ), q{};
1088              
1089             return $content;
1090             };
1091              
1092             =head2 xt/author/pod-syntax.t
1093              
1094             L<Test::Pod|Test::Pod> author test.
1095              
1096             =cut
1097              
1098             $file{q{xt/author/pod-syntax.t}} = $test_header . <<'XT_AUTHOR_POD_SYNTAX_T';
1099             use Test::Pod 1.26;
1100              
1101             all_pod_files_ok( grep { -d } qw( bin lib t xt) );
1102             XT_AUTHOR_POD_SYNTAX_T
1103              
1104             =head2 xt/author/portability.t
1105              
1106             L<Test::Portability::Files|Test::Portability::Files> author test.
1107              
1108             =cut
1109              
1110             $file{q{xt/author/portability.t}} = $test_header . <<'XT_AUTHOR_PORTABILITY_T';
1111             BEGIN {
1112             if ( !-f 'MANIFEST' ) {
1113             print "1..0 # SKIP No MANIFEST file\n";
1114             exit 0;
1115             }
1116             }
1117              
1118             use Test::Portability::Files;
1119              
1120             options( test_one_dot => 0 );
1121             run_tests();
1122             XT_AUTHOR_PORTABILITY_T
1123              
1124             =head2 xt/author/test-version.t
1125              
1126             L<Test::Version|Test::Version> author test.
1127              
1128             =cut
1129              
1130             $file{q{xt/author/test-version.t}} = $test_header . <<'XT_AUTHOR_TEST_VERSION_T';
1131             use Test::More 0.88;
1132             use Test::Version 0.04 qw( version_all_ok ), {
1133             consistent => 1,
1134             has_version => 1,
1135             is_strict => 0,
1136             multiple => 0,
1137             };
1138              
1139             version_all_ok;
1140             done_testing();
1141             XT_AUTHOR_TEST_VERSION_T
1142              
1143             =head2 xt/release/changes.t
1144              
1145             L<Test::CPAN::Changes|Test::CPAN::Changes> release test.
1146              
1147             =cut
1148              
1149             $file{q{xt/release/changes.t}} = $test_header . <<'XT_RELEASE_CHANGES_T';
1150             use Test::CPAN::Changes;
1151              
1152             changes_ok();
1153             XT_RELEASE_CHANGES_T
1154              
1155             =head2 xt/release/distmeta.t
1156              
1157             L<Test::CPAN::Meta|Test::CPAN::Meta> release test.
1158              
1159             =cut
1160              
1161             $file{q{xt/release/distmeta.t}} = $test_header . <<'XT_RELEASE_DISTMETA_T';
1162             use Test::CPAN::Meta;
1163              
1164             meta_yaml_ok();
1165             XT_RELEASE_DISTMETA_T
1166              
1167             =head2 xt/release/eol.t
1168              
1169             L<Test::EOL|Test::EOL> release test.
1170              
1171             =cut
1172              
1173             $file{q{xt/release/eol.t}} = $test_header . <<'XT_RELEASE_EOL_T';
1174             use Test::EOL;
1175              
1176             all_perl_files_ok( { trailing_whitespace => 1 }, grep { -d } qw( bin lib t xt) );
1177             XT_RELEASE_EOL_T
1178              
1179             =head2 xt/release/kwalitee.t
1180              
1181             L<Test::Kwalitee|Test::Kwalitee> release test.
1182              
1183             =cut
1184              
1185             $file{q{xt/release/kwalitee.t}} = $test_header . <<'XT_RELEASE_KWALITEE_T';
1186             use Test::More 0.88;
1187             use Test::Kwalitee 'kwalitee_ok';
1188              
1189             # Module::CPANTS::Analyse does not find the LICENSE in scripts that don't end in .pl
1190             kwalitee_ok(qw{-has_license_in_source_file});
1191              
1192             done_testing();
1193             XT_RELEASE_KWALITEE_T
1194              
1195             =head2 xt/release/manifest.t
1196              
1197             L<Test::DistManifest|Test::DistManifest> release test.
1198              
1199             =cut
1200              
1201             $file{q{xt/release/manifest.t}} = $test_header . <<'XT_RELEASE_MANIFEST_T';
1202             use Test::DistManifest 1.003;
1203              
1204             manifest_ok();
1205             XT_RELEASE_MANIFEST_T
1206              
1207             =head2 xt/release/meta-json.t
1208              
1209             L<Test::CPAN::Meta::JSON|Test::CPAN::Meta::JSON> release test.
1210              
1211             =cut
1212              
1213             $file{q{xt/release/meta-json.t}} = $test_header . <<'XT_RELEASE_META_JSON_T';
1214             use Test::CPAN::Meta::JSON;
1215              
1216             meta_json_ok();
1217             XT_RELEASE_META_JSON_T
1218              
1219             =head2 xt/release/meta-yaml.t
1220              
1221             L<Test::CPAN::Meta|Test::CPAN::Meta> release test.
1222              
1223             =cut
1224              
1225             $file{q{xt/release/meta-yaml.t}} = $test_header . <<'XT_RELEASE_META_YAML_T';
1226             use Test::CPAN::Meta 0.12;
1227              
1228             meta_yaml_ok();
1229             XT_RELEASE_META_YAML_T
1230             }
1231              
1232             __PACKAGE__->meta->make_immutable;
1233              
1234             1;
1235              
1236             __END__
1237              
1238             =head1 USAGE
1239              
1240             The following configuration options are supported:
1241              
1242             =over 4
1243              
1244             =item *
1245              
1246             C<skip> - Defines files to be skipped (not generated).
1247              
1248             =item *
1249              
1250             C<stopwords> - Defines stopwords for the spell checker.
1251              
1252             =item *
1253              
1254             C<travis_ci_ignore_perl> - By default, the generated F<.travis.yml> file
1255             runs on all Perl version known to exist on TravisCI. Use the
1256             C<travis_ci_ignore_perl> option to define Perl versions to not check.
1257              
1258             =back
1259              
1260             =head1 SUPPORT
1261              
1262             =head2 Bugs / Feature Requests
1263              
1264             Please report any bugs or feature requests through the issue tracker
1265             at L<https://github.com/skirmess/Dist-Zilla-PluginBundle-Author-SKIRMESS/issues>.
1266             You will be notified automatically of any progress on your issue.
1267              
1268             =head2 Source Code
1269              
1270             This is open source software. The code repository is available for
1271             public review and contribution under the terms of the license.
1272              
1273             L<https://github.com/skirmess/Dist-Zilla-PluginBundle-Author-SKIRMESS>
1274              
1275             git clone https://github.com/skirmess/Dist-Zilla-PluginBundle-Author-SKIRMESS.git
1276              
1277             =head1 AUTHOR
1278              
1279             Sven Kirmess <sven.kirmess@kzone.ch>
1280              
1281             =head1 COPYRIGHT AND LICENSE
1282              
1283             This software is Copyright (c) 2017 by Sven Kirmess.
1284              
1285             This is free software, licensed under:
1286              
1287             The (two-clause) FreeBSD License
1288              
1289             =head1 SEE ALSO
1290              
1291             L<Dist::Zilla::PluginBundle::Author::SKIRMESS|Dist::Zilla::PluginBundle::Author::SKIRMESS>
1292              
1293             =cut
1294              
1295             # vim: ts=4 sts=4 sw=4 et: syntax=perl