The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
Changes 80317
LICENSE 44
MANIFEST 220
META.json 80356
META.yml 152358
Makefile.PL 32139
README 24
bin/dzil 211
corpus/dist/AuthorDeps/dist.ini 024
corpus/dist/AutoPrereqs/dist.ini 06
corpus/dist/AutoPrereqs/t/data.bin 01
corpus/dist/DZ-NonAscii/Changes 04
corpus/dist/DZ-NonAscii/dist.ini 010
corpus/dist/DZ-NonAscii/lib/DZ1.pm 010
corpus/dist/DZT_Share/my_data.dat 01
cpanfile 1431
dist.ini 1018
lib/Dist/Zilla/App/Command/add.pm 1326
lib/Dist/Zilla/App/Command/authordeps.pm 618
lib/Dist/Zilla/App/Command/build.pm 545
lib/Dist/Zilla/App/Command/clean.pm 522
lib/Dist/Zilla/App/Command/install.pm 639
lib/Dist/Zilla/App/Command/listdeps.pm 1397
lib/Dist/Zilla/App/Command/new.pm 751
lib/Dist/Zilla/App/Command/nop.pm 521
lib/Dist/Zilla/App/Command/release.pm 517
lib/Dist/Zilla/App/Command/run.pm 748
lib/Dist/Zilla/App/Command/setup.pm 632
lib/Dist/Zilla/App/Command/smoke.pm 544
lib/Dist/Zilla/App/Command/test.pm 757
lib/Dist/Zilla/App/Command/version.pm 062
lib/Dist/Zilla/App/Command.pm 618
lib/Dist/Zilla/App/Tester.pm 108
lib/Dist/Zilla/App.pm 914
lib/Dist/Zilla/Chrome/Term.pm 2250
lib/Dist/Zilla/Chrome/Test.pm 624
lib/Dist/Zilla/Dist/Builder.pm 64262
lib/Dist/Zilla/Dist/Minter.pm 1011
lib/Dist/Zilla/File/FromCode.pm 899
lib/Dist/Zilla/File/InMemory.pm 1438
lib/Dist/Zilla/File/OnDisk.pm 2626
lib/Dist/Zilla/MVP/Assembler/GlobalConfig.pm 625
lib/Dist/Zilla/MVP/Assembler/Zilla.pm 634
lib/Dist/Zilla/MVP/Assembler.pm 627
lib/Dist/Zilla/MVP/Reader/Finder.pm 66
lib/Dist/Zilla/MVP/Reader/Perl.pm 611
lib/Dist/Zilla/MVP/RootSection.pm 621
lib/Dist/Zilla/MVP/Section.pm 86
lib/Dist/Zilla/MintingProfile/Default.pm 513
lib/Dist/Zilla/Plugin/AutoPrereq.pm 612
lib/Dist/Zilla/Plugin/AutoPrereqs.pm 1484
lib/Dist/Zilla/Plugin/AutoVersion.pm 1062
lib/Dist/Zilla/Plugin/BumpVersion.pm 516
lib/Dist/Zilla/Plugin/CPANFile.pm 615
lib/Dist/Zilla/Plugin/ConfirmRelease.pm 1119
lib/Dist/Zilla/Plugin/DistINI.pm 1449
lib/Dist/Zilla/Plugin/Encoding.pm 0152
lib/Dist/Zilla/Plugin/ExecDir.pm 818
lib/Dist/Zilla/Plugin/ExtraTests.pm 518
lib/Dist/Zilla/Plugin/FakeRelease.pm 635
lib/Dist/Zilla/Plugin/FileFinder/ByName.pm 675
lib/Dist/Zilla/Plugin/FileFinder/Filter.pm 645
lib/Dist/Zilla/Plugin/FinderCode.pm 87
lib/Dist/Zilla/Plugin/GatherDir/Template.pm 1325
lib/Dist/Zilla/Plugin/GatherDir.pm 29146
lib/Dist/Zilla/Plugin/GenerateFile.pm 666
lib/Dist/Zilla/Plugin/InlineFiles.pm 723
lib/Dist/Zilla/Plugin/License.pm 536
lib/Dist/Zilla/Plugin/MakeMaker/Runner.pm 927
lib/Dist/Zilla/Plugin/MakeMaker.pm 59149
lib/Dist/Zilla/Plugin/Manifest.pm 830
lib/Dist/Zilla/Plugin/ManifestSkip.pm 529
lib/Dist/Zilla/Plugin/MetaConfig.pm 524
lib/Dist/Zilla/Plugin/MetaJSON.pm 1051
lib/Dist/Zilla/Plugin/MetaNoIndex.pm 872
lib/Dist/Zilla/Plugin/MetaResources.pm 630
lib/Dist/Zilla/Plugin/MetaTests.pm 1029
lib/Dist/Zilla/Plugin/MetaYAML.pm 1157
lib/Dist/Zilla/Plugin/ModuleBuild.pm 30111
lib/Dist/Zilla/Plugin/ModuleShareDirs.pm 514
lib/Dist/Zilla/Plugin/NextRelease.pm 24122
lib/Dist/Zilla/Plugin/PkgDist.pm 722
lib/Dist/Zilla/Plugin/PkgVersion.pm 28193
lib/Dist/Zilla/Plugin/PodCoverageTests.pm 1428
lib/Dist/Zilla/Plugin/PodSyntaxTests.pm 817
lib/Dist/Zilla/Plugin/PodVersion.pm 623
lib/Dist/Zilla/Plugin/Prereq.pm 515
lib/Dist/Zilla/Plugin/Prereqs.pm 6102
lib/Dist/Zilla/Plugin/PruneCruft.pm 537
lib/Dist/Zilla/Plugin/PruneFiles.pm 848
lib/Dist/Zilla/Plugin/Readme.pm 1447
lib/Dist/Zilla/Plugin/RemovePrereqs.pm 523
lib/Dist/Zilla/Plugin/ShareDir.pm 616
lib/Dist/Zilla/Plugin/TemplateModule.pm 1151
lib/Dist/Zilla/Plugin/TestRelease.pm 622
lib/Dist/Zilla/Plugin/UploadToCPAN.pm 22111
lib/Dist/Zilla/PluginBundle/Basic.pm 539
lib/Dist/Zilla/PluginBundle/Classic.pm 541
lib/Dist/Zilla/PluginBundle/FakeClassic.pm 55
lib/Dist/Zilla/PluginBundle/Filter.pm 944
lib/Dist/Zilla/Prereqs.pm 693
lib/Dist/Zilla/Role/AfterBuild.pm 514
lib/Dist/Zilla/Role/AfterMint.pm 514
lib/Dist/Zilla/Role/AfterRelease.pm 715
lib/Dist/Zilla/Role/BeforeArchive.pm 511
lib/Dist/Zilla/Role/BeforeBuild.pm 511
lib/Dist/Zilla/Role/BeforeMint.pm 511
lib/Dist/Zilla/Role/BeforeRelease.pm 511
lib/Dist/Zilla/Role/BuildPL.pm 936
lib/Dist/Zilla/Role/BuildRunner.pm 517
lib/Dist/Zilla/Role/Chrome.pm 55
lib/Dist/Zilla/Role/ConfigDumper.pm 77
lib/Dist/Zilla/Role/EncodingProvider.pm 054
lib/Dist/Zilla/Role/ExecFiles.pm 55
lib/Dist/Zilla/Role/File.pm 9139
lib/Dist/Zilla/Role/FileFinder.pm 536
lib/Dist/Zilla/Role/FileFinderUser.pm 8100
lib/Dist/Zilla/Role/FileGatherer.pm 516
lib/Dist/Zilla/Role/FileInjector.pm 720
lib/Dist/Zilla/Role/FileMunger.pm 1038
lib/Dist/Zilla/Role/FilePruner.pm 513
lib/Dist/Zilla/Role/InstallTool.pm 515
lib/Dist/Zilla/Role/LicenseProvider.pm 525
lib/Dist/Zilla/Role/MetaProvider.pm 729
lib/Dist/Zilla/Role/MintingProfile/ShareDir.pm 511
lib/Dist/Zilla/Role/MintingProfile.pm 523
lib/Dist/Zilla/Role/ModuleMaker.pm 518
lib/Dist/Zilla/Role/MutableFile.pm 0165
lib/Dist/Zilla/Role/NameProvider.pm 515
lib/Dist/Zilla/Role/PPI.pm 1452
lib/Dist/Zilla/Role/Plugin.pm 527
lib/Dist/Zilla/Role/PluginBundle/Easy.pm 788
lib/Dist/Zilla/Role/PluginBundle.pm 513
lib/Dist/Zilla/Role/PrereqSource.pm 511
lib/Dist/Zilla/Role/Releaser.pm 511
lib/Dist/Zilla/Role/ShareDir.pm 55
lib/Dist/Zilla/Role/Stash/Authors.pm 612
lib/Dist/Zilla/Role/Stash/Login.pm 611
lib/Dist/Zilla/Role/Stash.pm 55
lib/Dist/Zilla/Role/StubBuild.pm 035
lib/Dist/Zilla/Role/TestRunner.pm 658
lib/Dist/Zilla/Role/TextTemplate.pm 530
lib/Dist/Zilla/Role/VersionProvider.pm 522
lib/Dist/Zilla/Stash/Mint.pm 051
lib/Dist/Zilla/Stash/PAUSE.pm 612
lib/Dist/Zilla/Stash/Rights.pm 66
lib/Dist/Zilla/Stash/User.pm 66
lib/Dist/Zilla/Tester.pm 3873
lib/Dist/Zilla/Tutorial.pm 7136
lib/Dist/Zilla/Types.pm 614
lib/Dist/Zilla/Util/AuthorDeps.pm 2123
lib/Dist/Zilla/Util.pm 1262
lib/Dist/Zilla.pm 25244
lib/Test/DZil.pm 7105
t/00-compile.t 730
t/00-report-prereqs.dd 0131
t/00-report-prereqs.t 0176
t/000-report-versions-tiny.t 1570
t/commands/authordeps.t 57
t/diagnostics/main-module.t 20
t/diagnostics/plugin-fail.t 10
t/empty-abstract.t 053
t/file-addedby.t 075
t/file.t 0207
t/minter.t 30
t/plugins/autoprereqs.t 31
t/plugins/autoversion.t 220
t/plugins/confirmrelease.t 515
t/plugins/distmeta-merge.t 064
t/plugins/distmeta.t 1641
t/plugins/extratests.t 64
t/plugins/fakerelease.t 20
t/plugins/ffbyname.t 10
t/plugins/filefinders.t 1836
t/plugins/gatherdir.t 1132
t/plugins/generatefile.t 65
t/plugins/installdirs.t 20
t/plugins/license.t 2238
t/plugins/makemaker.t 1226
t/plugins/manifest.t 2126
t/plugins/metanoindex.t 10
t/plugins/metaresources.t 20
t/plugins/misctests.t 20
t/plugins/modulebuild.t 1113
t/plugins/nextrelease.t 240
t/plugins/pkgdist.t 20
t/plugins/pkgversion.t 2120
t/plugins/podsyntaxtests.t 20
t/plugins/podversion.t 236
t/plugins/prereqs.t 241
t/plugins/readme.t 217
t/plugins/uploadtocpan.t 20
t/tester-demo.t 21
t/tester.t 02
t/util.t 21
t/zzz-check-breaks.t 034
xt/release/changes_has_content.t 11
xt/release/pod-syntax.t 32
198 files changed (This is a version diff) 20038462
@@ -1,277 +1,514 @@
 Revision history for Dist-Zilla
 
+5.025     2014-11-10 21:12:14-05:00 America/New_York
+        - fix file.t failures with perl v5.14 and v5.16's Carp
+
+5.024     2014-11-05 23:08:07-05:00 America/New_York
+        - add the %Mint stash for minting defaults
+        - quiet down some low-priority log lines
+        - teeny tiny optimization by building dist prereqs structure lazily
+        - avoid ever requiring v0 of ExtUtils::MakeMaker
+        - fix a module-loading ordering issue in `dzil setup`
+
+5.023     2014-10-30 22:56:42-04:00 America/New_York
+        - optimizations to loading of heavyweight libraries in cmd line app
+        - some tests are now skipped on Win32 to avoid filename insanity
+        - files' added_by data should be more informative
+        - conflicts with installed code is now detected and/or advertised
+
+5.022     2014-10-27 22:55:53-04:00 America/New_York
+        - several optimizations to how PPI is used
+        - handle an empty ABSTRACT better
+        - now properly merging distmeta fragments together without loss, using
+          new CPAN::Meta::Merge
+        - create Makefile.PL and Build.PL files earlier, so they're in the file
+          list "the whole time"
+
+5.021     2014-10-20 22:43:52-04:00 America/New_York
+        - improve authordeps' ability to cope with version requirements and
+          non-default plugin names
+        - a few improvements to help given by "dzil help COMMAND"
+        - fixes a situation where exclusion-regexp-building in GatherDir
+          could mangle the given regexps
+        - now properly merging distmeta fragments together without loss, using
+          new CPAN::Meta::Merge (Karen Etheridge)
+        - [PkgVersion] now properly skips over $VERSION assignments in
+          comments (Karen Etheridge, github #322)
+        - the building of manpages is supressed in [MakeMaker]-driven builds
+        - lazily load quite a few more modules
+        - avoid using user's ~/.dzil even more
+        - while building dists for testing, don't bother building man pages
+        - try harder to notice minimum required perl version
+        - try harder to delete temporarily directory at the end of testing
+        - don't treat $VERSION assignments in comments as $VERSION assignments
+        - listdeps now takes --omit-core to skip core modules
+        - don't try to use terminal encoding on locale-free systems
+        - suggest the use of PPI::XS
+        - speed up and debug behavior of GatherDir
+
+5.020     2014-07-28 20:56:25-04:00 America/New_York
+        - the default required version for ExtUtils::MakeMaker in [MakeMaker]
+          has been removed
+        - load DateTime lazily
+        - the default required version for Module::Build in [ModuleBuild] has
+          been lowered
+
+5.019     2014-05-20 21:11:47-04:00 America/New_York
+        - remove a very brief-lived attempt to double-decode
+
+5.018     2014-05-20 21:07:04-04:00 America/New_York
+        - attempt to return abstract-from-file as a string, rather than
+          bytes, which can lead to weirdness (github issue #303)
+
+5.017     2014-05-17 08:35:33-04:00 America/New_York
+        - dotfiles and dot-directories are now included in sharedirs
+        - ModuleBuild and MakeMake should not re-build if it isn't needed
+        - authordeps now better understands "perl" dep
+        - munging of README is delayed to prevent unneeded work and
+          complication
+        - MANIFEST is now treated as a binary file
+        - 'dzil setup' now warns that credentials are stored in the clear
+        - MakeMaker should include fewer empty and useless hashrefs
+        - Makefile.old is now pruned as cruft
+
+5.016     2014-05-05 22:27:06-04:00 America/New_York
+        - hint about [Encoding] plugin in encoding error message (David
+          Golden)
+
+5.015     2014-03-30 21:55:36-04:00 America/New_York
+        - make it easier to have multiple PAUSE configs using UploadToCPAN's
+          pause_cfg_dir option (thanks, David Golden)
+
+5.014     2014-03-16 16:47:07+01:00 Europe/Paris
+        - Added 'jobs' argument for 'dzil test' for parallel testing (thanks,
+          David Golden!)
+        - add default_jobs attribute to TestRunner role
+        - fix the behavior of 'dzil add' with more than one file
+          (thanks, Leon Timmermans!)
+
+5.013     2014-02-08 17:08:16-05:00 America/New_York
+        - META.json is now a UTF-8 file, rather than ASCII
+        - document the use of filefinders in [PkgVersion], and remove
+          filtering out of .t, .pod files; do skip non-text files, though
+        - always load modules in "extra tests" like pod-coverage.t
+        - PruneCruft also prunes ./fatlib
+        - avoid being tricked by statements in __END__ section when looking for
+          variable assignments
+        - if "dzil install" fails due to exception, it is now propagated
+        - provide a better error when terminal encoding can't be determined
+
+5.012     2014-01-15 09:58:00-05:00 America/New_York
+        - when handling a multi-line abstract, fold the lines on whitespace;
+          previously, the newlines had been left in, which caused downstream
+          warnings
+
+5.011     2014-01-12 16:09:29-05:00 America/New_York
+        - ->VERSION is again defined in the tester forms of Builder and Minter
+        - remove a small obsolete code path from PkgVersion
+
+5.010     2014-01-11 22:06:04-05:00 America/New_York
+        - stop sharing a reference to cached PPI docs, which led to spooky
+          action at a distance
+        - PkgVersion no longer surrounds the new $VERSION assignment with a
+          bare block
+        - if there's a blank line after the package statement (and any number
+          of comment-only lines), PkgVersion will use that for a $VERSION
+          assignment, rather than insert a new line; this can be made mandatory
+          with die_on_line_insertion
+
+5.009     2014-01-07 20:21:17-05:00 America/New_York
+        - include time offset by default in NextRelease
+        - always pass PPI octets, not text
+
+5.008     2013-12-27 21:57:02 America/New_York
+        - fix utterly broken `dzil run`
+
+5.007     2013-12-27 20:50:45-05:00 America/New_York
+        - add the ability to say "dzil run --no-build" to run a command without
+          building inside the dist dir
+          (in other words, no `perl Makefile.PL && make`)
+        - Archive::Tar::Wrapper added as a recommended prereq
+        - fix :ShareFiles (thanks, Christopher J. Madsen and Karen Etheridge)
+        - new :AllFiles and :NoFiles filefinders (thanks, Karen Etheridge)
+        - most files generated by dzil plugins now self-identify with comments
+
+5.006     2013-11-06 09:21:12 America/New_York
+        - add ->is_bytes to files; shortcut for ->encoding eq 'bytes'
+          (thanks, David Golden)
+        - AutoPrereqs will not try scanning binary files (thanks, David Golden)
+
+5.005     2013-11-02 16:32:04 America/New_York
+        - add --keep-build-dir to "dzil test" and "dzil install"
+
+5.004     2013-11-02 09:59:18 America/New_York
+        [THIS RELEASE MIGHT BREAK YOUR BUILD]
+        - stable release of all the v5 changes below; READ THEM!
+        - by default, NextRelease now adds a trial release marker on trial
+          releases
+        - dzil setup will not echo password during setup
+
+5.003     2013-10-30 08:02:59 America/New_York
+        [THIS RELEASE MIGHT BREAK YOUR BUILD]
+        - add "dzil --version" support (thanks, Upasana Shukla)
+        - fix boneheaded mistake that broke listdeps in 5.002 (thanks, Karen
+          Etheridge)
+
+5.002     2013-10-29 10:35:54 America/New_York
+        [THIS RELEASE MIGHT BREAK YOUR BUILD]
+        - perform encoding steps during listdeps
+
+5.001     2013-10-23 17:40:09 America/New_York
+        [THIS RELEASE MIGHT BREAK YOUR BUILD]
+        - typo fixes (thanks, David Steinbrunner)
+
+5.000     2013-10-20 08:10:02 America/New_York
+        [THIS RELEASE MIGHT BREAK YOUR BUILD]
+        - all files now have content, encoded_content, and encoding attributes
+        - the Encoding plugin and EncodingProvider role have been added to
+          allow you to set the encoding on files; the default is UTF-8
+        - config.ini is assumed to be in UTF-8
+        - Data::Section sections are assumed to be UTF-8
+        - the Term chrome should encode input and output
+
+4.300039  2013-09-20 06:05:10 Asia/Tokyo
+        - tweak metafile generator to keep CPAN::Meta validator happy (thanks,
+          David Golden)
+
+4.300038  2013-09-08 09:18:34 America/New_York
+        - add horrible hack to avoid generating non-UTF-8 META.yml; seriously,
+          don't look at the code!  Thanks, David Golden, whose code was simple
+          and probably much, much saner, but didn't cover as many cases as rjbs
+          wanted to cover.
+
+4.300037  2013-08-28 21:43:36 America/New_York
+        - update repo and bugtacker URLs
+
+4.300036  2013-08-25 21:41:21 America/New_York
+        - read CPAN::Uploader config with CPAN::Uploader, to work with new
+          trial releases supporting encrypted credential (thanks, Mike Doherty)
+
+        - improve tester tests (thanks, Dave O'Neill!)
+
+        - use Class::Load instead of Class::MOP
+
+        - better error messages when a bundle can't be loaded by @Filter
+
+        - make dynamic_config distmeta sticky; once one plugin sets it, it
+          stays stuck
+
+        - add a die_on_existing_version option to PkgVersion
+
+        - switch (for now?) "dzil install" to use cpanm
+
+        - PkgVersion won't rewrite file contents if nothing was changed
+          (thanks, Mike Doherty!)
+
+4.300035  2013-06-19 21:37:28 America/New_York
+        - update for new Perl::PrereqScanner, which will find "lib"
+
+        - update AutoPrereqs to skip Config and Errno
+
+        - fix docs to not suggest obsolete "Prereq" name (thanks, Ivan
+          Bessarabov!)
+
+4.300034  2013-04-13 16:56:48 Europe/London
+        - delay loading of CPAN::Uploader, and require a newer version to
+          require HTTPS (thanks, Olivier Mengué!)
+
+4.300033  2013-04-05 15:00:37 America/New_York
+        - fix .build/latest (thanks, Karen Etheridge!)
+
+        - doc fixes (thanks, Randy Stauner!)
+
+4.300032  2013-03-29 16:41:11 America/New_York
+        - test_requires support for ModuleBuild and MakeMaker (thanks,
+          Tatsuhiko Miyagawa!)
+
+4.300031  2013-03-17 21:47:31 America/New_York
+        - stacktrace removed from exception when a plugin's minimum version
+          check fails (thanks, Karen Etheridge!)
+
+        - add 'dzil listdeps --json', which lists all prerequisites broken up
+          by phase and type, in readable JSON format (thanks, Karen Etheridge!)
+
+        - improve errors when there's not enough configuration and no global
+          config file can be found (thanks, Dimitar Petrov)
+
+        - delay loading yet more libraries until needed (thanks, Olivier
+          Mengué!)
+
 4.300030  2013-01-30 22:25:27 America/New_York
-          listdeps --versions now sorts properly (thanks, Karen Etheridge!)
+        - listdeps --versions now sorts properly (thanks, Karen Etheridge!)
 
-          delay loading more libraries until needed (thanks, Olivier Mengué!)
+        - delay loading more libraries until needed (thanks, Olivier Mengué!)
 
-          excluded filenames in GatherDir were sometimes matched too fuzzily
+        - excluded filenames in GatherDir were sometimes matched too fuzzily
           (thanks, Mike Doherty)
 
 4.300029  2013-01-14 20:03:15 America/New_York
-          allow :version directive in root section to require a given version
+        - allow :version directive in root section to require a given version
           of Dist::Zilla
 
-          simply and speedify some of GatherDir (Thanks, Olivier Mengué!)
+        - simply and speedify some of GatherDir (Thanks, Olivier Mengué!)
 
 4.300028  2012-10-19 10:50:42 America/New_York
-          when picking modules to treat as "part of the dist," be more lax in
+        - when picking modules to treat as "part of the dist," be more lax in
           understanding libraries under ./t:  ./t/lib/Foo.pm is now treated as
           providing t::lib::Foo, lib::Foo, and Foo
 
 4.300027  2012-10-16 21:07:06 America/New_York
-          the "latest" symlink code broke Dist::Zilla on win32; fixed now!
+        - the "latest" symlink code broke Dist::Zilla on win32; fixed now!
           (thanks, Brendan Byrd!)
 
 4.300026  2012-10-13 22:21:17 America/New_York
-          PodSyntaxTests, PodCoverageTests and MetaTests now add the right
+        - PodSyntaxTests, PodCoverageTests and MetaTests now add the right
           develop/requires prereqs (thanks, Olivier Mengué and Ricardo Signes!)
 
-          ModuleBuild now takes an mb_lib argument that can override the
+        - ModuleBuild now takes an mb_lib argument that can override the
           default of "inc" (thanks, ben hengst)
 
-          create .build/latest symlink when a build in .build is built (thanks,
+        - create .build/latest symlink when a build in .build is built (thanks,
           Alexei Znamensky!)
 
-          allow "-version" arg to [@Filter] to specify the version of the
+        - allow "-version" arg to [@Filter] to specify the version of the
           bundle required (thanks, Rob Hoelz)
 
 4.300025  2012-10-07 23:02:33 America/New_York
-          add the LicenseProvider and NameProvider roles (thanks, Vyacheslav
+        - add the LicenseProvider and NameProvider roles (thanks, Vyacheslav
           Matjukhin!)
 
-          make Dist::Zilla::App::Tester be a CaptureExternal App::Cmd::Tester
+        - make Dist::Zilla::App::Tester be a CaptureExternal App::Cmd::Tester
 
 4.300024  2012-09-26 12:01:45 America/New_York
-          include $] in MetaConfig data
+        - include $] in MetaConfig data
 
 4.300023  2012-09-06 09:01:12 America/New_York
-          do not use ">" in a filename; fixes the build on Win32 (thanks,
+        - do not use ">" in a filename; fixes the build on Win32 (thanks,
           djgoku!)
 
 4.300022  2012-09-05 08:35:27 America/New_York
-          do not detect an escaped "\$VERSION =" as an assignment to a variable
+        - do not detect an escaped "\$VERSION =" as an assignment to a variable
           (this is sort of a half-measure)
 
-          'dzil run' also edits $PATH to include ExecDir directories (Karen
+        - 'dzil run' also edits $PATH to include ExecDir directories (Karen
           Etheridge)
 
 4.300021  2012-07-31 23:20:50 America/New_York
-          plugins can now provide a MANIFEST.SKIP that can be processed by
+        - plugins can now provide a MANIFEST.SKIP that can be processed by
           ManifestSkip. Previously generated content was just ignored.
           (thanks, Olivier Mengué!)
 
-          GenerateFile can now also template its filename, with the
+        - GenerateFile can now also template its filename, with the
           name_is_template option (Thanks, Karen Etheridge!)
 
 4.300020  2012-06-21 11:17:40 America/New_York
-          properly set the working directory when testing (thanks, Jesse
+        - properly set the working directory when testing (thanks, Jesse
           Luehrs!)
 
 4.300019  2012-06-20 15:36:01 America/New_York
-          avoid looking outside the dist during testing (thanks, Jesse Luehrs!)
+        - avoid looking outside the dist during testing (thanks, Jesse Luehrs!)
 
 4.300018  2012-06-07 22:25:03 America/New_York
-          format codes %E, %T, %U, & %V added to NextRelease (thanks,
+        - format codes %E, %T, %U, & %V added to NextRelease (thanks,
           Karen Etheridge & Christopher J. Madsen!)
 
 4.300017  2012-05-31 12:17:45 America/New_York
-          also check plugin version requirements in dzil authordeps --missing
+        - also check plugin version requirements in dzil authordeps --missing
           (Karen Etheridge)
 
-          add 'dzil add' to add new modules to an existing dist (thanks, David
+        - add 'dzil add' to add new modules to an existing dist (thanks, David
           Golden!)
 
-          misc. bugfixes (thanks, Karen Etheridge and Olivier Mengué!)
+        - misc. bugfixes (thanks, Karen Etheridge and Olivier Mengué!)
 
 4.300016  2012-05-04 22:09:10 America/New_York
-          make AutoPrereqs treat .psgi files as scannable (thanks, Jakob Voss!)
+        - make AutoPrereqs treat .psgi files as scannable (thanks, Jakob Voss!)
 
-          add yet more links in plugins documentation to help discoverability
+        - add yet more links in plugins documentation to help discoverability
           of other plugins.  (thanks, Olivier Mengué!)
 
-          AutoPrereqs: skip author and release tests when scanning (RT#76305).
+        - AutoPrereqs: skip author and release tests when scanning (RT#76305).
           (thanks, Olivier Mengué!)
 
 4.300015  2012-04-23 21:38:21 America/New_York
-          require a CPAN::Meta::Requirements 2.121 to get the
+        - require a CPAN::Meta::Requirements 2.121 to get the
           requirements_for_module (thanks, Olivier Mengué!)
 
-          'dzil run' with no arguments will now invoke a new shell.  (thanks,
+        - 'dzil run' with no arguments will now invoke a new shell.  (thanks,
           Karen Etheridge!)
 
-          dzil clean now has has a "dry run" option.  (thanks, Karen
+        - dzil clean now has has a "dry run" option.  (thanks, Karen
           Etheridge!)
 
-          add more links in plugins documentation to help discoverability
+        - add more links in plugins documentation to help discoverability
           of other plugins.  (thanks, Olivier Mengué!)
 
-          support :version requirement for bundles (thanks, Randy Stauner!)
+        - support :version requirement for bundles (thanks, Randy Stauner!)
 
 4.300014  2012-04-05 12:46:33 America/New_York
-          added the CPANFile plugin to create "cpanfile" prereq format
+        - added the CPANFile plugin to create "cpanfile" prereq format
 
-          stop emitting an empty line in authordeps output (thanks, Olivier
+        - stop emitting an empty line in authordeps output (thanks, Olivier
           Mengué!)
 
 4.300013  2012-03-31 15:55:47 Europe/Paris
-          dzil test has a new option, --all, which is the equivalent of
+        - dzil test has a new option, --all, which is the equivalent of
           --release --automated --author.
 
 4.300012  2012-03-30 14:31:56 Europe/Paris
-          add 0 and never <undef> to the prereqs (thanks, David Golden)
+        - add 0 and never <undef> to the prereqs (thanks, David Golden)
 
 4.300011  2012-03-30 11:42:44 Europe/Paris
-          do not claim that a dep is missing in "listdeps" when it is present
+        - do not claim that a dep is missing in "listdeps" when it is present
           with an undef $VERSION and we only require version 0 (reported by
           Matthew Horsfall)
 
 4.300010  2012-03-15 21:38:58 America/New_York
-          The GatherDir::Template documentation has been improved
+        - The GatherDir::Template documentation has been improved
           (Thanks, Christopher J. Madsen!)
 
-          Depend on a more recent version of Config::MVP, which requires a fix
+        - Depend on a more recent version of Config::MVP, which requires a fix
           in Class::Load to fix detection of plugin compilation errors on
           perl5.8.8 (see Class::Load Changes file for details.)  (Karen
           Etheridge)
 
-          Add --versions support to listdeps and authordeps (Cory G Watson)
+        - Add --versions support to listdeps and authordeps (Cory G Watson)
 
-          Documentation fixes
+        - Documentation fixes
 
 4.300009  2012-02-21 19:38:29 America/New_York
-          PruneCruft also excludes the _Inline/ directory and MYMETA.json
+        - PruneCruft also excludes the _Inline/ directory and MYMETA.json
 
-          MakeMaker has been refactored to make it easier to subclass
+        - MakeMaker has been refactored to make it easier to subclass
           (Thanks, Christopher J. Madsen!)
 
 4.300008  2012-02-16 17:28:34 America/New_York
-          work around qr//m bug in 5.8.8 and earlier (thanks, Randy Stauner!)
+        - work around qr//m bug in 5.8.8 and earlier (thanks, Randy Stauner!)
 
-          Fix to MakeMaker plugin: use separate scope for code that changes
+        - Fix to MakeMaker plugin: use separate scope for code that changes
           namespace, when inserting ShareDir code. (RT#74788) (Karen Etheridge)
 
 4.300007  2012-02-02 22:23:05 America/New_York
-          Remove configs beginning with ':' from argument list before
+        - Remove configs beginning with ':' from argument list before
           constructing that config; fixes issue where :version was
           being passed to a plugin that had a strict constructor. (Karen
           Etheridge)
 
 4.300006  2011-12-30 15:28:34 America/New_York
-          New methods dist_basename & archive_filename allow plugins
+        - New methods dist_basename & archive_filename allow plugins
           to reliably get that information.  This makes TestRelease
           testable. (Thanks, Kent Fredric & Christopher J. Madsen!)
 
-          Your PAUSE password will now no be echoed if entered at the
+        - Your PAUSE password will now no be echoed if entered at the
           prompt, on most operating systems (Thanks, Mike Doherty!)
 
-          replace use of Version::Requirements with CPAN::Meta::Requirements,
+        - replace use of Version::Requirements with CPAN::Meta::Requirements,
           its replacement
 
 4.300005  2011-12-13 08:49:19 America/New_York
-          Prereqs now actually understands -relationship as documented
+        - Prereqs now actually understands -relationship as documented
           in 4.300004.  Also, it throws an error if you give it a
           plugin name that does not specify a relationship (Thanks,
           Christopher J. Madsen!)
 
 4.300004  2011-12-12 23:34:30 America/New_York
-          a new FileFinder plugin has been added, FileFinder::Filter
+        - a new FileFinder plugin has been added, FileFinder::Filter
           (Thanks, Christopher J. Madsen!)
 
-          AutoPrereqs can now be told to determine configure_requires
+        - AutoPrereqs can now be told to determine configure_requires
           (Thanks, Christopher J. Madsen!)
 
-          the (lack of) order of check of authordeps is now a bit more
+        - the (lack of) order of check of authordeps is now a bit more
           predictible:
           - plugins declared with "; authordep" lines are loaded before others
           - inc:: plugins are checked first and in ASCII order
           (Thanks, Olivier Mengué!)
 
-          Many slow-to-load modules are now loaded opportunistically to improve
+        - Many slow-to-load modules are now loaded opportunistically to improve
           startup time.  (Thanks Olivier Mengué and rjbs)
 
-          ShareDir documentation has been improved (thanks, Karen
+        - ShareDir documentation has been improved (thanks, Karen
           Etheridge)
 
-          Prereqs documentation has been improved
+        - Prereqs documentation has been improved
 
 4.300003  2011-10-31 23:58:19 America/New_York
-          If no credentials are found on disk, UploadToCPAN will now prompt for
+        - If no credentials are found on disk, UploadToCPAN will now prompt for
           credentials during the BeforeRelease phase, not during release
           (Thanks, Christopher J. Madsen!)
 
-          AutoPrereqs can now be told what scanners or extra_scanners args to
+        - AutoPrereqs can now be told what scanners or extra_scanners args to
           pass to Perl::PrereqScanner (Thanks, Christopher J. Madsen!)
 
-          Prune perl prereqs out of BUILD_REQUIRES for EU::MM, and pick the
+        - Prune perl prereqs out of BUILD_REQUIRES for EU::MM, and pick the
           highest required perl of either runtime or built requires.  (Thanks,
           Christopher J. Madsen!)
 
-          Test routines should now properly report the calling line for
+        - Test routines should now properly report the calling line for
           failures ($Test::Builder::Level is being set) (Thanks, Christopher J.
           Madsen!)
 
-          the is_filelist test assertion now works with objects that do the
+        - the is_filelist test assertion now works with objects that do the
           Dist::Zilla::Role::File role (Thanks, Christopher J. Madsen!)
 
-          a new FileFinder plugin has been added, FileFinder::ByName
+        - a new FileFinder plugin has been added, FileFinder::ByName
           (Thanks, Christopher J. Madsen!)
 
 4.300002  2011-09-22 09:43:45 America/New_York
-          fix a bug that does Weird Stuff when a 0b file exists (thanks,
+        - fix a bug that does Weird Stuff when a 0b file exists (thanks,
           Christian Walde!)
 
 4.300001  2011-09-19 15:46:18 America/New_York
-          Several improvements to how PPI is used should speed up the
+        - Several improvements to how PPI is used should speed up the
           performance of Perl file munging and scanning.  The PPI role was
           added.  (Thanks, Dave Rolsky!)
 
-          We now use Archive::Tar::Wrapper if available, to speed up archive
+        - We now use Archive::Tar::Wrapper if available, to speed up archive
           building.  (Thanks, Dave Rolsky!)
 
 4.300000  2011-08-19 10:12:36 America/New_York
-          turn on Useqq option for Dumper, to get unicode string literals set
+        - turn on Useqq option for Dumper, to get unicode string literals set
           properly in Makefile.PL and Build.PL without using utf8.pm
 
-          decode user input from Chrome::Term as UTF-8
+        - decode user input from Chrome::Term as UTF-8
 
-          during `dzil setup`, the config.ini file is now created with an added
+        - during `dzil setup`, the config.ini file is now created with an added
           umask of 077 to avoid other users reading your PAUSE credentials
 
-          update almost all Moose code to use make_immutable and
+        - update almost all Moose code to use make_immutable and
           namespace::autoclean
 
 4.200018  2011-08-18 11:13:03 America/New_York
-          correct Perl::PrereqScanner version requirement, which was too low
+        - correct Perl::PrereqScanner version requirement, which was too low
 
 4.200017  2011-08-17 18:54:07 America/New_York
-          require and adapt to the new Perl::PrereqScanner, which does not
+        - require and adapt to the new Perl::PrereqScanner, which does not
           prune out prereqs just because they're core and common
 
 4.200016  2011-08-17 18:07:21 America/New_York
-          add options to exclude files from GatherDir (David Golden)
+        - add options to exclude files from GatherDir (David Golden)
 
 4.200015  2011-08-12 13:45:42 America/New_York
-          don't build the dist in a directory with -TRIAL in the name; this
+        - don't build the dist in a directory with -TRIAL in the name; this
           should fix bugs in "dzil release --trial" and probably other related
           bugs
 
 4.200014  2011-08-07 18:18:01 America/New_York
-          add documentation for TemplateModule (thanks, Kent Fredric)
+        - add documentation for TemplateModule (thanks, Kent Fredric)
 
-          fixes to tester.t for Win32 (thanks, Christian Walde)
+        - fixes to tester.t for Win32 (thanks, Christian Walde)
 
 4.200013  2011-08-05 09:30:01 America/New_York
-          "dzil listdeps --missing" no longer dies if it encounters an invalid
+        - "dzil listdeps --missing" no longer dies if it encounters an invalid
           $VERSION (Jesse Luehrs)
 
-          PkgVersion and PkgDist no longer use BEGIN blocks
+        - PkgVersion and PkgDist no longer use BEGIN blocks
 
 4.200012  2011-07-18 09:02:09 America/New_York
-          allow abstracts of more than one line, or with more than one word
+        - allow abstracts of more than one line, or with more than one word
           before the dash, to be properly extracted (Florian Ragwitz)
 
-          stringify tarball name to work with older Archive::Tar (Jan Tore
+        - stringify tarball name to work with older Archive::Tar (Jan Tore
           Morken)
 
 4.200011  2011-07-14 22:53:34 America/New_York
@@ -1,4 +1,4 @@
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -12,7 +12,7 @@ b) the "Artistic License"
 
 --- The GNU General Public License, Version 1, February 1989 ---
 
-This software is Copyright (c) 2013 by Ricardo SIGNES.
+This software is Copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software, licensed under:
 
@@ -22,7 +22,7 @@ This is free software, licensed under:
                      Version 1, February 1989
 
  Copyright (C) 1989 Free Software Foundation, Inc.
- 51 Franklin St, Suite 500, Boston, MA  02110-1335  USA
+ 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
@@ -272,7 +272,7 @@ That's all there is to it!
 
 --- The Artistic License 1.0 ---
 
-This software is Copyright (c) 2013 by Ricardo SIGNES.
+This software is Copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software, licensed under:
 
@@ -1,3 +1,4 @@
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.024.
 Changes
 LICENSE
 MANIFEST
@@ -7,10 +8,15 @@ Makefile.PL
 README
 bin/dzil
 corpus/README
+corpus/dist/AuthorDeps/dist.ini
 corpus/dist/AutoPrereqs/bin/foobar
 corpus/dist/AutoPrereqs/dist.ini
 corpus/dist/AutoPrereqs/lib/DZPA/Empty.pm
 corpus/dist/AutoPrereqs/lib/DZPA/Main.pm
+corpus/dist/AutoPrereqs/t/data.bin
+corpus/dist/DZ-NonAscii/Changes
+corpus/dist/DZ-NonAscii/dist.ini
+corpus/dist/DZ-NonAscii/lib/DZ1.pm
 corpus/dist/DZ1/dist.ini
 corpus/dist/DZ1/lib/DZ1.pm
 corpus/dist/DZ2/dist.pl
@@ -22,6 +28,7 @@ corpus/dist/DZT_Inc/Foo.pm
 corpus/dist/DZT_Inc/Foo/Bar.pm
 corpus/dist/DZT_NoPm/lib/DZT/Sample.pod
 corpus/dist/DZT_NoPm/t/basic.t
+corpus/dist/DZT_Share/my_data.dat
 corpus/extra/subdir/index.html
 corpus/extra/vader.txt
 corpus/global/config.ini
@@ -43,6 +50,7 @@ lib/Dist/Zilla/App/Command/run.pm
 lib/Dist/Zilla/App/Command/setup.pm
 lib/Dist/Zilla/App/Command/smoke.pm
 lib/Dist/Zilla/App/Command/test.pm
+lib/Dist/Zilla/App/Command/version.pm
 lib/Dist/Zilla/App/Tester.pm
 lib/Dist/Zilla/Chrome/Term.pm
 lib/Dist/Zilla/Chrome/Test.pm
@@ -66,6 +74,7 @@ lib/Dist/Zilla/Plugin/BumpVersion.pm
 lib/Dist/Zilla/Plugin/CPANFile.pm
 lib/Dist/Zilla/Plugin/ConfirmRelease.pm
 lib/Dist/Zilla/Plugin/DistINI.pm
+lib/Dist/Zilla/Plugin/Encoding.pm
 lib/Dist/Zilla/Plugin/ExecDir.pm
 lib/Dist/Zilla/Plugin/ExtraTests.pm
 lib/Dist/Zilla/Plugin/FakeRelease.pm
@@ -121,6 +130,7 @@ lib/Dist/Zilla/Role/BuildPL.pm
 lib/Dist/Zilla/Role/BuildRunner.pm
 lib/Dist/Zilla/Role/Chrome.pm
 lib/Dist/Zilla/Role/ConfigDumper.pm
+lib/Dist/Zilla/Role/EncodingProvider.pm
 lib/Dist/Zilla/Role/ExecFiles.pm
 lib/Dist/Zilla/Role/File.pm
 lib/Dist/Zilla/Role/FileFinder.pm
@@ -135,6 +145,7 @@ lib/Dist/Zilla/Role/MetaProvider.pm
 lib/Dist/Zilla/Role/MintingProfile.pm
 lib/Dist/Zilla/Role/MintingProfile/ShareDir.pm
 lib/Dist/Zilla/Role/ModuleMaker.pm
+lib/Dist/Zilla/Role/MutableFile.pm
 lib/Dist/Zilla/Role/NameProvider.pm
 lib/Dist/Zilla/Role/PPI.pm
 lib/Dist/Zilla/Role/Plugin.pm
@@ -146,9 +157,11 @@ lib/Dist/Zilla/Role/ShareDir.pm
 lib/Dist/Zilla/Role/Stash.pm
 lib/Dist/Zilla/Role/Stash/Authors.pm
 lib/Dist/Zilla/Role/Stash/Login.pm
+lib/Dist/Zilla/Role/StubBuild.pm
 lib/Dist/Zilla/Role/TestRunner.pm
 lib/Dist/Zilla/Role/TextTemplate.pm
 lib/Dist/Zilla/Role/VersionProvider.pm
+lib/Dist/Zilla/Stash/Mint.pm
 lib/Dist/Zilla/Stash/PAUSE.pm
 lib/Dist/Zilla/Stash/Rights.pm
 lib/Dist/Zilla/Stash/User.pm
@@ -164,12 +177,15 @@ misc/lib/Dist/Zilla/App/Command/gconf.pm
 misc/lib/Dist/Zilla/App/Command/input.pm
 profiles/default/extra-dist.ini
 profiles/default/profile.ini
-t/00-compile.t
-t/000-report-versions-tiny.t
+t/00-report-prereqs.dd
+t/00-report-prereqs.t
 t/commands/authordeps.t
 t/compile.t
 t/diagnostics/main-module.t
 t/diagnostics/plugin-fail.t
+t/empty-abstract.t
+t/file-addedby.t
+t/file.t
 t/lib/Dist/Zilla/Plugin/BrokenPlugin.pm
 t/lib/Dist/Zilla/Plugin/BrokenPlugin2.pm
 t/lib/Dist/Zilla/Plugin/BrokenPlugin3.pm
@@ -184,6 +200,7 @@ t/plugins/autoname.t
 t/plugins/autoprereqs.t
 t/plugins/autoversion.t
 t/plugins/confirmrelease.t
+t/plugins/distmeta-merge.t
 t/plugins/distmeta.t
 t/plugins/extratests.t
 t/plugins/fakerelease.t
@@ -213,6 +230,7 @@ t/plugins/uploadtocpan.t
 t/tester-demo.t
 t/tester.t
 t/util.t
+t/zzz-check-breaks.t
 todo/CHECKLIST-testing.mkdn
 todo/command-plugins.mkdn
 todo/config-arg-prefix.mkdn
@@ -4,7 +4,7 @@
       "Ricardo SIGNES <rjbs@cpan.org>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 4.300030, CPAN::Meta::Converter version 2.120921",
+   "generated_by" : "Dist::Zilla version 5.024, CPAN::Meta::Converter version 2.142690",
    "license" : [
       "perl_5"
    ],
@@ -22,30 +22,32 @@
    "prereqs" : {
       "configure" : {
          "requires" : {
-            "ExtUtils::MakeMaker" : "6.30",
-            "File::ShareDir::Install" : "0.03"
+            "ExtUtils::MakeMaker" : "0",
+            "File::ShareDir::Install" : "0.06"
          }
       },
       "develop" : {
          "requires" : {
-            "Test::Pod" : "1.41",
-            "version" : "0.9901"
+            "Test::Pod" : "1.41"
          }
       },
       "runtime" : {
          "recommends" : {
+            "Archive::Tar::Wrapper" : "0.15",
             "Term::ReadLine::Gnu" : "0"
          },
          "requires" : {
+            "App::Cmd::Command::version" : "0",
             "App::Cmd::Setup" : "0.309",
             "App::Cmd::Tester" : "0.306",
             "App::Cmd::Tester::CaptureExternal" : "0",
             "Archive::Tar" : "0",
             "CPAN::Meta::Converter" : "2.101550",
+            "CPAN::Meta::Merge" : "0",
             "CPAN::Meta::Prereqs" : "2.120630",
             "CPAN::Meta::Requirements" : "2.121",
             "CPAN::Meta::Validator" : "2.101550",
-            "CPAN::Uploader" : "0.101550",
+            "CPAN::Uploader" : "0.103004",
             "Carp" : "0",
             "Class::Load" : "0.17",
             "Config::INI::Reader" : "0",
@@ -57,11 +59,11 @@
             "Config::MVP::Reader::INI" : "2",
             "Config::MVP::Section" : "2.200002",
             "Data::Dumper" : "0",
-            "Data::Section" : "0.004",
+            "Data::Section" : "0.200002",
             "DateTime" : "0.44",
             "Digest::MD5" : "0",
             "Encode" : "0",
-            "ExtUtils::Manifest" : "1.54",
+            "ExtUtils::Manifest" : "1.66",
             "File::Copy::Recursive" : "0",
             "File::Find::Rule" : "0",
             "File::HomeDir" : "0",
@@ -71,14 +73,14 @@
             "File::Spec" : "0",
             "File::Temp" : "0",
             "File::pushd" : "0",
-            "Hash::Merge::Simple" : "0",
             "JSON" : "2",
-            "List::AllUtils" : "0",
             "List::MoreUtils" : "0",
-            "List::Util" : "0",
+            "List::Util" : "1.33",
             "Log::Dispatchouli" : "1.102220",
+            "Mixin::Linewise::Readers" : "0.100",
+            "Module::CoreList" : "0",
             "Moose" : "0.92",
-            "Moose::Autobox" : "0.10",
+            "Moose::Autobox" : "0.09",
             "Moose::Role" : "0",
             "Moose::Util::TypeConstraints" : "0",
             "MooseX::LazyRequire" : "0",
@@ -88,20 +90,23 @@
             "MooseX::Types::Moose" : "0",
             "MooseX::Types::Path::Class" : "0",
             "MooseX::Types::Perl" : "0",
-            "PPI" : "0",
+            "PPI::Document" : "0",
             "Params::Util" : "0",
-            "Path::Class" : "0",
-            "Perl::PrereqScanner" : "1.005",
+            "Path::Class" : "0.22",
+            "Path::Tiny" : "0",
+            "Perl::PrereqScanner" : "1.016",
             "Perl::Version" : "0",
             "Pod::Eventual" : "0.091480",
             "Scalar::Util" : "0",
             "Software::License" : "0.101370",
             "Software::LicenseUtils" : "0",
+            "Storable" : "0",
             "String::Formatter" : "0.100680",
             "String::RewritePrefix" : "0.005",
             "Sub::Exporter" : "0",
             "Sub::Exporter::ForMethods" : "0",
             "Sub::Exporter::Util" : "0",
+            "Term::Encoding" : "0",
             "Term::ReadKey" : "0",
             "Term::ReadLine" : "0",
             "Term::UI" : "0",
@@ -118,156 +123,231 @@
             "strict" : "0",
             "version" : "0",
             "warnings" : "0"
+         },
+         "suggests" : {
+            "PPI::XS" : "0"
          }
       },
       "test" : {
+         "recommends" : {
+            "CPAN::Meta" : "2.120900"
+         },
          "requires" : {
-            "File::Find" : "0",
+            "CPAN::Meta::Check" : "0.007",
+            "CPAN::Meta::Requirements" : "2.121",
+            "ExtUtils::MakeMaker" : "0",
+            "ExtUtils::Manifest" : "1.66",
+            "File::Spec" : "0",
             "Software::License::None" : "0",
+            "Test::FailWarnings" : "0",
             "Test::Fatal" : "0",
             "Test::File::ShareDir" : "0",
-            "Test::More" : "0.96"
+            "Test::More" : "0.96",
+            "lib" : "0",
+            "utf8" : "0"
          }
       }
    },
    "release_status" : "stable",
    "resources" : {
       "bugtracker" : {
-         "web" : "https://github.com/rjbs/dist-zilla/issues"
+         "web" : "https://github.com/rjbs/Dist-Zilla/issues"
       },
-      "homepage" : "http://dzil.org/",
+      "homepage" : "https://github.com/rjbs/Dist-Zilla",
       "repository" : {
          "type" : "git",
-         "url" : "http://github.com/rjbs/dist-zilla.git",
-         "web" : "http://github.com/rjbs/dist-zilla"
+         "url" : "https://github.com/rjbs/Dist-Zilla.git",
+         "web" : "https://github.com/rjbs/Dist-Zilla"
       },
       "x_mailing_list" : "http://www.listbox.com/subscribe/?list_id=139292"
    },
-   "version" : "4.300030",
+   "version" : "5.025",
    "x_Dist_Zilla" : {
       "perl" : {
-         "version" : "5.017008"
+         "version" : "5.021005"
       },
       "plugins" : [
          {
             "class" : "Dist::Zilla::Plugin::Git::GatherDir",
+            "config" : {
+               "Dist::Zilla::Plugin::GatherDir" : {
+                  "exclude_filename" : [],
+                  "exclude_match" : [],
+                  "follow_symlinks" : "0",
+                  "include_dotfiles" : "0",
+                  "prefix" : "",
+                  "prune_directory" : [],
+                  "root" : "."
+               },
+               "Dist::Zilla::Plugin::Git::GatherDir" : {
+                  "include_untracked" : "0"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Filter/Git::GatherDir",
-            "version" : "2.007"
+            "version" : "2.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed",
             "name" : "@Filter/CheckPrereqsIndexed",
-            "version" : "0.008"
+            "version" : "0.012"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckExtraTests",
             "name" : "@Filter/CheckExtraTests",
-            "version" : "0.008"
+            "version" : "0.024"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::PromptIfStale",
+            "config" : {
+               "Dist::Zilla::Plugin::PromptIfStale" : {
+                  "check_all_plugins" : 0,
+                  "check_all_prereqs" : 0,
+                  "modules" : [
+                     "Dist::Zilla::PluginBundle::RJBS"
+                  ],
+                  "phase" : "build",
+                  "skip" : []
+               }
+            },
+            "name" : "@Filter/RJBS-Outdated",
+            "version" : "0.029"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::PromptIfStale",
+            "config" : {
+               "Dist::Zilla::Plugin::PromptIfStale" : {
+                  "check_all_plugins" : "1",
+                  "check_all_prereqs" : 0,
+                  "modules" : [],
+                  "phase" : "release",
+                  "skip" : []
+               }
+            },
+            "name" : "@Filter/CPAN-Outdated",
+            "version" : "0.029"
          },
          {
             "class" : "Dist::Zilla::Plugin::PruneCruft",
             "name" : "@Filter/@Filter/PruneCruft",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::ManifestSkip",
             "name" : "@Filter/@Filter/ManifestSkip",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaYAML",
             "name" : "@Filter/@Filter/MetaYAML",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::License",
             "name" : "@Filter/@Filter/License",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Readme",
             "name" : "@Filter/@Filter/Readme",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::ExecDir",
             "name" : "@Filter/@Filter/ExecDir",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::ShareDir",
             "name" : "@Filter/@Filter/ShareDir",
-            "version" : "4.300030"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::MakeMaker",
-            "name" : "@Filter/@Filter/MakeMaker",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Manifest",
             "name" : "@Filter/@Filter/Manifest",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::TestRelease",
             "name" : "@Filter/@Filter/TestRelease",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::ConfirmRelease",
             "name" : "@Filter/@Filter/ConfirmRelease",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::UploadToCPAN",
             "name" : "@Filter/@Filter/UploadToCPAN",
-            "version" : "4.300030"
+            "version" : "5.024"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::MakeMaker",
+            "config" : {
+               "Dist::Zilla::Role::TestRunner" : {
+                  "default_jobs" : 9
+               }
+            },
+            "name" : "@Filter/MakeMaker",
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::AutoPrereqs",
             "name" : "@Filter/AutoPrereqs",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::NextVersion",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::NextVersion" : {
+                  "first_version" : "0.001",
+                  "version_by_branch" : "0",
+                  "version_regexp" : "(?^:^([0-9]+\\.[0-9]+)$)"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Filter/Git::NextVersion",
-            "version" : "2.007"
+            "version" : "2.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::PkgVersion",
             "name" : "@Filter/PkgVersion",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaConfig",
             "name" : "@Filter/MetaConfig",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaJSON",
             "name" : "@Filter/MetaJSON",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::NextRelease",
             "name" : "@Filter/NextRelease",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent",
             "name" : "@Filter/Test::ChangesHasContent",
-            "version" : "0.006"
+            "version" : "0.007"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodSyntaxTests",
             "name" : "@Filter/PodSyntaxTests",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
-            "class" : "Dist::Zilla::Plugin::ReportVersions::Tiny",
-            "name" : "@Filter/ReportVersions::Tiny",
-            "version" : "1.08"
+            "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs",
+            "name" : "@Filter/Test::ReportPrereqs",
+            "version" : "0.019"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -278,57 +358,214 @@
                }
             },
             "name" : "@Filter/TestMoreWithSubtests",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodWeaver",
+            "config" : {
+               "Dist::Zilla::Plugin::PodWeaver" : {
+                  "config_plugins" : [
+                     "@RJBS"
+                  ],
+                  "finder" : [
+                     ":InstallModules",
+                     ":ExecFiles"
+                  ],
+                  "plugins" : [
+                     {
+                        "class" : "Pod::Weaver::Plugin::EnsurePod5",
+                        "name" : "@CorePrep/EnsurePod5",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Plugin::H1Nester",
+                        "name" : "@CorePrep/H1Nester",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Plugin::SingleEncoding",
+                        "name" : "@RJBS/SingleEncoding",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Name",
+                        "name" : "@RJBS/Name",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Version",
+                        "name" : "@RJBS/Version",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Region",
+                        "name" : "@RJBS/Prelude",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Synopsis",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Description",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Overview",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Stability",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Collect",
+                        "name" : "Attributes",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Collect",
+                        "name" : "Methods",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Collect",
+                        "name" : "Functions",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Leftovers",
+                        "name" : "@RJBS/Leftovers",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Region",
+                        "name" : "@RJBS/postlude",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Authors",
+                        "name" : "@RJBS/Authors",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Legal",
+                        "name" : "@RJBS/Legal",
+                        "version" : "4.007"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Plugin::Transformer",
+                        "name" : "@RJBS/List",
+                        "version" : "4.007"
+                     }
+                  ]
+               }
+            },
             "name" : "@Filter/PodWeaver",
-            "version" : "3.101641"
+            "version" : "4.006"
          },
          {
             "class" : "Dist::Zilla::Plugin::GithubMeta",
             "name" : "@Filter/GithubMeta",
-            "version" : "0.28"
+            "version" : "0.46"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Check",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Check" : {
+                  "untracked_files" : "die"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [
+                     "dist.ini",
+                     "Changes"
+                  ],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Filter/@Git/Check",
-            "version" : "2.007"
+            "version" : "2.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Commit",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Commit" : {
+                  "add_files_in" : [],
+                  "commit_msg" : "v%v%n%n%c",
+                  "time_zone" : "local"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [
+                     "dist.ini",
+                     "Changes"
+                  ],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Filter/@Git/Commit",
-            "version" : "2.007"
+            "version" : "2.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Tag",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Tag" : {
+                  "branch" : null,
+                  "signed" : 0,
+                  "tag" : "5.025",
+                  "tag_format" : "%v",
+                  "tag_message" : "v%v",
+                  "time_zone" : "local"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Filter/@Git/Tag",
-            "version" : "2.007"
+            "version" : "2.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Push",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Push" : {
+                  "push_to" : [
+                     "origin :",
+                     "github :"
+                  ],
+                  "remotes_must_exist" : 0
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Filter/@Git/Push",
-            "version" : "2.007"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::Test::Compile",
-            "name" : "Test::Compile",
-            "version" : "1.112820"
+            "version" : "2.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::ModuleShareDirs",
             "name" : "ModuleShareDirs",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaNoIndex",
             "name" : "MetaNoIndex",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaResources",
             "name" : "MetaResources",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -339,7 +576,7 @@
                }
             },
             "name" : "TestRequires",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -350,7 +587,18 @@
                }
             },
             "name" : "RuntimeRecommends",
-            "version" : "4.300030"
+            "version" : "5.024"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Prereqs",
+            "config" : {
+               "Dist::Zilla::Plugin::Prereqs" : {
+                  "phase" : "runtime",
+                  "type" : "suggests"
+               }
+            },
+            "name" : "RuntimeSuggests",
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -361,7 +609,7 @@
                }
             },
             "name" : "Prereqs",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::RemovePrereqs",
@@ -375,42 +623,67 @@
                }
             },
             "name" : "RemovePrereqs",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::CPANFile",
             "name" : "CPANFile",
-            "version" : "4.300030"
+            "version" : "5.024"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Breaks",
+            "name" : "Breaks",
+            "version" : "0.003"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Test::CheckBreaks",
+            "config" : {
+               "Dist::Zilla::Plugin::Test::CheckBreaks" : {
+                  "conflicts_module" : "Moose::Conflicts"
+               }
+            },
+            "name" : "Test::CheckBreaks",
+            "version" : "0.011"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":InstallModules",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":IncModules",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":TestFiles",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ExecFiles",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ShareFiles",
-            "version" : "4.300030"
+            "version" : "5.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":MainModule",
-            "version" : "4.300030"
+            "version" : "5.024"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::FinderCode",
+            "name" : ":AllFiles",
+            "version" : "5.024"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::FinderCode",
+            "name" : ":NoFiles",
+            "version" : "5.024"
          }
       ],
       "zilla" : {
@@ -418,8 +691,11 @@
          "config" : {
             "is_trial" : "0"
          },
-         "version" : "4.300030"
+         "version" : "5.024"
       }
+   },
+   "x_breaks" : {
+      "Dist::Zilla::Plugin::MakeMaker::Awesome" : "< 0.22"
    }
 }
 
@@ -3,215 +3,274 @@ abstract: 'distribution builder; installer not included!'
 author:
   - 'Ricardo SIGNES <rjbs@cpan.org>'
 build_requires:
-  File::Find: 0
-  Software::License::None: 0
-  Test::Fatal: 0
-  Test::File::ShareDir: 0
-  Test::More: 0.96
+  CPAN::Meta::Check: '0.007'
+  CPAN::Meta::Requirements: '2.121'
+  ExtUtils::MakeMaker: '0'
+  ExtUtils::Manifest: '1.66'
+  File::Spec: '0'
+  Software::License::None: '0'
+  Test::FailWarnings: '0'
+  Test::Fatal: '0'
+  Test::File::ShareDir: '0'
+  Test::More: '0.96'
+  lib: '0'
+  utf8: '0'
 configure_requires:
-  ExtUtils::MakeMaker: 6.30
-  File::ShareDir::Install: 0.03
+  ExtUtils::MakeMaker: '0'
+  File::ShareDir::Install: '0.06'
 dynamic_config: 0
-generated_by: 'Dist::Zilla version 4.300030, CPAN::Meta::Converter version 2.120921'
+generated_by: 'Dist::Zilla version 5.024, CPAN::Meta::Converter version 2.142690'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: Dist-Zilla
 no_index:
   directory:
     - corpus
     - misc
 recommends:
-  Term::ReadLine::Gnu: 0
+  Archive::Tar::Wrapper: '0.15'
+  Term::ReadLine::Gnu: '0'
 requires:
-  App::Cmd::Setup: 0.309
-  App::Cmd::Tester: 0.306
-  App::Cmd::Tester::CaptureExternal: 0
-  Archive::Tar: 0
-  CPAN::Meta::Converter: 2.101550
-  CPAN::Meta::Prereqs: 2.120630
-  CPAN::Meta::Requirements: 2.121
-  CPAN::Meta::Validator: 2.101550
-  CPAN::Uploader: 0.101550
-  Carp: 0
-  Class::Load: 0.17
-  Config::INI::Reader: 0
-  Config::MVP::Assembler: 0
-  Config::MVP::Assembler::WithBundles: 0
-  Config::MVP::Reader: 2.101540
-  Config::MVP::Reader::Findable::ByExtension: 0
-  Config::MVP::Reader::Finder: 0
-  Config::MVP::Reader::INI: 2
-  Config::MVP::Section: 2.200002
-  Data::Dumper: 0
-  Data::Section: 0.004
-  DateTime: 0.44
-  Digest::MD5: 0
-  Encode: 0
-  ExtUtils::Manifest: 1.54
-  File::Copy::Recursive: 0
-  File::Find::Rule: 0
-  File::HomeDir: 0
-  File::Path: 0
-  File::ShareDir: 0
-  File::ShareDir::Install: 0.03
-  File::Spec: 0
-  File::Temp: 0
-  File::pushd: 0
-  Hash::Merge::Simple: 0
-  JSON: 2
-  List::AllUtils: 0
-  List::MoreUtils: 0
-  List::Util: 0
-  Log::Dispatchouli: 1.102220
-  Moose: 0.92
-  Moose::Autobox: 0.10
-  Moose::Role: 0
-  Moose::Util::TypeConstraints: 0
-  MooseX::LazyRequire: 0
-  MooseX::Role::Parameterized: 0
-  MooseX::SetOnce: 0
-  MooseX::Types: 0
-  MooseX::Types::Moose: 0
-  MooseX::Types::Path::Class: 0
-  MooseX::Types::Perl: 0
-  PPI: 0
-  Params::Util: 0
-  Path::Class: 0
-  Perl::PrereqScanner: 1.005
-  Perl::Version: 0
-  Pod::Eventual: 0.091480
-  Scalar::Util: 0
-  Software::License: 0.101370
-  Software::LicenseUtils: 0
-  String::Formatter: 0.100680
-  String::RewritePrefix: 0.005
-  Sub::Exporter: 0
-  Sub::Exporter::ForMethods: 0
-  Sub::Exporter::Util: 0
-  Term::ReadKey: 0
-  Term::ReadLine: 0
-  Term::UI: 0
-  Test::Deep: 0
-  Text::Glob: 0.08
-  Text::Template: 0
-  Try::Tiny: 0
-  YAML::Tiny: 0
-  autobox: 2.53
-  autodie: 0
-  namespace::autoclean: 0
-  parent: 0
+  App::Cmd::Command::version: '0'
+  App::Cmd::Setup: '0.309'
+  App::Cmd::Tester: '0.306'
+  App::Cmd::Tester::CaptureExternal: '0'
+  Archive::Tar: '0'
+  CPAN::Meta::Converter: '2.101550'
+  CPAN::Meta::Merge: '0'
+  CPAN::Meta::Prereqs: '2.120630'
+  CPAN::Meta::Requirements: '2.121'
+  CPAN::Meta::Validator: '2.101550'
+  CPAN::Uploader: '0.103004'
+  Carp: '0'
+  Class::Load: '0.17'
+  Config::INI::Reader: '0'
+  Config::MVP::Assembler: '0'
+  Config::MVP::Assembler::WithBundles: '0'
+  Config::MVP::Reader: '2.101540'
+  Config::MVP::Reader::Findable::ByExtension: '0'
+  Config::MVP::Reader::Finder: '0'
+  Config::MVP::Reader::INI: '2'
+  Config::MVP::Section: '2.200002'
+  Data::Dumper: '0'
+  Data::Section: '0.200002'
+  DateTime: '0.44'
+  Digest::MD5: '0'
+  Encode: '0'
+  ExtUtils::Manifest: '1.66'
+  File::Copy::Recursive: '0'
+  File::Find::Rule: '0'
+  File::HomeDir: '0'
+  File::Path: '0'
+  File::ShareDir: '0'
+  File::ShareDir::Install: '0.03'
+  File::Spec: '0'
+  File::Temp: '0'
+  File::pushd: '0'
+  JSON: '2'
+  List::MoreUtils: '0'
+  List::Util: '1.33'
+  Log::Dispatchouli: '1.102220'
+  Mixin::Linewise::Readers: '0.100'
+  Module::CoreList: '0'
+  Moose: '0.92'
+  Moose::Autobox: '0.09'
+  Moose::Role: '0'
+  Moose::Util::TypeConstraints: '0'
+  MooseX::LazyRequire: '0'
+  MooseX::Role::Parameterized: '0'
+  MooseX::SetOnce: '0'
+  MooseX::Types: '0'
+  MooseX::Types::Moose: '0'
+  MooseX::Types::Path::Class: '0'
+  MooseX::Types::Perl: '0'
+  PPI::Document: '0'
+  Params::Util: '0'
+  Path::Class: '0.22'
+  Path::Tiny: '0'
+  Perl::PrereqScanner: '1.016'
+  Perl::Version: '0'
+  Pod::Eventual: '0.091480'
+  Scalar::Util: '0'
+  Software::License: '0.101370'
+  Software::LicenseUtils: '0'
+  Storable: '0'
+  String::Formatter: '0.100680'
+  String::RewritePrefix: '0.005'
+  Sub::Exporter: '0'
+  Sub::Exporter::ForMethods: '0'
+  Sub::Exporter::Util: '0'
+  Term::Encoding: '0'
+  Term::ReadKey: '0'
+  Term::ReadLine: '0'
+  Term::UI: '0'
+  Test::Deep: '0'
+  Text::Glob: '0.08'
+  Text::Template: '0'
+  Try::Tiny: '0'
+  YAML::Tiny: '0'
+  autobox: '2.53'
+  autodie: '0'
+  namespace::autoclean: '0'
+  parent: '0'
   perl: v5.8.5
-  strict: 0
-  version: 0
-  warnings: 0
+  strict: '0'
+  version: '0'
+  warnings: '0'
 resources:
-  X_mailing_list: http://www.listbox.com/subscribe/?list_id=139292
-  bugtracker: https://github.com/rjbs/dist-zilla/issues
-  homepage: http://dzil.org/
-  repository: http://github.com/rjbs/dist-zilla.git
-version: 4.300030
+  Mailing_list: http://www.listbox.com/subscribe/?list_id=139292
+  bugtracker: https://github.com/rjbs/Dist-Zilla/issues
+  homepage: https://github.com/rjbs/Dist-Zilla
+  repository: https://github.com/rjbs/Dist-Zilla.git
+version: '5.025'
 x_Dist_Zilla:
   perl:
-    version: 5.017008
+    version: '5.021005'
   plugins:
     -
       class: Dist::Zilla::Plugin::Git::GatherDir
+      config:
+        Dist::Zilla::Plugin::GatherDir:
+          exclude_filename: []
+          exclude_match: []
+          follow_symlinks: '0'
+          include_dotfiles: '0'
+          prefix: ''
+          prune_directory: []
+          root: .
+        Dist::Zilla::Plugin::Git::GatherDir:
+          include_untracked: '0'
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Filter/Git::GatherDir'
-      version: 2.007
+      version: '2.025'
     -
       class: Dist::Zilla::Plugin::CheckPrereqsIndexed
       name: '@Filter/CheckPrereqsIndexed'
-      version: 0.008
+      version: '0.012'
     -
       class: Dist::Zilla::Plugin::CheckExtraTests
       name: '@Filter/CheckExtraTests'
-      version: 0.008
+      version: '0.024'
+    -
+      class: Dist::Zilla::Plugin::PromptIfStale
+      config:
+        Dist::Zilla::Plugin::PromptIfStale:
+          check_all_plugins: 0
+          check_all_prereqs: 0
+          modules:
+            - Dist::Zilla::PluginBundle::RJBS
+          phase: build
+          skip: []
+      name: '@Filter/RJBS-Outdated'
+      version: '0.029'
+    -
+      class: Dist::Zilla::Plugin::PromptIfStale
+      config:
+        Dist::Zilla::Plugin::PromptIfStale:
+          check_all_plugins: '1'
+          check_all_prereqs: 0
+          modules: []
+          phase: release
+          skip: []
+      name: '@Filter/CPAN-Outdated'
+      version: '0.029'
     -
       class: Dist::Zilla::Plugin::PruneCruft
       name: '@Filter/@Filter/PruneCruft'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::ManifestSkip
       name: '@Filter/@Filter/ManifestSkip'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::MetaYAML
       name: '@Filter/@Filter/MetaYAML'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::License
       name: '@Filter/@Filter/License'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Readme
       name: '@Filter/@Filter/Readme'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::ExecDir
       name: '@Filter/@Filter/ExecDir'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::ShareDir
       name: '@Filter/@Filter/ShareDir'
-      version: 4.300030
-    -
-      class: Dist::Zilla::Plugin::MakeMaker
-      name: '@Filter/@Filter/MakeMaker'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Manifest
       name: '@Filter/@Filter/Manifest'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::TestRelease
       name: '@Filter/@Filter/TestRelease'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::ConfirmRelease
       name: '@Filter/@Filter/ConfirmRelease'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::UploadToCPAN
       name: '@Filter/@Filter/UploadToCPAN'
-      version: 4.300030
+      version: '5.024'
+    -
+      class: Dist::Zilla::Plugin::MakeMaker
+      config:
+        Dist::Zilla::Role::TestRunner:
+          default_jobs: 9
+      name: '@Filter/MakeMaker'
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::AutoPrereqs
       name: '@Filter/AutoPrereqs'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Git::NextVersion
+      config:
+        Dist::Zilla::Plugin::Git::NextVersion:
+          first_version: '0.001'
+          version_by_branch: '0'
+          version_regexp: (?^:^([0-9]+\.[0-9]+)$)
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Filter/Git::NextVersion'
-      version: 2.007
+      version: '2.025'
     -
       class: Dist::Zilla::Plugin::PkgVersion
       name: '@Filter/PkgVersion'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::MetaConfig
       name: '@Filter/MetaConfig'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::MetaJSON
       name: '@Filter/MetaJSON'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::NextRelease
       name: '@Filter/NextRelease'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Test::ChangesHasContent
       name: '@Filter/Test::ChangesHasContent'
-      version: 0.006
+      version: '0.007'
     -
       class: Dist::Zilla::Plugin::PodSyntaxTests
       name: '@Filter/PodSyntaxTests'
-      version: 4.300030
+      version: '5.024'
     -
-      class: Dist::Zilla::Plugin::ReportVersions::Tiny
-      name: '@Filter/ReportVersions::Tiny'
-      version: 1.08
+      class: Dist::Zilla::Plugin::Test::ReportPrereqs
+      name: '@Filter/Test::ReportPrereqs'
+      version: '0.019'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -219,47 +278,165 @@ x_Dist_Zilla:
           phase: test
           type: requires
       name: '@Filter/TestMoreWithSubtests'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::PodWeaver
+      config:
+        Dist::Zilla::Plugin::PodWeaver:
+          config_plugins:
+            - '@RJBS'
+          finder:
+            - ':InstallModules'
+            - ':ExecFiles'
+          plugins:
+            -
+              class: Pod::Weaver::Plugin::EnsurePod5
+              name: '@CorePrep/EnsurePod5'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Plugin::H1Nester
+              name: '@CorePrep/H1Nester'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Plugin::SingleEncoding
+              name: '@RJBS/SingleEncoding'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Name
+              name: '@RJBS/Name'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Version
+              name: '@RJBS/Version'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Region
+              name: '@RJBS/Prelude'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Synopsis'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Description'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Overview'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Stability'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Collect
+              name: Attributes
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Collect
+              name: Methods
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Collect
+              name: Functions
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Leftovers
+              name: '@RJBS/Leftovers'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Region
+              name: '@RJBS/postlude'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Authors
+              name: '@RJBS/Authors'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Section::Legal
+              name: '@RJBS/Legal'
+              version: '4.007'
+            -
+              class: Pod::Weaver::Plugin::Transformer
+              name: '@RJBS/List'
+              version: '4.007'
       name: '@Filter/PodWeaver'
-      version: 3.101641
+      version: '4.006'
     -
       class: Dist::Zilla::Plugin::GithubMeta
       name: '@Filter/GithubMeta'
-      version: 0.28
+      version: '0.46'
     -
       class: Dist::Zilla::Plugin::Git::Check
+      config:
+        Dist::Zilla::Plugin::Git::Check:
+          untracked_files: die
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty:
+            - dist.ini
+            - Changes
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Filter/@Git/Check'
-      version: 2.007
+      version: '2.025'
     -
       class: Dist::Zilla::Plugin::Git::Commit
+      config:
+        Dist::Zilla::Plugin::Git::Commit:
+          add_files_in: []
+          commit_msg: v%v%n%n%c
+          time_zone: local
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty:
+            - dist.ini
+            - Changes
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Filter/@Git/Commit'
-      version: 2.007
+      version: '2.025'
     -
       class: Dist::Zilla::Plugin::Git::Tag
+      config:
+        Dist::Zilla::Plugin::Git::Tag:
+          branch: ~
+          signed: 0
+          tag: '5.025'
+          tag_format: '%v'
+          tag_message: v%v
+          time_zone: local
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Filter/@Git/Tag'
-      version: 2.007
+      version: '2.025'
     -
       class: Dist::Zilla::Plugin::Git::Push
+      config:
+        Dist::Zilla::Plugin::Git::Push:
+          push_to:
+            - 'origin :'
+            - 'github :'
+          remotes_must_exist: 0
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Filter/@Git/Push'
-      version: 2.007
-    -
-      class: Dist::Zilla::Plugin::Test::Compile
-      name: Test::Compile
-      version: 1.112820
+      version: '2.025'
     -
       class: Dist::Zilla::Plugin::ModuleShareDirs
       name: ModuleShareDirs
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::MetaNoIndex
       name: MetaNoIndex
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::MetaResources
       name: MetaResources
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -267,7 +444,7 @@ x_Dist_Zilla:
           phase: test
           type: requires
       name: TestRequires
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -275,7 +452,15 @@ x_Dist_Zilla:
           phase: runtime
           type: recommends
       name: RuntimeRecommends
-      version: 4.300030
+      version: '5.024'
+    -
+      class: Dist::Zilla::Plugin::Prereqs
+      config:
+        Dist::Zilla::Plugin::Prereqs:
+          phase: runtime
+          type: suggests
+      name: RuntimeSuggests
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -283,7 +468,7 @@ x_Dist_Zilla:
           phase: runtime
           type: requires
       name: Prereqs
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::RemovePrereqs
       config:
@@ -293,37 +478,58 @@ x_Dist_Zilla:
             - Dist::Zilla::Tester::_Role
             - Some::Package::That::Does::Not::Exist::Due::To::A::Typo
       name: RemovePrereqs
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::CPANFile
       name: CPANFile
-      version: 4.300030
+      version: '5.024'
+    -
+      class: Dist::Zilla::Plugin::Breaks
+      name: Breaks
+      version: '0.003'
+    -
+      class: Dist::Zilla::Plugin::Test::CheckBreaks
+      config:
+        Dist::Zilla::Plugin::Test::CheckBreaks:
+          conflicts_module: Moose::Conflicts
+      name: Test::CheckBreaks
+      version: '0.011'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':InstallModules'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':IncModules'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':TestFiles'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ExecFiles'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ShareFiles'
-      version: 4.300030
+      version: '5.024'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':MainModule'
-      version: 4.300030
+      version: '5.024'
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':AllFiles'
+      version: '5.024'
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':NoFiles'
+      version: '5.024'
   zilla:
     class: Dist::Zilla::Dist::Builder
     config:
-      is_trial: 0
-    version: 4.300030
+      is_trial: '0'
+    version: '5.024'
+x_breaks:
+  Dist::Zilla::Plugin::MakeMaker::Awesome: '< 0.22'
@@ -1,45 +1,44 @@
 
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.024.
 use strict;
 use warnings;
 
 use 5.008005;
 
-use ExtUtils::MakeMaker 6.30;
+use ExtUtils::MakeMaker;
 
 use File::ShareDir::Install;
+$File::ShareDir::Install::INCLUDE_DOTFILES = 1;
+$File::ShareDir::Install::INCLUDE_DOTDIRS = 1;
 install_share module => "Dist::Zilla::MintingProfile::Default", "profiles";
 
 
 my %WriteMakefileArgs = (
   "ABSTRACT" => "distribution builder; installer not included!",
   "AUTHOR" => "Ricardo SIGNES <rjbs\@cpan.org>",
-  "BUILD_REQUIRES" => {
-    "File::Find" => 0,
-    "Software::License::None" => 0,
-    "Test::Fatal" => 0,
-    "Test::File::ShareDir" => 0,
-    "Test::More" => "0.96"
-  },
   "CONFIGURE_REQUIRES" => {
-    "ExtUtils::MakeMaker" => "6.30",
-    "File::ShareDir::Install" => "0.03"
+    "ExtUtils::MakeMaker" => 0,
+    "File::ShareDir::Install" => "0.06"
   },
   "DISTNAME" => "Dist-Zilla",
   "EXE_FILES" => [
     "bin/dzil"
   ],
   "LICENSE" => "perl",
+  "MIN_PERL_VERSION" => "5.008005",
   "NAME" => "Dist::Zilla",
   "PREREQ_PM" => {
+    "App::Cmd::Command::version" => 0,
     "App::Cmd::Setup" => "0.309",
     "App::Cmd::Tester" => "0.306",
     "App::Cmd::Tester::CaptureExternal" => 0,
     "Archive::Tar" => 0,
     "CPAN::Meta::Converter" => "2.101550",
+    "CPAN::Meta::Merge" => 0,
     "CPAN::Meta::Prereqs" => "2.120630",
     "CPAN::Meta::Requirements" => "2.121",
     "CPAN::Meta::Validator" => "2.101550",
-    "CPAN::Uploader" => "0.101550",
+    "CPAN::Uploader" => "0.103004",
     "Carp" => 0,
     "Class::Load" => "0.17",
     "Config::INI::Reader" => 0,
@@ -51,11 +50,11 @@ my %WriteMakefileArgs = (
     "Config::MVP::Reader::INI" => 2,
     "Config::MVP::Section" => "2.200002",
     "Data::Dumper" => 0,
-    "Data::Section" => "0.004",
+    "Data::Section" => "0.200002",
     "DateTime" => "0.44",
     "Digest::MD5" => 0,
     "Encode" => 0,
-    "ExtUtils::Manifest" => "1.54",
+    "ExtUtils::Manifest" => "1.66",
     "File::Copy::Recursive" => 0,
     "File::Find::Rule" => 0,
     "File::HomeDir" => 0,
@@ -65,14 +64,14 @@ my %WriteMakefileArgs = (
     "File::Spec" => 0,
     "File::Temp" => 0,
     "File::pushd" => 0,
-    "Hash::Merge::Simple" => 0,
     "JSON" => 2,
-    "List::AllUtils" => 0,
     "List::MoreUtils" => 0,
-    "List::Util" => 0,
+    "List::Util" => "1.33",
     "Log::Dispatchouli" => "1.102220",
+    "Mixin::Linewise::Readers" => "0.100",
+    "Module::CoreList" => 0,
     "Moose" => "0.92",
-    "Moose::Autobox" => "0.10",
+    "Moose::Autobox" => "0.09",
     "Moose::Role" => 0,
     "Moose::Util::TypeConstraints" => 0,
     "MooseX::LazyRequire" => 0,
@@ -82,20 +81,23 @@ my %WriteMakefileArgs = (
     "MooseX::Types::Moose" => 0,
     "MooseX::Types::Path::Class" => 0,
     "MooseX::Types::Perl" => 0,
-    "PPI" => 0,
+    "PPI::Document" => 0,
     "Params::Util" => 0,
-    "Path::Class" => 0,
-    "Perl::PrereqScanner" => "1.005",
+    "Path::Class" => "0.22",
+    "Path::Tiny" => 0,
+    "Perl::PrereqScanner" => "1.016",
     "Perl::Version" => 0,
     "Pod::Eventual" => "0.091480",
     "Scalar::Util" => 0,
     "Software::License" => "0.101370",
     "Software::LicenseUtils" => 0,
+    "Storable" => 0,
     "String::Formatter" => "0.100680",
     "String::RewritePrefix" => "0.005",
     "Sub::Exporter" => 0,
     "Sub::Exporter::ForMethods" => 0,
     "Sub::Exporter::Util" => 0,
+    "Term::Encoding" => 0,
     "Term::ReadKey" => 0,
     "Term::ReadLine" => 0,
     "Term::UI" => 0,
@@ -112,24 +114,129 @@ my %WriteMakefileArgs = (
     "version" => 0,
     "warnings" => 0
   },
-  "VERSION" => "4.300030",
+  "TEST_REQUIRES" => {
+    "CPAN::Meta::Check" => "0.007",
+    "CPAN::Meta::Requirements" => "2.121",
+    "ExtUtils::MakeMaker" => 0,
+    "ExtUtils::Manifest" => "1.66",
+    "File::Spec" => 0,
+    "Software::License::None" => 0,
+    "Test::FailWarnings" => 0,
+    "Test::Fatal" => 0,
+    "Test::File::ShareDir" => 0,
+    "Test::More" => "0.96",
+    "lib" => 0,
+    "utf8" => 0
+  },
+  "VERSION" => "5.025",
   "test" => {
     "TESTS" => "t/*.t t/commands/*.t t/diagnostics/*.t t/plugins/*.t"
   }
 );
 
 
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
-  my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
-  my $pp = $WriteMakefileArgs{PREREQ_PM};
-  for my $mod ( keys %$br ) {
-    if ( exists $pp->{$mod} ) {
-      $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
-    }
-    else {
-      $pp->{$mod} = $br->{$mod};
-    }
-  }
+my %FallbackPrereqs = (
+  "App::Cmd::Command::version" => 0,
+  "App::Cmd::Setup" => "0.309",
+  "App::Cmd::Tester" => "0.306",
+  "App::Cmd::Tester::CaptureExternal" => 0,
+  "Archive::Tar" => 0,
+  "CPAN::Meta::Check" => "0.007",
+  "CPAN::Meta::Converter" => "2.101550",
+  "CPAN::Meta::Merge" => 0,
+  "CPAN::Meta::Prereqs" => "2.120630",
+  "CPAN::Meta::Requirements" => "2.121",
+  "CPAN::Meta::Validator" => "2.101550",
+  "CPAN::Uploader" => "0.103004",
+  "Carp" => 0,
+  "Class::Load" => "0.17",
+  "Config::INI::Reader" => 0,
+  "Config::MVP::Assembler" => 0,
+  "Config::MVP::Assembler::WithBundles" => 0,
+  "Config::MVP::Reader" => "2.101540",
+  "Config::MVP::Reader::Findable::ByExtension" => 0,
+  "Config::MVP::Reader::Finder" => 0,
+  "Config::MVP::Reader::INI" => 2,
+  "Config::MVP::Section" => "2.200002",
+  "Data::Dumper" => 0,
+  "Data::Section" => "0.200002",
+  "DateTime" => "0.44",
+  "Digest::MD5" => 0,
+  "Encode" => 0,
+  "ExtUtils::MakeMaker" => 0,
+  "ExtUtils::Manifest" => "1.66",
+  "File::Copy::Recursive" => 0,
+  "File::Find::Rule" => 0,
+  "File::HomeDir" => 0,
+  "File::Path" => 0,
+  "File::ShareDir" => 0,
+  "File::ShareDir::Install" => "0.06",
+  "File::Spec" => 0,
+  "File::Temp" => 0,
+  "File::pushd" => 0,
+  "JSON" => 2,
+  "List::MoreUtils" => 0,
+  "List::Util" => "1.33",
+  "Log::Dispatchouli" => "1.102220",
+  "Mixin::Linewise::Readers" => "0.100",
+  "Module::CoreList" => 0,
+  "Moose" => "0.92",
+  "Moose::Autobox" => "0.09",
+  "Moose::Role" => 0,
+  "Moose::Util::TypeConstraints" => 0,
+  "MooseX::LazyRequire" => 0,
+  "MooseX::Role::Parameterized" => 0,
+  "MooseX::SetOnce" => 0,
+  "MooseX::Types" => 0,
+  "MooseX::Types::Moose" => 0,
+  "MooseX::Types::Path::Class" => 0,
+  "MooseX::Types::Perl" => 0,
+  "PPI::Document" => 0,
+  "Params::Util" => 0,
+  "Path::Class" => "0.22",
+  "Path::Tiny" => 0,
+  "Perl::PrereqScanner" => "1.016",
+  "Perl::Version" => 0,
+  "Pod::Eventual" => "0.091480",
+  "Scalar::Util" => 0,
+  "Software::License" => "0.101370",
+  "Software::License::None" => 0,
+  "Software::LicenseUtils" => 0,
+  "Storable" => 0,
+  "String::Formatter" => "0.100680",
+  "String::RewritePrefix" => "0.005",
+  "Sub::Exporter" => 0,
+  "Sub::Exporter::ForMethods" => 0,
+  "Sub::Exporter::Util" => 0,
+  "Term::Encoding" => 0,
+  "Term::ReadKey" => 0,
+  "Term::ReadLine" => 0,
+  "Term::UI" => 0,
+  "Test::Deep" => 0,
+  "Test::FailWarnings" => 0,
+  "Test::Fatal" => 0,
+  "Test::File::ShareDir" => 0,
+  "Test::More" => "0.96",
+  "Text::Glob" => "0.08",
+  "Text::Template" => 0,
+  "Try::Tiny" => 0,
+  "YAML::Tiny" => 0,
+  "autobox" => "2.53",
+  "autodie" => 0,
+  "lib" => 0,
+  "namespace::autoclean" => 0,
+  "parent" => 0,
+  "strict" => 0,
+  "utf8" => 0,
+  "version" => 0,
+  "warnings" => 0
+);
+
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+  delete $WriteMakefileArgs{TEST_REQUIRES};
+  delete $WriteMakefileArgs{BUILD_REQUIRES};
+  $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
 }
 
 delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
@@ -1,13 +1,15 @@
 
 
 This archive contains the distribution Dist-Zilla,
-version 4.300030:
+version 5.025:
 
   distribution builder; installer not included!
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 
+This README file was generated by Dist::Zilla::Plugin::Readme v5.024.
+
@@ -11,17 +11,26 @@ $main::VERSION = $Dist::Zilla::App::VERSION;
 # ABSTRACT: do stuff with your dist
 Dist::Zilla::App->run;
 
+#pod =head1 OVERVIEW
+#pod
+#pod For help with Dist::Zilla, start with http://dzil.org/ or by running "dzil
+#pod commands"
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 dzil - do stuff with your dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -34,7 +43,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,24 @@
+name    = Foo
+version = 1.23
+author  = foobar
+license = Perl_5
+copyright_holder = foobar
+copyright_year   = 2009
+
+; authordep perl = 5.005
+
+[GatherDir]
+[ExecDir/BadlyPaddedName]
+:version = 5.0
+
+[AutoPrereqs]
+:version = 5.0
+
+skip = ^DZPA::Skip
+[MetaYAML]
+version = 2
+
+[Encoding / WithDescription]
+:version = 5.0
+encoding = bytes
+filename = t/data.bin
@@ -5,9 +5,15 @@ license = Perl_5
 copyright_holder = foobar
 copyright_year   = 2009
 
+; authordep perl = 5.005
+
 [GatherDir]
 [ExecDir]
 [AutoPrereqs]
 skip = ^DZPA::Skip
 [MetaYAML]
 version = 2
+
+[Encoding]
+encoding = bytes
+filename = t/data.bin
@@ -0,0 +1 @@
+pretend this is binary, OK?
@@ -0,0 +1,4 @@
+Revision history for {{$dist->name}}
+
+{{$NEXT}}
+        - Olivier Mengué was here!
@@ -0,0 +1,10 @@
+name    = DZ-NonAscii
+version = 0.001
+author  = Olivier Mengué <dolmen@example.org>
+author  = 김도형 <keedi@example.com>
+license = Perl_5
+copyright_holder = ภูมิพลอดุลยเดช
+
+[@Classic]
+[MetaJSON]
+[NextRelease]
@@ -0,0 +1,10 @@
+use strict;
+use warnings;
+package DZ1;
+# ABSTRACT: this is a sample package for testing Dist::Zilla;
+
+sub main {
+  return 1;
+}
+
+1;
@@ -0,0 +1 @@
+some random data that should be shared...
@@ -1,12 +1,14 @@
+requires "App::Cmd::Command::version" => "0";
 requires "App::Cmd::Setup" => "0.309";
 requires "App::Cmd::Tester" => "0.306";
 requires "App::Cmd::Tester::CaptureExternal" => "0";
 requires "Archive::Tar" => "0";
 requires "CPAN::Meta::Converter" => "2.101550";
+requires "CPAN::Meta::Merge" => "0";
 requires "CPAN::Meta::Prereqs" => "2.120630";
 requires "CPAN::Meta::Requirements" => "2.121";
 requires "CPAN::Meta::Validator" => "2.101550";
-requires "CPAN::Uploader" => "0.101550";
+requires "CPAN::Uploader" => "0.103004";
 requires "Carp" => "0";
 requires "Class::Load" => "0.17";
 requires "Config::INI::Reader" => "0";
@@ -18,11 +20,11 @@ requires "Config::MVP::Reader::Finder" => "0";
 requires "Config::MVP::Reader::INI" => "2";
 requires "Config::MVP::Section" => "2.200002";
 requires "Data::Dumper" => "0";
-requires "Data::Section" => "0.004";
+requires "Data::Section" => "0.200002";
 requires "DateTime" => "0.44";
 requires "Digest::MD5" => "0";
 requires "Encode" => "0";
-requires "ExtUtils::Manifest" => "1.54";
+requires "ExtUtils::Manifest" => "1.66";
 requires "File::Copy::Recursive" => "0";
 requires "File::Find::Rule" => "0";
 requires "File::HomeDir" => "0";
@@ -32,14 +34,14 @@ requires "File::ShareDir::Install" => "0.03";
 requires "File::Spec" => "0";
 requires "File::Temp" => "0";
 requires "File::pushd" => "0";
-requires "Hash::Merge::Simple" => "0";
 requires "JSON" => "2";
-requires "List::AllUtils" => "0";
 requires "List::MoreUtils" => "0";
-requires "List::Util" => "0";
+requires "List::Util" => "1.33";
 requires "Log::Dispatchouli" => "1.102220";
+requires "Mixin::Linewise::Readers" => "0.100";
+requires "Module::CoreList" => "0";
 requires "Moose" => "0.92";
-requires "Moose::Autobox" => "0.10";
+requires "Moose::Autobox" => "0.09";
 requires "Moose::Role" => "0";
 requires "Moose::Util::TypeConstraints" => "0";
 requires "MooseX::LazyRequire" => "0";
@@ -49,20 +51,23 @@ requires "MooseX::Types" => "0";
 requires "MooseX::Types::Moose" => "0";
 requires "MooseX::Types::Path::Class" => "0";
 requires "MooseX::Types::Perl" => "0";
-requires "PPI" => "0";
+requires "PPI::Document" => "0";
 requires "Params::Util" => "0";
-requires "Path::Class" => "0";
-requires "Perl::PrereqScanner" => "1.005";
+requires "Path::Class" => "0.22";
+requires "Path::Tiny" => "0";
+requires "Perl::PrereqScanner" => "1.016";
 requires "Perl::Version" => "0";
 requires "Pod::Eventual" => "0.091480";
 requires "Scalar::Util" => "0";
 requires "Software::License" => "0.101370";
 requires "Software::LicenseUtils" => "0";
+requires "Storable" => "0";
 requires "String::Formatter" => "0.100680";
 requires "String::RewritePrefix" => "0.005";
 requires "Sub::Exporter" => "0";
 requires "Sub::Exporter::ForMethods" => "0";
 requires "Sub::Exporter::Util" => "0";
+requires "Term::Encoding" => "0";
 requires "Term::ReadKey" => "0";
 requires "Term::ReadLine" => "0";
 requires "Term::UI" => "0";
@@ -79,22 +84,34 @@ requires "perl" => "v5.8.5";
 requires "strict" => "0";
 requires "version" => "0";
 requires "warnings" => "0";
+recommends "Archive::Tar::Wrapper" => "0.15";
 recommends "Term::ReadLine::Gnu" => "0";
+suggests "PPI::XS" => "0";
 
 on 'test' => sub {
-  requires "File::Find" => "0";
+  requires "CPAN::Meta::Check" => "0.007";
+  requires "CPAN::Meta::Requirements" => "2.121";
+  requires "ExtUtils::MakeMaker" => "0";
+  requires "ExtUtils::Manifest" => "1.66";
+  requires "File::Spec" => "0";
   requires "Software::License::None" => "0";
+  requires "Test::FailWarnings" => "0";
   requires "Test::Fatal" => "0";
   requires "Test::File::ShareDir" => "0";
   requires "Test::More" => "0.96";
+  requires "lib" => "0";
+  requires "utf8" => "0";
+};
+
+on 'test' => sub {
+  recommends "CPAN::Meta" => "2.120900";
 };
 
 on 'configure' => sub {
-  requires "ExtUtils::MakeMaker" => "6.30";
-  requires "File::ShareDir::Install" => "0.03";
+  requires "ExtUtils::MakeMaker" => "0";
+  requires "File::ShareDir::Install" => "0.06";
 };
 
 on 'develop' => sub {
   requires "Test::Pod" => "1.41";
-  requires "version" => "0.9901";
 };
@@ -5,11 +5,8 @@ copyright_holder = Ricardo SIGNES
 
 [@Filter]
 -bundle = @RJBS
--remove = Test::Compile
 github_issues = 1
-
-[Test::Compile]
-skip = Dist::Zilla::Tutorial
+homepage      = http://dzil.org/
 
 [ModuleShareDirs]
 Dist::Zilla::MintingProfile::Default = profiles
@@ -19,10 +16,6 @@ dir = corpus
 dir = misc
 
 [MetaResources]
-homepage        = http://dzil.org/
-repository.web  = http://github.com/rjbs/dist-zilla
-repository.url  = http://github.com/rjbs/dist-zilla.git
-repository.type = git
 x_mailing_list  = http://www.listbox.com/subscribe/?list_id=139292
 
 [Prereqs / TestRequires]
@@ -30,6 +23,10 @@ Test::More = 0.90
 
 [Prereqs / RuntimeRecommends]
 Term::ReadLine::Gnu = 0
+Archive::Tar::Wrapper = 0.15
+
+[Prereqs / RuntimeSuggests]
+PPI::XS = 0
 
 [Prereqs]
 perl    = v5.8.5 ; how tempted am I to set this to v5.10?  very!
@@ -39,8 +36,13 @@ parent  = 0 ; used by the AutoPrereq test corpus
 
 File::ShareDir::Install  = 0.03 ; for EUMM
 Class::Load              = 0.17
-Config::MVP::Reader::INI = 2    ; ensure there's a basic config format
-ExtUtils::Manifest       = 1.54 ; for ManifestSkip that needs maniskip()
+Config::MVP::Reader::INI = 2        ; ensure there's a basic config format
+Data::Section            = 0.200000 ; default encodings to UTF-8
+ExtUtils::Manifest       = 1.54     ; for ManifestSkip that needs maniskip()
+Mixin::Linewise::Readers = 0.100    ; default encodings to UTF-8
+Path::Class              = 0.22     ; basename
+
+DateTime = 0.44 ; CLDR fixes, used by AutoVersion and NextRelease
 
 [RemovePrereqs]
 remove = Config ; why isn't this indexed?? -- rjbs, 2011-02-11
@@ -48,3 +50,9 @@ remove = Dist::Zilla::Tester::_Role ; mistakenly added by autoprereq
 remove = Some::Package::That::Does::Not::Exist::Due::To::A::Typo
 
 [CPANFile]
+
+[Breaks]
+Dist::Zilla::Plugin::MakeMaker::Awesome = < 0.22
+
+[Test::CheckBreaks]
+conflicts_module = Moose::Conflicts
@@ -1,14 +1,20 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::add;
-{
-  $Dist::Zilla::App::Command::add::VERSION = '4.300030';
-}
 # ABSTRACT: add a module to a dist
+$Dist::Zilla::App::Command::add::VERSION = '5.025';
 use Dist::Zilla::App -command;
-use Path::Class;
-use File::pushd ();
 
+#pod =head1 SYNOPSIS
+#pod
+#pod Adds a new module to a Dist::Zilla-based distribution
+#pod
+#pod   $ dzil add Some::New::Module
+#pod
+#pod There are two arguments, C<-p> and C<-P>. C<-P> specify the minting profile
+#pod provider and C<-p> - the profile name. These work just like C<dzil new>.
+#pod
+#pod =cut
 
 sub abstract { 'add modules to an existing dist' }
 
@@ -43,6 +49,9 @@ sub execute {
   my $zilla = $self->zilla;
   my $dist = $zilla->name;
 
+  require Path::Class;
+  require File::pushd;
+
   require Dist::Zilla::Dist::Minter;
   my $minter = Dist::Zilla::Dist::Minter->_new_from_profile(
     [ $opt->provider, $opt->profile ],
@@ -53,15 +62,17 @@ sub execute {
     },
   );
 
-  my $root = dir($zilla->root)->absolute;
+  my $root = Path::Class::dir($zilla->root)->absolute;
   my $wd = File::pushd::pushd($minter->root);
 
+  my $factory = $minter->plugin_named(':DefaultModuleMaker');
+
   for my $name ( @$arg ) {
-    my $factory = $minter->plugin_named(':DefaultModuleMaker');
     $factory->make_module({ name => $name });
-    for my $file ( @{ $factory->zilla->files} ) {
-      $zilla->_write_out_file($file, $root);
-    }
+  }
+
+  for my $file ( @{ $factory->zilla->files} ) {
+    $zilla->_write_out_file($file, $root);
   }
 }
 
@@ -71,17 +82,19 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::add - add a module to a dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
-Adds a a new module to a Dist::Zilla-based distribution
+Adds a new module to a Dist::Zilla-based distribution
 
   $ dzil add Some::New::Module
 
@@ -94,7 +107,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,22 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::authordeps;
-{
-  $Dist::Zilla::App::Command::authordeps::VERSION = '4.300030';
-}
-use Dist::Zilla::App -command;
 # ABSTRACT: List your distribution's author dependencies
+$Dist::Zilla::App::Command::authordeps::VERSION = '5.025';
+use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   $ dzil authordeps
+#pod
+#pod This will scan the F<dist.ini> file and print a list of plugin modules that
+#pod probably need to be installed for the dist to be buildable.  This is a very
+#pod naive scan, but tends to be pretty accurate.  Modules can be added to its
+#pod results by using special comments in the form:
+#pod
+#pod   ; authordep Some::Package
+#pod
+#pod =cut
 
 sub abstract { "list your distribution's author dependencies" }
 
@@ -42,13 +52,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::authordeps - List your distribution's author dependencies
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -67,7 +79,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,15 +1,32 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::build;
-{
-  $Dist::Zilla::App::Command::build::VERSION = '4.300030';
-}
 # ABSTRACT: build your dist
+$Dist::Zilla::App::Command::build::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   dzil build [ --trial ] [ --tgz | --no-tgz ] [ --in /path/to/build/dir ]
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This command is a very thin layer over the Dist::Zilla C<build> method, which
+#pod does all the things required to build your distribution.  By default, it will
+#pod also archive your distribution and leave you with a complete, ready-to-release
+#pod distribution tarball.
+#pod
+#pod =cut
 
 sub abstract { 'build your dist' }
 
+#pod =head1 EXAMPLE
+#pod
+#pod   $ dzil build
+#pod   $ dzil build --no-tgz
+#pod   $ dzil build --in /path/to/build/dir
+#pod
+#pod =cut
 
 sub opt_spec {
   [ 'trial'  => 'build a trial release that PAUSE will not index'      ],
@@ -17,6 +34,25 @@ sub opt_spec {
   [ 'in=s'   => 'the directory in which to build the distribution'     ]
 }
 
+#pod =head1 OPTIONS
+#pod
+#pod =head2 --trial
+#pod
+#pod This will build a trial distribution.  Among other things, it will generally
+#pod mean that the built tarball's basename ends in F<-TRIAL>.
+#pod
+#pod =head2 --tgz | --no-tgz
+#pod
+#pod Builds a .tar.gz in your project directory after building the distribution.
+#pod
+#pod --tgz behaviour is by default, use --no-tgz to disable building an archive.
+#pod
+#pod =head2 --in
+#pod
+#pod Specifies the directory into which the distribution should be built.  If
+#pod necessary, the directory will be created.  An archive will not be created.
+#pod
+#pod =cut
 
 sub execute {
   my ($self, $opt, $args) = @_;
@@ -29,6 +65,8 @@ sub execute {
     $zilla->is_trial(1) if $opt->trial;
     $zilla->$method;
   }
+
+  $self->zilla->log('built in ' . $self->zilla->built_in);
 }
 
 1;
@@ -37,13 +75,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::build - build your dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -86,7 +126,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,17 +1,32 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::clean;
-{
-  $Dist::Zilla::App::Command::clean::VERSION = '4.300030';
-}
 # ABSTRACT: clean up after build, test, or install
+$Dist::Zilla::App::Command::clean::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   dzil clean [ --dry-run|-n ]
+#pod
+#pod This command removes some files that are created during build, test, and
+#pod install.  It's a very thin layer over the C<L<clean|Dist::Zilla/clean>> method
+#pod on the Dist::Zilla object.  The documentation for that method gives more
+#pod information about the files that will be removed.
+#pod
+#pod =cut
 
 sub opt_spec {
   [ 'dry-run|n'   => 'don\'t actually remove anything, just show what would be done' ],
 }
 
+#pod =head1 OPTIONS
+#pod
+#pod =head2 -n, --dry-run
+#pod
+#pod Nothing is removed; instead, everything that would be removed will be listed.
+#pod
+#pod =cut
 
 sub abstract { 'clean up after build, test, or install' }
 
@@ -27,13 +42,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::clean - clean up after build, test, or install
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -56,7 +73,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,19 +1,47 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::install;
-{
-  $Dist::Zilla::App::Command::install::VERSION = '4.300030';
-}
 # ABSTRACT: install your dist
+$Dist::Zilla::App::Command::install::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod Installs your distribution using a specified command.
+#pod
+#pod     dzil install [--install-command="cmd"]
+#pod
+#pod =cut
 sub abstract { 'install your dist' }
 
+#pod =head1 EXAMPLE
+#pod
+#pod     $ dzil install
+#pod     $ dzil install --install-command="cpan ."
+#pod
+#pod =cut
 
 sub opt_spec {
   [ 'install-command=s', 'command to run to install (e.g. "cpan .")' ],
+  [ 'keep-build-dir|keep' => 'keep the build directory even after a success' ],
 }
 
+#pod =head1 OPTIONS
+#pod
+#pod =head2 --install-command
+#pod
+#pod This defines what command to run after building the dist in the dist dir.
+#pod
+#pod Any value that works with L<C<system>|perlfunc/system> is accepted.
+#pod
+#pod If not specified, calls (roughly):
+#pod
+#pod     cpanm .
+#pod
+#pod For more information, look at the L<install|Dist::Zilla::Dist::Builder/install> method in
+#pod Dist::Zilla.
+#pod
+#pod =cut
 
 sub execute {
   my ($self, $opt, $arg) = @_;
@@ -22,6 +50,9 @@ sub execute {
     $opt->install_command
       ? (install_command => [ $opt->install_command ])
       : (),
+    $opt->keep_build_dir
+      ? (keep_build_dir => 1)
+      : (),
   });
 }
 
@@ -31,13 +62,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::install - install your dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -60,7 +93,7 @@ Any value that works with L<C<system>|perlfunc/system> is accepted.
 
 If not specified, calls (roughly):
 
-    perl -MCPAN -einstall "."
+    cpanm .
 
 For more information, look at the L<install|Dist::Zilla::Dist::Builder/install> method in
 Dist::Zilla.
@@ -71,7 +104,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,47 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::listdeps;
-{
-  $Dist::Zilla::App::Command::listdeps::VERSION = '4.300030';
-}
-use Dist::Zilla::App -command;
 # ABSTRACT: print your distribution's prerequisites
+$Dist::Zilla::App::Command::listdeps::VERSION = '5.025';
+use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   $ dzil listdeps | cpan
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This is a command plugin for L<Dist::Zilla>. It provides the C<listdeps>
+#pod command, which prints your distribution's prerequisites. You could pipe that
+#pod list to a CPAN client like L<cpan> to install all of the dependencies in one
+#pod quick go.
+#pod
+#pod =head1 OPTIONS
+#pod
+#pod =head2 --author
+#pod
+#pod Include author dependencies (those listed under C<develop_requires>).
+#pod
+#pod =head2 --missing
+#pod
+#pod List only dependencies which are unsatisfied.
+#pod
+#pod =head2 --versions
+#pod
+#pod Also display the required versions of listed modules.
+#pod
+#pod =head2 --json
+#pod
+#pod Lists all prerequisites in JSON format, as they would appear in META.json
+#pod (broken out into phases and types)
+#pod
+#pod =head1 ACKNOWLEDGEMENTS
+#pod
+#pod This code was originally more or less a direct copy of Marcel Gruenauer (hanekomu)
+#pod Dist::Zilla::App::Command::prereqs, updated to work with the Dist::Zilla v2
+#pod API.
+#pod
+#pod =cut
 
 use Try::Tiny;
 
@@ -15,21 +50,52 @@ sub abstract { "print your distribution's prerequisites" }
 sub opt_spec {
   [ 'author', 'include author dependencies' ],
   [ 'missing', 'list only the missing dependencies' ],
-  [ 'versions', 'include required version numbers in listing' ]
+  [ 'versions', 'include required version numbers in listing' ],
+  [ 'json', 'list dependencies by phase, in JSON format' ],
+  [ 'omit-core=s', 'Omit dependencies that are shipped with the specified version of perl' ],
 }
 
-sub extract_dependencies {
-  my ($self, $zilla, $phases, $missing) = @_;
+sub prereqs {
+  my ($self, $zilla) = @_;
 
   $_->before_build for @{ $zilla->plugins_with(-BeforeBuild) };
   $_->gather_files for @{ $zilla->plugins_with(-FileGatherer) };
+  $_->set_file_encodings for @{ $zilla->plugins_with(-EncodingProvider) };
   $_->prune_files  for @{ $zilla->plugins_with(-FilePruner) };
   $_->munge_files  for @{ $zilla->plugins_with(-FileMunger) };
   $_->register_prereqs for @{ $zilla->plugins_with(-PrereqSource) };
 
+  my $prereqs = $zilla->prereqs;
+}
+
+my @phases = qw/configure build test runtime develop/;
+my @relationships = qw/requires recommends suggests/;
+
+sub filter_core {
+  my ($prereqs, $core_version) = @_;
+  $core_version = sprintf '%7.6f', $core_version if $core_version >= 5.010;
+  $prereqs = $prereqs->clone if $prereqs->is_finalized;
+  require Module::CoreList;
+  for my $phase (@phases) {
+    for my $relation (@relationships) {
+      my $req = $prereqs->requirements_for($phase, $relation);
+      for my $module ($req->required_modules) {
+        next if not exists $Module::CoreList::version{$core_version}{$module};
+        $req->clear_requirement($module) if $req->accepts_module($module, $Module::CoreList::version{$core_version}{$module});
+      }
+    }
+  }
+  return $prereqs;
+}
+
+sub extract_dependencies {
+  my ($self, $zilla, $phases, $missing, $omit_core) = @_;
+
+  my $prereqs = $self->prereqs($zilla);
+  $prereqs = filter_core($prereqs, $omit_core) if $omit_core;
+
   require CPAN::Meta::Requirements;
   my $req = CPAN::Meta::Requirements->new;
-  my $prereqs = $zilla->prereqs;
 
   for my $phase (@$phases) {
     $req->add_requirements( $prereqs->requirements_for($phase, 'requires') );
@@ -66,7 +132,18 @@ sub execute {
   my @phases = qw(build test configure runtime);
   push @phases, 'develop' if $opt->author;
 
-  my %modules = $self->extract_dependencies($self->zilla, \@phases, $opt->missing);
+  my $omit_core = $opt->omit_core;
+  if($opt->json) {
+    my $prereqs = $self->prereqs($self->zilla);
+    $prereqs = filter_core($prereqs, $omit_core) if $omit_core;
+    my $output = $prereqs->as_string_hash;
+
+    require JSON; JSON->VERSION(2);
+    print JSON->new->ascii(1)->canonical(1)->pretty->encode($output), "\n";
+    return 1;
+  }
+
+  my %modules = $self->extract_dependencies($self->zilla, \@phases, $opt->missing, $opt->omit_core);
 
   if($opt->versions) {
     for(sort { lc $a cmp lc $b } keys %modules) {
@@ -83,13 +160,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::listdeps - print your distribution's prerequisites
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -99,7 +178,7 @@ version 4.300030
 
 This is a command plugin for L<Dist::Zilla>. It provides the C<listdeps>
 command, which prints your distribution's prerequisites. You could pipe that
-list to a CPAN client like L<cpan> to install all of the dependecies in one
+list to a CPAN client like L<cpan> to install all of the dependencies in one
 quick go.
 
 =head1 OPTIONS
@@ -116,9 +195,14 @@ List only dependencies which are unsatisfied.
 
 Also display the required versions of listed modules.
 
+=head2 --json
+
+Lists all prerequisites in JSON format, as they would appear in META.json
+(broken out into phases and types)
+
 =head1 ACKNOWLEDGEMENTS
 
-This code is more or less a direct copy of Marcel Gruenauer (hanekomu)
+This code was originally more or less a direct copy of Marcel Gruenauer (hanekomu)
 Dist::Zilla::App::Command::prereqs, updated to work with the Dist::Zilla v2
 API.
 
@@ -128,7 +212,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,43 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::new;
-{
-  $Dist::Zilla::App::Command::new::VERSION = '4.300030';
-}
 # ABSTRACT: mint a new dist
+$Dist::Zilla::App::Command::new::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod Creates a new Dist-Zilla based distribution under the current directory.
+#pod
+#pod   $ dzil new Main::Module::Name
+#pod
+#pod There are two arguments, C<-p> and C<-P>. C<-P> specify the minting profile
+#pod provider and C<-p> - the profile name.
+#pod
+#pod The default profile provider first looks in the
+#pod F<~/.dzil/profiles/$profile_name> and then among standard profiles, shipped
+#pod with Dist::Zilla. For example:
+#pod
+#pod   $ dzil new -p work Corporate::Library
+#pod
+#pod This command would instruct C<dzil> to look in F<~/.dzil/profiles/work> for a
+#pod F<profile.ini> (or other "profile" config file).  If no profile name is given,
+#pod C<dzil> will look for the C<default> profile.  If no F<default> directory
+#pod exists, it will use a very simple configuration shipped with Dist::Zilla.
+#pod
+#pod   $ dzil new -P Foo Corporate::Library
+#pod
+#pod This command would instruct C<dzil> to consult the Foo provider about the
+#pod directory of 'default' profile.
+#pod
+#pod Furthermore, it is possible to specify the default minting provider and profile
+#pod in the F<~/.dzil/config.ini> file, for example:
+#pod
+#pod   [%Mint]
+#pod   provider = FooCorp
+#pod   profile = work
+#pod
+#pod =cut
 
 sub abstract { 'mint a new dist' }
 
@@ -46,12 +77,16 @@ sub execute {
   my $dist = $arg->[0];
 
   require Dist::Zilla::Dist::Minter;
+  my $stash = $self->app->_build_global_stashes;
   my $minter = Dist::Zilla::Dist::Minter->_new_from_profile(
-    [ $opt->provider, $opt->profile ],
+    ( exists $stash->{'%Mint'} ?
+      [ $stash->{'%Mint'}->provider, $stash->{'%Mint'}->profile ] :
+      [ $opt->provider, $opt->profile ]
+    ),
     {
       chrome  => $self->app->chrome,
       name    => $dist,
-      _global_stashes => $self->app->_build_global_stashes,
+      _global_stashes => $stash,
     },
   );
 
@@ -66,13 +101,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::new - mint a new dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -99,13 +136,20 @@ exists, it will use a very simple configuration shipped with Dist::Zilla.
 This command would instruct C<dzil> to consult the Foo provider about the
 directory of 'default' profile.
 
+Furthermore, it is possible to specify the default minting provider and profile
+in the F<~/.dzil/config.ini> file, for example:
+
+  [%Mint]
+  provider = FooCorp
+  profile = work
+
 =head1 AUTHOR
 
 Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,15 +1,29 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::nop;
-{
-  $Dist::Zilla::App::Command::nop::VERSION = '4.300030';
-}
 # ABSTRACT: initialize dzil, then exit
+$Dist::Zilla::App::Command::nop::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod This command does nothing.  It initializes Dist::Zilla, then exits.  This is
+#pod useful to see the logging output of plugin initialization.
+#pod
+#pod   dzil nop -v
+#pod
+#pod Seriously, this command is almost entirely for diagnostic purposes.  Don't
+#pod overthink it, okay?
+#pod
+#pod =cut
 
 sub abstract { 'do nothing: initialize dzil, then exit' }
 
+sub description {
+  "This command does nothing but initialize Dist::Zilla and exit.\n" .
+  "It is sometimes useful for diagnostic purposes."
+}
+
 sub execute {
   my ($self, $opt, $arg) = @_;
 
@@ -22,13 +36,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::nop - initialize dzil, then exit
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -46,7 +62,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,22 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::release;
-{
-  $Dist::Zilla::App::Command::release::VERSION = '4.300030';
-}
 # ABSTRACT: release your dist to the CPAN
+$Dist::Zilla::App::Command::release::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   dzil release
+#pod
+#pod   dzil release --trial
+#pod
+#pod This command is a very, very thin wrapper around the
+#pod C<L<release|Dist::Zilla/release>> method on the Dist::Zilla object.  It will
+#pod build, archive, and release your distribution using your Releaser plugins.  The
+#pod only option, C<--trial>, will cause it to build a trial build.
+#pod
+#pod =cut
 
 sub abstract { 'release your dist' }
 
@@ -30,13 +40,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::release - release your dist to the CPAN
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -55,7 +67,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,17 +1,56 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::run;
-{
-  $Dist::Zilla::App::Command::run::VERSION = '4.300030';
-}
 # ABSTRACT: run stuff in a dir where your dist is built
+$Dist::Zilla::App::Command::run::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   $ dzil run ./bin/myscript
+#pod   $ dzil run prove -bv t/mytest.t
+#pod   $ dzil run bash
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This command will build your dist with Dist::Zilla, then build the
+#pod distribution and then run a command in the build directory.  It's something
+#pod like doing this:
+#pod
+#pod   dzil build
+#pod   rsync -avp My-Project-version/ .build/
+#pod   cd .build
+#pod   perl Makefile.PL            # or perl Build.PL
+#pod   make                        # or ./Build
+#pod   export PERL5LIB=$PWD/blib/lib:$PWD/blib/arch
+#pod   <your command as defined by rest of params>
+#pod
+#pod Except for the fact it's built directly in a subdir of .build (like
+#pod F<.build/69105y2>).
+#pod
+#pod A command returning with an non-zero error code will left the build directory
+#pod behind for analysis, and C<dzil> will exit with a non-zero status.  Otherwise,
+#pod the build directory will be removed and dzil will exit with status zero.
+#pod
+#pod If no run command is provided, a new default shell is invoked. This can be
+#pod useful for testing your distribution as if it were installed.
+#pod
+#pod =cut
 
 sub abstract { 'run stuff in a dir where your dist is built' }
 
+sub opt_spec {
+  [ 'build!' => 'do the Build actions before running the command; done by default',
+                { default => 1 } ],
+}
+
+sub description {
+  "This will build your dist and run the given 'command' in the build dir.\n" .
+  "If no command was specified, your shell will be run there instead."
+}
+
 sub usage_desc {
-  return '%c run %o [ run command [ arg1 arg2 ... ] ]';
+  return '%c run %o [ command [ arg1 arg2 ... ] ]';
 }
 
 sub execute {
@@ -26,7 +65,7 @@ sub execute {
     $self->log("no command supplied to run so using \$$envname: $args->[0]");
   }
 
-  $self->zilla->run_in_build($args);
+  $self->zilla->run_in_build($args, { build => $opt->build });
 }
 
 1;
@@ -35,13 +74,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::run - run stuff in a dir where your dist is built
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -79,7 +120,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,17 +1,33 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::setup;
-{
-  $Dist::Zilla::App::Command::setup::VERSION = '4.300030';
-}
 # ABSTRACT: set up a basic global config file
+$Dist::Zilla::App::Command::setup::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   $ dzil setup
+#pod   Enter your name> Ricardo Signes
+#pod   ...
+#pod
+#pod Dist::Zilla looks for per-user configuration in F<~/.dzil/config.ini>.  This
+#pod command prompts the user for some basic information that can be used to produce
+#pod the most commonly needed F<config.ini> sections.
+#pod
+#pod B<WARNING>: PAUSE account details are stored within config.ini in plain text.
+#pod
+#pod =cut
 
 use autodie;
 
 sub abstract { 'set up a basic global config file' }
 
+sub description {
+  "This command will run through a short interactive process to set up\n" .
+  "a basic Dist::Zilla configuration in ~/.dzil/config.ini"
+}
+
 sub validate_args {
   my ($self, $opt, $args) = @_;
 
@@ -23,6 +39,7 @@ sub execute {
 
   my $chrome = $self->app->chrome;
 
+  require Dist::Zilla::Util;
   my $config_root = Dist::Zilla::Util->_global_config_root;
 
   if (
@@ -77,7 +94,9 @@ sub execute {
 
   if (
     $chrome->prompt_yn(
-      'Do you want to enter your PAUSE account details? ',
+    '
+    * WARNING - Your account details will be stored in plain text *
+Do you want to enter your PAUSE account details? ',
       { default => 0 },
     )
   ) {
@@ -98,11 +117,14 @@ sub execute {
       "What is your PAUSE password? ",
       {
         check   => sub { defined $_[0] and length $_[0] },
+        noecho  => 1,
       },
     );
   }
 
   $config_root->mkpath unless -d $config_root;
+  $config_root->subdir('profiles')->mkpath
+    unless -d $config_root->subdir('profiles');
 
   my $umask = umask;
   umask( $umask | 077 ); # this file might contain PAUSE pw; make it go-r
@@ -138,13 +160,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::setup - set up a basic global config file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -156,13 +180,15 @@ Dist::Zilla looks for per-user configuration in F<~/.dzil/config.ini>.  This
 command prompts the user for some basic information that can be used to produce
 the most commonly needed F<config.ini> sections.
 
+B<WARNING>: PAUSE account details are stored within config.ini in plain text.
+
 =head1 AUTHOR
 
 Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,34 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::smoke;
-{
-  $Dist::Zilla::App::Command::smoke::VERSION = '4.300030';
-}
 # ABSTRACT: smoke your dist
+$Dist::Zilla::App::Command::smoke::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   dzil smoke [ --release ] [ --author ] [ --no-automated ]
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This command builds and tests the distribution in "smoke testing mode."
+#pod
+#pod This command is a thin wrapper around the L<test|Dist::Zilla::Dist::Builder/test> method in
+#pod Dist::Zilla.  It builds your dist and runs the tests with the AUTOMATED_TESTING
+#pod environment variable turned on, so it's like doing this:
+#pod
+#pod   export AUTOMATED_TESTING=1
+#pod   dzil build --no-tgz
+#pod   cd $BUILD_DIRECTORY
+#pod   perl Makefile.PL
+#pod   make
+#pod   make test
+#pod
+#pod A build that fails tests will be left behind for analysis, and F<dzil> will
+#pod exit a non-zero value.  If the tests are successful, the build directory will
+#pod be removed and F<dzil> will exit with status 0.
+#pod
+#pod =cut
 
 sub opt_spec {
   [ 'release'   => 'enables the RELEASE_TESTING env variable', { default => 0 } ],
@@ -14,6 +36,21 @@ sub opt_spec {
   [ 'author' => 'enables the AUTHOR_TESTING env variable', { default => 0 } ]
 }
 
+#pod =head1 OPTIONS
+#pod
+#pod =head2 --release
+#pod
+#pod This will run the test suite with RELEASE_TESTING=1
+#pod
+#pod =head2 --no-automated
+#pod
+#pod This will run the test suite without setting AUTOMATED_TESTING
+#pod
+#pod =head2 --author
+#pod
+#pod This will run the test suite with AUTHOR_TESTING=1
+#pod
+#pod =cut
 
 sub abstract { 'smoke your dist' }
 
@@ -33,13 +70,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::smoke - smoke your dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -84,7 +123,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,20 +1,61 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command::test;
-{
-  $Dist::Zilla::App::Command::test::VERSION = '4.300030';
-}
 # ABSTRACT: test your dist
+$Dist::Zilla::App::Command::test::VERSION = '5.025';
 use Dist::Zilla::App -command;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   dzil test [ --release ] [ --no-author ] [ --automated ] [ --all ]
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This command is a thin wrapper around the L<test|Dist::Zilla::Dist::Builder/test> method in
+#pod Dist::Zilla.  It builds your dist and runs the tests with the AUTHOR_TESTING
+#pod environment variable turned on, so it's like doing this:
+#pod
+#pod   export AUTHOR_TESTING=1
+#pod   dzil build --no-tgz
+#pod   cd $BUILD_DIRECTORY
+#pod   perl Makefile.PL
+#pod   make
+#pod   make test
+#pod
+#pod A build that fails tests will be left behind for analysis, and F<dzil> will
+#pod exit a non-zero value.  If the tests are successful, the build directory will
+#pod be removed and F<dzil> will exit with status 0.
+#pod
+#pod =cut
 
 sub opt_spec {
   [ 'release'   => 'enables the RELEASE_TESTING env variable', { default => 0 } ],
   [ 'automated' => 'enables the AUTOMATED_TESTING env variable', { default => 0 } ],
   [ 'author!' => 'enables the AUTHOR_TESTING env variable (default behavior)', { default => 1 } ],
-  [ 'all' => 'enables the RELEASE_TESTING, AUTOMATED_TESTING and AUTHOR_TESTING env variables', { default => 0 } ]
+  [ 'all' => 'enables the RELEASE_TESTING, AUTOMATED_TESTING and AUTHOR_TESTING env variables', { default => 0 } ],
+  [ 'keep-build-dir|keep' => 'keep the build directory even after a success' ],
+  [ 'jobs|j=i' => 'number of parallel test jobs to run' ],
 }
 
+#pod =head1 OPTIONS
+#pod
+#pod =head2 --release
+#pod
+#pod This will run the test suite with RELEASE_TESTING=1
+#pod
+#pod =head2 --automated
+#pod
+#pod This will run the test suite with AUTOMATED_TESTING=1
+#pod
+#pod =head2 --no-author
+#pod
+#pod This will run the test suite without setting AUTHOR_TESTING
+#pod
+#pod =head2 --all
+#pod
+#pod Equivalent to --release --automated --author
+#pod
+#pod =cut
 
 sub abstract { 'test your dist' }
 
@@ -25,7 +66,14 @@ sub execute {
   local $ENV{AUTHOR_TESTING} = 1 if $opt->author or $opt->all;
   local $ENV{AUTOMATED_TESTING} = 1 if $opt->automated or $opt->all;
 
-  $self->zilla->test;
+  $self->zilla->test({
+    $opt->keep_build_dir
+      ? (keep_build_dir => 1)
+      : (),
+    $opt->jobs
+      ? (jobs => $opt->jobs)
+      : (),
+  });
 }
 
 1;
@@ -34,13 +82,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command::test - test your dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -87,7 +137,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,62 @@
+use strict;
+use warnings;
+package Dist::Zilla::App::Command::version;
+# ABSTRACT: display dzil's version
+$Dist::Zilla::App::Command::version::VERSION = '5.025';
+use Dist::Zilla::App -command;
+use App::Cmd::Command::version;
+BEGIN {
+  ## parent and base dont work here. ??? -- kentnl 2014-10-31
+  our @ISA;
+  unshift @ISA, 'App::Cmd::Command::version';
+}
+
+#pod =head1 SYNOPSIS
+#pod
+#pod Print dzil version
+#pod
+#pod   $ dzil --version or $dzil version
+#pod
+#pod =cut
+
+sub version_for_display {
+  my $version_pkg = $_[0]->version_package;
+  my $version = ( $version_pkg->VERSION ?
+                  $version_pkg->VERSION :
+                 'dev' );
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Dist::Zilla::App::Command::version - display dzil's version
+
+=head1 VERSION
+
+version 5.025
+
+=head1 SYNOPSIS
+
+Print dzil version
+
+  $ dzil --version or $dzil version
+
+=head1 AUTHOR
+
+Ricardo SIGNES <rjbs@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Ricardo SIGNES.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
@@ -1,18 +1,28 @@
 use strict;
 use warnings;
 package Dist::Zilla::App::Command;
-{
-  $Dist::Zilla::App::Command::VERSION = '4.300030';
-}
 # ABSTRACT: base class for dzil commands
+$Dist::Zilla::App::Command::VERSION = '5.025';
 use App::Cmd::Setup -command;
-use Moose::Autobox;
 
+#pod =method zilla
+#pod
+#pod This returns the Dist::Zilla object in use by the command.  If none has yet
+#pod been constructed, one will be by calling C<< Dist::Zilla->from_config >>.
+#pod
+#pod (This method just delegates to the Dist::Zilla::App object!)
+#pod
+#pod =cut
 
 sub zilla {
   return $_[0]->app->zilla;
 }
 
+#pod =method log
+#pod
+#pod This method calls the C<log> method of the application's chrome.
+#pod
+#pod =cut
 
 sub log {
   $_[0]->app->chrome->logger->log($_[1]);
@@ -24,13 +34,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Command - base class for dzil commands
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 METHODS
 
@@ -51,7 +63,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,9 @@
 use strict;
 package Dist::Zilla::App::Tester;
-{
-  $Dist::Zilla::App::Tester::VERSION = '4.300030';
-}
+# ABSTRACT: testing library for Dist::Zilla::App
+$Dist::Zilla::App::Tester::VERSION = '5.025';
 use parent 'App::Cmd::Tester::CaptureExternal';
 use App::Cmd::Tester 0.306 (); # result_class, ->app
-# ABSTRACT: testing library for Dist::Zilla::App
 
 use Dist::Zilla::App;
 use File::Copy::Recursive qw(dircopy);
@@ -45,10 +43,8 @@ sub test_dzil {
 
 {
   package Dist::Zilla::App::Tester::Result;
-{
-  $Dist::Zilla::App::Tester::Result::VERSION = '4.300030';
-}
-  BEGIN { our @ISA = qw(App::Cmd::Tester::Result); }
+$Dist::Zilla::App::Tester::Result::VERSION = '5.025';
+BEGIN { our @ISA = qw(App::Cmd::Tester::Result); }
 
   sub tempdir {
     my ($self) = @_;
@@ -88,13 +84,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App::Tester - testing library for Dist::Zilla::App
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -102,7 +100,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,16 +1,11 @@
 use strict;
 use warnings;
 package Dist::Zilla::App;
-{
-  $Dist::Zilla::App::VERSION = '4.300030';
-}
 # ABSTRACT: Dist::Zilla's App::Cmd
+$Dist::Zilla::App::VERSION = '5.025';
 use App::Cmd::Setup 0.309 -app; # better compilation error detection
 
 use Carp ();
-use Dist::Zilla::MVP::Reader::Finder;
-use Dist::Zilla::Util;
-use Moose::Autobox;
 use Try::Tiny;
 
 sub global_opt_spec {
@@ -32,10 +27,12 @@ sub _build_global_stashes {
 
   my $stash_registry = $self->{__global_stashes__} = {};
 
+  require Dist::Zilla::Util;
   my $config_dir  = Dist::Zilla::Util->_global_config_root;
 
   my $config_base = $config_dir->file('config');
 
+  require Dist::Zilla::MVP::Reader::Finder;
   require Dist::Zilla::MVP::Assembler::GlobalConfig;
   require Dist::Zilla::MVP::Section;
   my $assembler = Dist::Zilla::MVP::Assembler::GlobalConfig->new({
@@ -74,6 +71,12 @@ END_DIE
   return $stash_registry;
 }
 
+#pod =method zilla
+#pod
+#pod This returns the Dist::Zilla object in use by the command.  If none has yet
+#pod been constructed, one will be by calling C<< Dist::Zilla->from_config >>.
+#pod
+#pod =cut
 
 sub chrome {
   my ($self) = @_;
@@ -126,7 +129,7 @@ sub zilla {
 
     VERBOSE_PLUGIN: for my $plugin_name (grep { ! m{\A[-_]\z} } @v_plugins) {
       my @plugins = grep { $_->plugin_name =~ /\b\Q$plugin_name\E\b/ }
-                    $zilla->plugins->flatten;
+                    @{ $zilla->plugins };
 
       $zilla->log_fatal("can't find plugins matching $plugin_name to set debug")
         unless @plugins;
@@ -144,13 +147,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::App - Dist::Zilla's App::Cmd
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 METHODS
 
@@ -165,7 +170,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,14 @@
 package Dist::Zilla::Chrome::Term;
-{
-  $Dist::Zilla::Chrome::Term::VERSION = '4.300030';
-}
-use Moose;
 # ABSTRACT: chrome used for terminal-based interaction
+$Dist::Zilla::Chrome::Term::VERSION = '5.025';
+use Moose;
 
+#pod =head1 OVERVIEW
+#pod
+#pod This class provides a L<Dist::Zilla::Chrome> implementation for use in a
+#pod terminal environment.  It's the default chrome used by L<Dist::Zilla::App>.
+#pod
+#pod =cut
 
 use Dist::Zilla::Types qw(OneZero);
 use Log::Dispatchouli 1.102220;
@@ -16,16 +20,25 @@ has logger => (
   isa => 'Log::Dispatchouli',
   init_arg => undef,
   writer   => '_set_logger',
-  default  => sub {
-    Log::Dispatchouli->new({
+  lazy_build => 1,
+);
+
+sub _build_logger {
+  my $self = shift;
+  my $enc = $self->term_enc;
+  if ( $enc ) {
+    my $layer = sprintf(":encoding(%s)", $enc);
+    binmode( STDOUT, $layer );
+    binmode( STDERR, $layer );
+  }
+  return Log::Dispatchouli->new({
       ident     => 'Dist::Zilla',
       to_stdout => 1,
       log_pid   => 0,
       to_self   => ($ENV{DZIL_TESTING} ? 1 : 0),
       quiet_fatal => 'stdout',
-    });
-  }
-);
+  });
+}
 
 has term_ui => (
   is   => 'ro',
@@ -38,14 +51,14 @@ has term_ui => (
   },
 );
 
-sub decode_utf8 ($;$)
-{
-    require Encode;
-    no warnings 'redefine';
-    *decode_utf8 = \&Encode::decode_utf8;
-    goto \&decode_utf8;
-}
-
+has term_enc => (
+  is   => 'ro',
+  lazy => 1,
+  default => sub {
+    require Term::Encoding;
+    return Term::Encoding::get_encoding();
+  },
+);
 
 sub prompt_str {
   my ($self, $prompt, $arg) = @_;
@@ -53,14 +66,27 @@ sub prompt_str {
   my $default = $arg->{default};
   my $check   = $arg->{check};
 
+  require Encode;
+  my $term_enc = $self->term_enc;
+
+  my $encode = $term_enc
+             ? sub { Encode::encode($term_enc, shift, Encode::FB_CROAK())  }
+             : sub { shift };
+  my $decode = $term_enc
+             ? sub { Encode::decode($term_enc, shift, Encode::FB_CROAK())  }
+             : sub { shift };
+
   if ($arg->{noecho}) {
     require Term::ReadKey;
     Term::ReadKey::ReadMode('noecho');
   }
   my $input_bytes = $self->term_ui->get_reply(
-    prompt => $prompt,
+    prompt => $encode->($prompt),
     allow  => $check || sub { defined $_[0] and length $_[0] },
-    (defined $default ? (default => $default) : ()),
+    (defined $default
+      ? (default => $encode->($default))
+      : ()
+    ),
   );
   if ($arg->{noecho}) {
     Term::ReadKey::ReadMode('normal');
@@ -69,7 +95,7 @@ sub prompt_str {
     print "\n";
   }
 
-  my $input = decode_utf8( $input_bytes );
+  my $input = $decode->($input_bytes);
   chomp $input;
 
   return $input;
@@ -115,13 +141,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Chrome::Term - chrome used for terminal-based interaction
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -134,7 +162,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,9 +1,7 @@
 package Dist::Zilla::Chrome::Test;
-{
-  $Dist::Zilla::Chrome::Test::VERSION = '4.300030';
-}
-use Moose;
 # ABSTRACT: the chrome used by Dist::Zilla::Tester
+$Dist::Zilla::Chrome::Test::VERSION = '5.025';
+use Moose;
 
 use MooseX::Types::Moose qw(ArrayRef HashRef Str);
 use Dist::Zilla::Types qw(OneZero);
@@ -20,6 +18,24 @@ has logger => (
   }
 );
 
+#pod =attr response_for
+#pod
+#pod The response_for attribute (which exists only in the Test chrome) is a
+#pod hashref that lets you specify the answer to questions asked by
+#pod C<prompt_str> or C<prompt_yn>.  The key is the prompt string.  If the
+#pod value is a string, it is returned every time that question is asked.
+#pod If the value is an arrayref, the first element is shifted off and
+#pod returned every time the question is asked.  If the arrayref is empty
+#pod (or the prompt is not listed in the hash), the default answer (if any)
+#pod is returned.
+#pod
+#pod Since you can't pass arguments to the Chrome constructor, response_for
+#pod is initialized to an empty hash, and you can add entries after
+#pod construction with the C<set_response_for> method:
+#pod
+#pod   $chrome->set_response_for($prompt => $response);
+#pod
+#pod =cut
 
 has response_for => (
   isa     => HashRef[ ArrayRef | Str ],
@@ -63,13 +79,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Chrome::Test - the chrome used by Dist::Zilla::Tester
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 ATTRIBUTES
 
@@ -96,7 +114,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,21 +1,35 @@
 package Dist::Zilla::Dist::Builder;
-{
-  $Dist::Zilla::Dist::Builder::VERSION = '4.300030';
-}
 # ABSTRACT: dist zilla subclass for building dists
+$Dist::Zilla::Dist::Builder::VERSION = '5.025';
 use Moose 0.92; # role composition fixes
 extends 'Dist::Zilla';
 
-use Moose::Autobox 0.09; # ->flatten
 use MooseX::Types::Moose qw(HashRef);
 use MooseX::Types::Path::Class qw(Dir File);
 
 use File::pushd ();
 use Path::Class;
+use Path::Tiny; # because more Path::* is better, eh?
 use Try::Tiny;
 
 use namespace::autoclean;
 
+#pod =method from_config
+#pod
+#pod   my $zilla = Dist::Zilla->from_config(\%arg);
+#pod
+#pod This routine returns a new Zilla from the configuration in the current working
+#pod directory.
+#pod
+#pod This method should not be relied upon, yet.  Its semantics are B<certain> to
+#pod change.
+#pod
+#pod Valid arguments are:
+#pod
+#pod   config_class - the class to use to read the config
+#pod                  default: Dist::Zilla::MVP::Reader::Finder
+#pod
+#pod =cut
 
 sub from_config {
   my ($class, $arg) = @_;
@@ -49,12 +63,11 @@ sub _setup_default_plugins {
         my ($file, $self) = @_;
         local $_ = $file->name;
         return 1 if m{\Alib/} and m{\.(pm|pod)$};
-        return 1 if $_ eq $self->zilla->main_module;
         return;
       },
     });
 
-    $self->plugins->push($plugin);
+    push @{ $self->plugins }, $plugin;
   }
 
   unless ($self->plugin_named(':IncModules')) {
@@ -71,7 +84,7 @@ sub _setup_default_plugins {
       },
     });
 
-    $self->plugins->push($plugin);
+    push @{ $self->plugins }, $plugin;
   }
 
   unless ($self->plugin_named(':TestFiles')) {
@@ -83,7 +96,7 @@ sub _setup_default_plugins {
       code        => sub { local $_ = $_->name; m{\At/} },
     });
 
-    $self->plugins->push($plugin);
+    push @{ $self->plugins }, $plugin;
   }
 
   unless ($self->plugin_named(':ExecFiles')) {
@@ -100,7 +113,7 @@ sub _setup_default_plugins {
       },
     });
 
-    $self->plugins->push($plugin);
+    push @{ $self->plugins }, $plugin;
   }
 
   unless ($self->plugin_named(':ShareFiles')) {
@@ -110,25 +123,24 @@ sub _setup_default_plugins {
       zilla       => $self,
       style       => 'list',
       code        => sub {
+        my $self = shift;
         my $map = $self->zilla->_share_dir_map;
         my @files;
         if ( $map->{dist} ) {
-          push @files, $self->zilla->files->grep(sub {
-            local $_ = $_->name; m{\A\Q$map->{dist}\E/}
-          });
+          push @files, grep {; $_->name =~ m{\A\Q$map->{dist}\E/} }
+                       @{ $self->zilla->files };
         }
         if ( my $mod_map = $map->{module} ) {
           for my $mod ( keys %$mod_map ) {
-            push @files, $self->zilla->files->grep(sub {
-              local $_ = $_->name; m{\A\Q$mod_map->{$mod}\E/}
-            });
+            push @files, grep { $_->name =~ m{\A\Q$mod_map->{$mod}\E/} }
+                         @{ $self->zilla->files };
           }
         }
         return \@files;
       },
     });
 
-    $self->plugins->push($plugin);
+    push @{ $self->plugins }, $plugin;
   }
 
   unless ($self->plugin_named(':MainModule')) {
@@ -145,7 +157,31 @@ sub _setup_default_plugins {
       },
     });
 
-    $self->plugins->push($plugin);
+    push @{ $self->plugins }, $plugin;
+  }
+
+  unless ($self->plugin_named(':AllFiles')) {
+    require Dist::Zilla::Plugin::FinderCode;
+    my $plugin = Dist::Zilla::Plugin::FinderCode->new({
+      plugin_name => ':AllFiles',
+      zilla       => $self,
+      style       => 'grep',
+      code        => sub { return 1 },
+    });
+
+    push @{ $self->plugins }, $plugin;
+  }
+
+  unless ($self->plugin_named(':NoFiles')) {
+    require Dist::Zilla::Plugin::FinderCode;
+    my $plugin = Dist::Zilla::Plugin::FinderCode->new({
+      plugin_name => ':NoFiles',
+      zilla       => $self,
+      style       => 'list',
+      code        => sub { return },
+    });
+
+    push @{ $self->plugins }, $plugin;
   }
 }
 
@@ -162,7 +198,7 @@ sub _build_share_dir_map {
 
   my $share_dir_map = {};
 
-  for my $plugin ( $self->plugins_with(-ShareDir)->flatten ) {
+  for my $plugin (@{ $self->plugins_with(-ShareDir) }) {
     next unless my $sub_map = $plugin->share_dir_map;
 
     if ( $sub_map->{dist} ) {
@@ -191,7 +227,7 @@ sub _load_config {
   my $config_class =
     $arg->{config_class} ||= 'Dist::Zilla::MVP::Reader::Finder';
 
-  Class::MOP::load_class($config_class);
+  Class::Load::load_class($config_class);
 
   $arg->{chrome}->logger->log_debug(
     { prefix => '[DZ] ' },
@@ -231,13 +267,14 @@ sub _load_config {
 
     my $package = $_->package;
 
+    my $bundle = $package =~ /^@/ ? ' bundle' : '';
     die <<"END_DIE";
-Required plugin $package isn't installed.
+Required plugin$bundle $package isn't installed.
 
 Run 'dzil authordeps' to see a list of all required plugins.
 You can pipe the list to your CPAN client to install or update them:
 
-    dzil authordeps | cpanm
+    dzil authordeps --missing | cpanm
 
 END_DIE
 
@@ -246,6 +283,21 @@ END_DIE
   return $seq;
 }
 
+#pod =method build_in
+#pod
+#pod   $zilla->build_in($root);
+#pod
+#pod This method builds the distribution in the given directory.  If no directory
+#pod name is given, it defaults to DistName-Version.  If the distribution has
+#pod already been built, an exception will be thrown.
+#pod
+#pod =method build
+#pod
+#pod This method just calls C<build_in> with no arguments.  It gets you the default
+#pod behavior without the weird-looking formulation of C<build_in> with no object
+#pod for the preposition!
+#pod
+#pod =cut
 
 sub build { $_[0]->build_in }
 
@@ -258,22 +310,26 @@ sub build_in {
   $self->log_fatal("attempted to build " . $self->name . " a second time")
     if $self->built_in;
 
-  $_->before_build for $self->plugins_with(-BeforeBuild)->flatten;
+  $_->before_build for @{ $self->plugins_with(-BeforeBuild) };
 
   $self->log("beginning to build " . $self->name);
 
-  $_->gather_files     for $self->plugins_with(-FileGatherer)->flatten;
-  $_->prune_files      for $self->plugins_with(-FilePruner)->flatten;
-  $_->munge_files      for $self->plugins_with(-FileMunger)->flatten;
+  $_->gather_files       for @{ $self->plugins_with(-FileGatherer) };
+  $_->set_file_encodings for @{ $self->plugins_with(-EncodingProvider) };
+  $_->prune_files        for @{ $self->plugins_with(-FilePruner) };
 
-  $_->register_prereqs for $self->plugins_with(-PrereqSource)->flatten;
+  $self->version; # instantiate this lazy attribute now that files are gathered
+
+  $_->munge_files        for @{ $self->plugins_with(-FileMunger) };
+
+  $_->register_prereqs   for @{ $self->plugins_with(-PrereqSource) };
 
   $self->prereqs->finalize;
 
   # Barf if someone has already set up a prereqs entry? -- rjbs, 2010-04-13
   $self->distmeta->{prereqs} = $self->prereqs->as_string_hash;
 
-  $_->setup_installer for $self->plugins_with(-InstallTool)->flatten;
+  $_->setup_installer for @{ $self->plugins_with(-InstallTool) };
 
   $self->_check_dupe_files;
 
@@ -281,16 +337,21 @@ sub build_in {
 
   $self->log("writing " . $self->name . " in $build_root");
 
-  for my $file ($self->files->flatten) {
+  for my $file (@{ $self->files }) {
     $self->_write_out_file($file, $build_root);
   }
 
   $_->after_build({ build_root => $build_root })
-    for $self->plugins_with(-AfterBuild)->flatten;
+    for @{ $self->plugins_with(-AfterBuild) };
 
   $self->built_in($build_root);
 }
 
+#pod =attr built_in
+#pod
+#pod This is the L<Path::Class::Dir>, if any, in which the dist has been built.
+#pod
+#pod =cut
 
 has built_in => (
   is   => 'rw',
@@ -298,6 +359,20 @@ has built_in => (
   init_arg  => undef,
 );
 
+#pod =method ensure_built_in
+#pod
+#pod   $zilla->ensure_built_in($root);
+#pod
+#pod This method behaves like C<L</build_in>>, but if the dist is already built in
+#pod C<$root> (or the default root, if no root is given), no exception is raised.
+#pod
+#pod =method ensure_built
+#pod
+#pod This method just calls C<ensure_built_in> with no arguments.  It gets you the
+#pod default behavior without the weird-looking formulation of C<ensure_built_in>
+#pod with no object for the preposition!
+#pod
+#pod =cut
 
 sub ensure_built {
   $_[0]->ensure_built_in;
@@ -314,6 +389,15 @@ sub ensure_built_in {
   $self->build_in($root);
 }
 
+#pod =method dist_basename
+#pod
+#pod   my $basename = $zilla->dist_basename;
+#pod
+#pod This method will return the dist's basename (e.g. C<Dist-Name-1.01>.
+#pod The basename is used as the top-level directory in the tarball.  It
+#pod does not include C<-TRIAL>, even if building a trial dist.
+#pod
+#pod =cut
 
 sub dist_basename {
   my ($self) = @_;
@@ -324,6 +408,15 @@ sub dist_basename {
   );
 }
 
+#pod =method archive_filename
+#pod
+#pod   my $tarball = $zilla->archive_filename;
+#pod
+#pod This method will return the filename (e.g. C<Dist-Name-1.01.tar.gz>)
+#pod of the tarball of this dist.  It will include C<-TRIAL> if building a
+#pod trial dist.  The tarball might not exist.
+#pod
+#pod =cut
 
 sub archive_filename {
   my ($self) = @_;
@@ -334,6 +427,14 @@ sub archive_filename {
   );
 }
 
+#pod =method build_archive
+#pod
+#pod   $zilla->build_archive;
+#pod
+#pod This method will ensure that the dist has been built, and will then build a
+#pod tarball of the build directory in the current directory.
+#pod
+#pod =cut
 
 sub build_archive {
   my ($self) = @_;
@@ -343,9 +444,10 @@ sub build_archive {
   my $basename = $self->dist_basename;
   my $basedir = dir($basename);
 
-  $_->before_archive for $self->plugins_with(-BeforeArchive)->flatten;
+  $_->before_archive for @{ $self->plugins_with(-BeforeArchive) };
 
-  my $method = Class::Load::load_optional_class('Archive::Tar::Wrapper')
+  my $method = Class::Load::load_optional_class('Archive::Tar::Wrapper',
+                                                { -version => 0.15 })
              ? '_build_archive_with_wrapper'
              : '_build_archive';
 
@@ -362,13 +464,13 @@ sub build_archive {
 sub _build_archive {
   my ($self, $built_in, $basename, $basedir) = @_;
 
-  $self->log("building archive with Archive::Tar; install Archive::Tar::Wrapper for improved speed");
+  $self->log("building archive with Archive::Tar; install Archive::Tar::Wrapper 0.15 or newer for improved speed");
 
   require Archive::Tar;
   my $archive = Archive::Tar->new;
   my %seen_dir;
   for my $distfile (
-    sort { length($a->name) <=> length($b->name) } $self->files->flatten
+    sort { length($a->name) <=> length($b->name) } @{ $self->files }
   ) {
     my $in = file($distfile->name)->dir;
 
@@ -381,15 +483,9 @@ sub _build_archive {
     }
 
     my $filename = $built_in->file( $distfile->name );
-    my $content = do {
-      use autodie;
-      local $/;
-      open my $fh, '<', $filename;
-      <$fh>;
-    };
     $archive->add_data(
       $basedir->file( $distfile->name ),
-      $content,
+      path($filename)->slurp_raw,
       { mode => (stat $filename)[2] & ~022 },
     );
   }
@@ -405,7 +501,7 @@ sub _build_archive_with_wrapper {
   my $archive = Archive::Tar::Wrapper->new;
 
   for my $distfile (
-    sort { length($a->name) <=> length($b->name) } $self->files->flatten
+    sort { length($a->name) <=> length($b->name) } @{ $self->files }
   ) {
     my $in = file($distfile->name)->dir;
 
@@ -434,27 +530,44 @@ sub _prep_build_root {
   return $build_root;
 }
 
+#pod =method release
+#pod
+#pod   $zilla->release;
+#pod
+#pod This method releases the distribution, probably by uploading it to the CPAN.
+#pod The actual effects of this method (as with most of the methods) is determined
+#pod by the loaded plugins.
+#pod
+#pod =cut
 
 sub release {
   my $self = shift;
 
   Carp::croak("you can't release without any Releaser plugins")
-    unless my @releasers = $self->plugins_with(-Releaser)->flatten;
+    unless my @releasers = @{ $self->plugins_with(-Releaser) };
 
   $ENV{DZIL_RELEASING} = 1;
 
   my $tgz = $self->build_archive;
 
   # call all plugins implementing BeforeRelease role
-  $_->before_release($tgz) for $self->plugins_with(-BeforeRelease)->flatten;
+  $_->before_release($tgz) for @{ $self->plugins_with(-BeforeRelease) };
 
   # do the actual release
   $_->release($tgz) for @releasers;
 
   # call all plugins implementing AfterRelease role
-  $_->after_release($tgz) for $self->plugins_with(-AfterRelease)->flatten;
+  $_->after_release($tgz) for @{ $self->plugins_with(-AfterRelease) };
 }
 
+#pod =method clean
+#pod
+#pod This method removes temporary files and directories suspected to have been
+#pod produced by the Dist::Zilla build process.  Specifically, it deletes the
+#pod F<.build> directory and any entity that starts with the dist name and a hyphen,
+#pod like matching the glob C<Your-Dist-*>.
+#pod
+#pod =cut
 
 sub clean {
   my ($self, $dry_run) = @_;
@@ -470,6 +583,14 @@ sub clean {
   };
 }
 
+#pod =method ensure_built_in_tmpdir
+#pod
+#pod   $zilla->ensure_built_in_tmpdir;
+#pod
+#pod This method will consistently build the distribution in a temporary
+#pod subdirectory. It will return the path for the temporary build location.
+#pod
+#pod =cut
 
 sub ensure_built_in_tmpdir {
   my $self = shift;
@@ -497,7 +618,7 @@ sub ensure_built_in_tmpdir {
       rename $latest, $previous
         or $self->log("cannot move .build/latest link to .build/previous");
     }
-    symlink $target, $latest
+    symlink $target->basename, $latest
       or $self->log('cannot create link .build/latest');
   }
 
@@ -506,6 +627,24 @@ sub ensure_built_in_tmpdir {
   return ($target, $latest, $previous);
 }
 
+#pod =method install
+#pod
+#pod   $zilla->install( \%arg );
+#pod
+#pod This method installs the distribution locally.  The distribution will be built
+#pod in a temporary subdirectory, then the process will change directory to that
+#pod subdir and an installer will be run.
+#pod
+#pod Valid arguments are:
+#pod
+#pod   keep_build_dir  - if true, don't rmtree the build dir, even if everything
+#pod                     seemed to work
+#pod   install_command - the command to run in the subdir to install the dist
+#pod                     default (roughly): $^X -MCPAN -einstall .
+#pod
+#pod                     this argument should be an arrayref
+#pod
+#pod =cut
 
 sub install {
   my ($self, $arg) = @_;
@@ -513,21 +652,26 @@ sub install {
 
   my ($target, $latest) = $self->ensure_built_in_tmpdir;
 
-  eval {
+  my $ok = eval {
     ## no critic Punctuation
     my $wd = File::pushd::pushd($target);
     my @cmd = $arg->{install_command}
             ? @{ $arg->{install_command} }
-            : ($^X => '-MCPAN' =>
-                $^O eq 'MSWin32' ? q{-e"install '.'"} : '-einstall "."');
+            : (cpanm => ".");
 
     $self->log_debug([ 'installing via %s', \@cmd ]);
     system(@cmd) && $self->log_fatal([ "error running %s", \@cmd ]);
+    1;
   };
 
-  if ($@) {
-    $self->log($@);
-    $self->log("left failed dist in place at $target");
+  unless ($ok) {
+    my $error = $@ || '(exception clobered)';
+    $self->log("install failed, left failed dist in place at $target");
+    die $error;
+  }
+
+  if ($arg->{keep_build_dir}) {
+    $self->log("all's well; left dist in place at $target");
   } else {
     $self->log("all's well; removing $target");
     $target->rmtree;
@@ -537,43 +681,82 @@ sub install {
   return;
 }
 
+#pod =method test
+#pod
+#pod   $zilla->test(\%arg);
+#pod
+#pod This method builds a new copy of the distribution and tests it using
+#pod C<L</run_tests_in>>.
+#pod
+#pod C<\%arg> may be omitted.  Otherwise, valid arguments are:
+#pod
+#pod   keep_build_dir  - if true, don't rmtree the build dir, even if everything
+#pod                     seemed to work
+#pod
+#pod =cut
 
 sub test {
-  my ($self) = @_;
+  my ($self, $arg) = @_;
 
   Carp::croak("you can't test without any TestRunner plugins")
-    unless my @testers = $self->plugins_with(-TestRunner)->flatten;
+    unless my @testers = @{ $self->plugins_with(-TestRunner) };
 
   my ($target, $latest) = $self->ensure_built_in_tmpdir;
-  my $error  = $self->run_tests_in($target);
+  my $error  = $self->run_tests_in($target, $arg);
+
+  if ($arg and $arg->{keep_build_dir}) {
+    $self->log("all's well; left dist in place at $target");
+    return;
+  }
 
   $self->log("all's well; removing $target");
   $target->rmtree;
   $latest->remove if $latest;
 }
 
+#pod =method run_tests_in
+#pod
+#pod   my $error = $zilla->run_tests_in($directory, $arg);
+#pod
+#pod This method runs the tests in $directory (a Path::Class::Dir), which
+#pod must contain an already-built copy of the distribution.  It will throw an
+#pod exception if there are test failures.
+#pod
+#pod It does I<not> set any of the C<*_TESTING> environment variables, nor
+#pod does it clean up C<$directory> afterwards.
+#pod
+#pod =cut
 
 sub run_tests_in {
-  my ($self, $target) = @_;
+  my ($self, $target, $arg) = @_;
 
   Carp::croak("you can't test without any TestRunner plugins")
-    unless my @testers = $self->plugins_with(-TestRunner)->flatten;
+    unless my @testers = @{ $self->plugins_with(-TestRunner) };
 
   for my $tester (@testers) {
     my $wd = File::pushd::pushd($target);
-    $tester->test( $target );
+    $tester->test( $target, $arg );
   }
 }
 
+#pod =method run_in_build
+#pod
+#pod   $zilla->run_in_build( \@cmd );
+#pod
+#pod This method makes a temporary directory, builds the distribution there,
+#pod executes the dist's first L<BuildRunner|Dist::Zilla::Role::BuildRunner>, and
+#pod then runs the given command in the build directory.  If the command exits
+#pod non-zero, the directory will be left in place.
+#pod
+#pod =cut
 
 sub run_in_build {
-  my ($self, $cmd) = @_;
+  my ($self, $cmd, $arg) = @_;
 
   # The sort below is a cheap hack to get ModuleBuild ahead of
   # ExtUtils::MakeMaker. -- rjbs, 2010-01-05
   $self->log_fatal("you can't build without any BuildRunner plugins")
-    unless my @builders =
-    $self->plugins_with(-BuildRunner)->sort->reverse->flatten;
+    unless my @builders = reverse sort @{ $self->plugins_with(-BuildRunner) };
 
   require "Config.pm"; # skip autoprereq
 
@@ -583,6 +766,12 @@ sub run_in_build {
   # building the dist for real
   my $ok = eval {
     my $wd = File::pushd::pushd($target);
+
+    if ($arg and exists $arg->{build} and ! $arg->{build}) {
+      system(@$cmd) and die "error while running: @$cmd";
+      return 1;
+    }
+
     $builders[0]->build;
 
     local $ENV{PERL5LIB} = join $Config::Config{path_sep},
@@ -615,13 +804,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Dist::Builder - dist zilla subclass for building dists
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 ATTRIBUTES
 
@@ -728,6 +919,8 @@ subdir and an installer will be run.
 
 Valid arguments are:
 
+  keep_build_dir  - if true, don't rmtree the build dir, even if everything
+                    seemed to work
   install_command - the command to run in the subdir to install the dist
                     default (roughly): $^X -MCPAN -einstall .
 
@@ -735,14 +928,19 @@ Valid arguments are:
 
 =head2 test
 
-  $zilla->test;
+  $zilla->test(\%arg);
 
 This method builds a new copy of the distribution and tests it using
 C<L</run_tests_in>>.
 
+C<\%arg> may be omitted.  Otherwise, valid arguments are:
+
+  keep_build_dir  - if true, don't rmtree the build dir, even if everything
+                    seemed to work
+
 =head2 run_tests_in
 
-  my $error = $zilla->run_tests_in($directory);
+  my $error = $zilla->run_tests_in($directory, $arg);
 
 This method runs the tests in $directory (a Path::Class::Dir), which
 must contain an already-built copy of the distribution.  It will throw an
@@ -766,7 +964,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Dist::Minter;
-{
-  $Dist::Zilla::Dist::Minter::VERSION = '4.300030';
-}
 # ABSTRACT: distribution builder; installer not included!
+$Dist::Zilla::Dist::Minter::VERSION = '5.025';
 use Moose 0.92; # role composition fixes
 extends 'Dist::Zilla';
 
@@ -32,7 +30,7 @@ sub _new_from_profile {
 
   my $config_class =
     $arg->{config_class} ||= 'Dist::Zilla::MVP::Reader::Finder';
-  Class::MOP::load_class($config_class);
+  Class::Load::load_class($config_class);
 
   $arg->{chrome}->logger->log_debug(
     { prefix => '[DZ] ' },
@@ -58,7 +56,7 @@ sub _new_from_profile {
     { '' => 'Dist::Zilla::MintingProfile::', '=', => '' },
     $profile_data->[0],
   );
-  Class::MOP::load_class($module);
+  Class::Load::load_class($module);
 
   my $profile_dir = $module->profile_dir($profile_data->[1]);
 
@@ -116,9 +114,10 @@ sub mint_dist {
     $minter->make_module({ name => $module->{name} })
   }
 
-  $_->gather_files for $self->plugins_with(-FileGatherer)->flatten;
-  $_->prune_files  for $self->plugins_with(-FilePruner)->flatten;
-  $_->munge_files  for $self->plugins_with(-FileMunger)->flatten;
+  $_->gather_files       for $self->plugins_with(-FileGatherer)->flatten;
+  $_->set_file_encodings for $self->plugins_with(-EncodingProvider)->flatten;
+  $_->prune_files        for $self->plugins_with(-FilePruner)->flatten;
+  $_->munge_files        for $self->plugins_with(-FileMunger)->flatten;
 
   $self->_check_dupe_files;
 
@@ -141,13 +140,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Dist::Minter - distribution builder; installer not included!
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -155,7 +156,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,24 @@
 package Dist::Zilla::File::FromCode;
-{
-  $Dist::Zilla::File::FromCode::VERSION = '4.300030';
-}
 # ABSTRACT: a file whose content is (re-)built on demand
+$Dist::Zilla::File::FromCode::VERSION = '5.025';
 use Moose;
+use Moose::Util::TypeConstraints;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This represents a file whose contents will be generated on demand from a
+#pod callback or method name.
+#pod
+#pod It has one attribute, C<code>, which may be a method name (string) or a
+#pod coderef.  When the file's C<content> method is called, the code is used to
+#pod generate the content.  This content is I<not> cached.  It is recomputed every
+#pod time the content is requested.
+#pod
+#pod =cut
+
+with 'Dist::Zilla::Role::File';
 
 has code => (
   is  => 'rw',
@@ -14,16 +26,81 @@ has code => (
   required => 1,
 );
 
+#pod =attr code_return_type
+#pod
+#pod 'text' or 'bytes'
+#pod
+#pod =cut
+
+has code_return_type => (
+  is => 'ro',
+  isa => enum([ qw(text bytes) ]),
+  default => 'text',
+);
+
+#pod =attr encoding
+#pod
+#pod =cut
+
+sub encoding;
+
+has encoding => (
+  is => 'ro',
+  isa => 'Str',
+  lazy => 1,
+  builder => "_build_encoding",
+);
+
+sub _build_encoding {
+  my ($self) = @_;
+  return $self->code_return_type eq 'text' ? 'UTF-8' : 'bytes';
+}
+
+#pod =attr content
+#pod
+#pod =cut
+
 sub content {
   my ($self) = @_;
 
-  confess "cannot set content of a FromCode file" if @_ > 1;
+  confess("cannot set content of a FromCode file") if @_ > 1;
 
   my $code = $self->code;
-  return $self->$code;
+  my $result = $self->$code;
+
+  if ( $self->code_return_type eq 'text' ) {
+    return $result;
+  }
+  else {
+    $self->_decode($result);
+  }
 }
 
-with 'Dist::Zilla::Role::File';
+#pod =attr encoded_content
+#pod
+#pod =cut
+
+sub encoded_content {
+  my ($self) = @_;
+
+  confess( "cannot set encoded_content of a FromCode file" ) if @_ > 1;
+
+  my $code = $self->code;
+  my $result = $self->$code;
+
+  if ( $self->code_return_type eq 'bytes' ) {
+    return $result;
+  }
+  else {
+    $self->_encode($result);
+  }
+}
+
+sub _set_added_by {
+  my ($self, $value) = @_;
+  return $self->_push_added_by(sprintf("%s from coderef added by %s", $self->code_return_type, $value));
+};
+
 __PACKAGE__->meta->make_immutable;
 1;
 
@@ -31,13 +108,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::File::FromCode - a file whose content is (re-)built on demand
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -49,13 +128,25 @@ coderef.  When the file's C<content> method is called, the code is used to
 generate the content.  This content is I<not> cached.  It is recomputed every
 time the content is requested.
 
+=head1 ATTRIBUTES
+
+=head2 code_return_type
+
+'text' or 'bytes'
+
+=head2 encoding
+
+=head2 content
+
+=head2 encoded_content
+
 =head1 AUTHOR
 
 Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,20 +1,41 @@
 package Dist::Zilla::File::InMemory;
-{
-  $Dist::Zilla::File::InMemory::VERSION = '4.300030';
-}
 # ABSTRACT: a file that you build entirely in memory
+$Dist::Zilla::File::InMemory::VERSION = '5.025';
 use Moose;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This represents a file created in memory -- it's not much more than a glorified
+#pod string.
+#pod
+#pod See L<Dist::Zilla::Role::MutableFile> for details.
+#pod
+#pod =cut
+
+with 'Dist::Zilla::Role::MutableFile', 'Dist::Zilla::Role::StubBuild';
+
+after 'BUILD' => sub {
+  my ($self,$opts) = @_;
+  my @sources = qw/encoded_content content/;
+  my @given = grep { exists $opts->{$_} } @sources;
+  unless ( @given == 1 ) {
+    $self->log_fatal(__PACKAGE__ . " requires have one and only one of: @sources");
+  }
+  my $source = $given[0];
+  my $setter = "_$source";
+  $self->_content_source($source);
+  $self->$setter( $opts->{$source} );
+};
+
+# these should never be called since we ensure one of _content or
+# _encoded_content content is set in BUILD and set the source accordingly
+
+sub _build_content { die "shouldn't reach here" }
+sub _build_encoded_content { die "shouldn't reach here" }
+sub _build_content_source { die "shouldn't reach here" }
 
-has content => (
-  is  => 'rw',
-  isa => 'Str',
-  required => 1,
-);
-
-with 'Dist::Zilla::Role::File';
 __PACKAGE__->meta->make_immutable;
 1;
 
@@ -22,19 +43,22 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::File::InMemory - a file that you build entirely in memory
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
 This represents a file created in memory -- it's not much more than a glorified
-string.  It has a read/write C<content> attribute that holds the octets that
-will be written to disk.
+string.
+
+See L<Dist::Zilla::Role::MutableFile> for details.
 
 =head1 AUTHOR
 
@@ -42,7 +66,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,46 +1,44 @@
 package Dist::Zilla::File::OnDisk;
-{
-  $Dist::Zilla::File::OnDisk::VERSION = '4.300030';
-}
 # ABSTRACT: a file that comes from your filesystem
+$Dist::Zilla::File::OnDisk::VERSION = '5.025';
 use Moose;
 
+use Path::Tiny;
+
 use namespace::autoclean;
 
+with 'Dist::Zilla::Role::MutableFile', 'Dist::Zilla::Role::StubBuild';
 
-has content => (
-  is  => 'rw',
-  isa => 'Str',
-  lazy => 1,
-  default => sub { shift->_read_file },
-);
+#pod =head1 DESCRIPTION
+#pod
+#pod This represents a file stored on disk.  Its C<content> attribute is read from
+#pod the originally given file name when first read, but is then kept in memory and
+#pod may be altered by plugins.
+#pod
+#pod =cut
 
 has _original_name => (
   is  => 'ro',
+  writer => '_set_original_name',
   isa => 'Str',
   init_arg => undef,
 );
 
-sub BUILD {
+after 'BUILD' => sub {
   my ($self) = @_;
-  $self->{_original_name} = $self->name;
-}
+  $self->_set_original_name( $self->name );
+};
 
-sub _read_file {
+sub _build_encoded_content {
   my ($self) = @_;
-
-  my $fname = $self->_original_name;
-  open my $fh, '<', $fname or die "can't open $fname for reading: $!";
-
-  # This is needed or \r\n is filtered to be just \n on win32.
-  # Maybe :raw:utf8, not sure.
-  #     -- Kentnl - 2010-06-10
-  binmode $fh, ':raw';
-
-  my $content = do { local $/; <$fh> };
+  return path($self->_original_name)->slurp_raw;
 }
 
-with 'Dist::Zilla::Role::File';
+sub _build_content_source { return "encoded_content" }
+
+# should never be called, as content will always be generated from
+# encoded content
+sub _build_content { die "shouldn't reach here" }
 
 __PACKAGE__->meta->make_immutable;
 1;
@@ -49,13 +47,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::File::OnDisk - a file that comes from your filesystem
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -69,7 +69,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,22 @@
 package Dist::Zilla::MVP::Assembler::GlobalConfig;
-{
-  $Dist::Zilla::MVP::Assembler::GlobalConfig::VERSION = '4.300030';
-}
+# ABSTRACT: Dist::Zilla::MVP::Assembler for global configuration
+$Dist::Zilla::MVP::Assembler::GlobalConfig::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::MVP::Assembler';
-# ABSTRACT: Dist::Zilla::MVP::Assembler for global configuration
 
 use namespace::autoclean;
 
+#pod =head1 OVERVIEW
+#pod
+#pod This is a subclass of L<Dist::Zilla::MVP::Assembler> used when assembling the
+#pod global configuration.  It has a C<stash_registry> attribute, a hashref, into
+#pod which stashes will be registered.
+#pod
+#pod They get registered via the C<register_stash> method, below, generally called
+#pod by the C<register_component> method on L<Dist::Zilla::Role::Stash>-performing
+#pod class.
+#pod
+#pod =cut
 
 has stash_registry => (
   is  => 'ro',
@@ -15,6 +24,14 @@ has stash_registry => (
   default => sub { {} },
 );
 
+#pod =method register_stash
+#pod
+#pod   $assembler->register_stash($name => $stash_object);
+#pod
+#pod This adds a stash to the assembler's stash registry -- unless the name is
+#pod already taken, in which case an exception is raised.
+#pod
+#pod =cut
 
 sub register_stash {
   my ($self, $name, $object) = @_;
@@ -34,13 +51,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::Assembler::GlobalConfig - Dist::Zilla::MVP::Assembler for global configuration
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -67,7 +86,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,24 @@
 package Dist::Zilla::MVP::Assembler::Zilla;
-{
-  $Dist::Zilla::MVP::Assembler::Zilla::VERSION = '4.300030';
-}
+# ABSTRACT: Dist::Zilla::MVP::Assembler for the Dist::Zilla object
+$Dist::Zilla::MVP::Assembler::Zilla::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::MVP::Assembler';
-# ABSTRACT: Dist::Zilla::MVP::Assembler for the Dist::Zilla object
 
 use namespace::autoclean;
 
+#pod =head1 OVERVIEW
+#pod
+#pod This is a subclass of L<Dist::Zilla::MVP::Assembler> used when assembling the
+#pod Dist::Zilla object.
+#pod
+#pod It has a C<zilla_class> attribute, which is used to determine what class of
+#pod Dist::Zilla object to create.  (This isn't very useful now, but will be in the
+#pod future when minting and building use different subclasses of Dist::Zilla.)
+#pod
+#pod Upon construction, the assembler will create a L<Dist::Zilla::MVP::RootSection>
+#pod as the initial section.
+#pod
+#pod =cut
 
 use MooseX::Types::Perl qw(PackageName);
 use Dist::Zilla::MVP::RootSection;
@@ -25,12 +36,27 @@ has zilla_class => (
   required => 1
 );
 
+#pod =method zilla
+#pod
+#pod This method is a shortcut for retrieving the C<zilla> from the root section.
+#pod If called before that section has been finalized, it will result in an
+#pod exception.
+#pod
+#pod =cut
 
 sub zilla {
   my ($self) = @_;
   $self->sequence->section_named('_')->zilla;
 }
 
+#pod =method register_stash
+#pod
+#pod   $assembler->register_stash($name => $stash_object);
+#pod
+#pod This adds a stash to the assembler's zilla's stash registry -- unless the name
+#pod is already taken, in which case an exception is raised.
+#pod
+#pod =cut
 
 sub register_stash {
   my ($self, $name, $object) = @_;
@@ -48,13 +74,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::Assembler::Zilla - Dist::Zilla::MVP::Assembler for the Dist::Zilla object
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -89,7 +117,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,16 +1,35 @@
 package Dist::Zilla::MVP::Assembler;
-{
-  $Dist::Zilla::MVP::Assembler::VERSION = '4.300030';
-}
+# ABSTRACT: Dist::Zilla-specific subclass of Config::MVP::Assembler
+$Dist::Zilla::MVP::Assembler::VERSION = '5.025';
 use Moose;
 extends 'Config::MVP::Assembler';
 with 'Config::MVP::Assembler::WithBundles';
-# ABSTRACT: Dist::Zilla-specific subclass of Config::MVP::Assembler
 
 use namespace::autoclean;
 
 use Dist::Zilla::Util;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod B<Take this next bit seriously!>  If you don't understand how L<Config::MVP>
+#pod works, reading about how the Dist::Zilla-specific Assembler works is not going
+#pod to be useful.
+#pod
+#pod Dist::Zilla::MVP::Assembler extends L<Config::MVP::Assembler> and composes
+#pod L<Config::MVP::Assembler::WithBundles>.  For potential plugin bundles (things
+#pod composing L<Dist::Zilla::Role::PluginBundle>)
+#pod
+#pod The Assembler has chrome, so it can log and will (eventually) be able to get
+#pod input from the user.
+#pod
+#pod The Assembler's C<expand_package> method delegates to Dist::Zilla::Util's
+#pod L<expand_config_package_name|Dist::Zilla::Util/expand_config_package_name>
+#pod method.
+#pod
+#pod The Assembler will throw an exception if it is instructed to add a value for
+#pod C<plugin_name> or C<zilla>.
+#pod
+#pod =cut
 
 has chrome => (
   is   => 'rw',
@@ -57,13 +76,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::Assembler - Dist::Zilla-specific subclass of Config::MVP::Assembler
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -91,7 +112,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,9 @@
 package Dist::Zilla::MVP::Reader::Finder;
-{
-  $Dist::Zilla::MVP::Reader::Finder::VERSION = '4.300030';
-}
+# ABSTRACT: the reader for dist.ini files
+$Dist::Zilla::MVP::Reader::Finder::VERSION = '5.025';
 use Moose;
 use Config::MVP::Reader 2.101540; # if_none
 extends 'Config::MVP::Reader::Finder';
-# ABSTRACT: the reader for dist.ini files
 
 use namespace::autoclean;
 
@@ -22,13 +20,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::Reader::Finder - the reader for dist.ini files
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -36,7 +36,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,17 @@
 package Dist::Zilla::MVP::Reader::Perl;
-{
-  $Dist::Zilla::MVP::Reader::Perl::VERSION = '4.300030';
-}
+# ABSTRACT: the reader for dist.pl files
+$Dist::Zilla::MVP::Reader::Perl::VERSION = '5.025';
 use Moose;
 extends 'Config::MVP::Reader';
 with qw(Config::MVP::Reader::Findable::ByExtension);
-# ABSTRACT: the reader for dist.pl files
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Dist::Zilla::Config reads in the F<dist.pl> file for a distribution.
+#pod
+#pod =cut
 
 sub default_extension { 'pl' }
 
@@ -52,13 +55,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::Reader::Perl - the reader for dist.pl files
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -70,7 +75,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,26 @@
 package Dist::Zilla::MVP::RootSection;
-{
-  $Dist::Zilla::MVP::RootSection::VERSION = '4.300030';
-}
+# ABSTRACT: a standard section in Dist::Zilla's configuration sequence
+$Dist::Zilla::MVP::RootSection::VERSION = '5.025';
 use Moose;
 extends 'Config::MVP::Section';
-# ABSTRACT: a standard section in Dist::Zilla's configuration sequence
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This is a subclass of L<Config::MVP::Section>, used as the starting section by
+#pod L<Dist::Zilla::MVP::Assembler::Zilla>.  It has a number of useful defaults, as
+#pod well as a C<zilla> attribute which will, after section finalization, contain a
+#pod Dist::Zilla object with which subsequent plugin sections may register.
+#pod
+#pod Those useful defaults are:
+#pod
+#pod =for :list
+#pod * name defaults to _
+#pod * aliases defaults to { author => 'authors' }
+#pod * multivalue_args defaults to [ 'authors' ]
+#pod
+#pod =cut
 
 use MooseX::LazyRequire;
 use MooseX::SetOnce;
@@ -56,13 +69,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::RootSection - a standard section in Dist::Zilla's configuration sequence
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -95,7 +110,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,17 +1,13 @@
 package Dist::Zilla::MVP::Section;
-{
-  $Dist::Zilla::MVP::Section::VERSION = '4.300030';
-}
+# ABSTRACT: a standard section in Dist::Zilla's configuration sequence
+$Dist::Zilla::MVP::Section::VERSION = '5.025';
 use Moose;
 extends 'Config::MVP::Section';
-# ABSTRACT: a standard section in Dist::Zilla's configuration sequence
 
 use namespace::autoclean;
 
 use Config::MVP::Section 2.200002; # for not-installed error
 
-use Moose::Autobox;
-
 after finalize => sub {
   my ($self) = @_;
 
@@ -45,13 +41,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MVP::Section - a standard section in Dist::Zilla's configuration sequence
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -59,7 +57,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::MintingProfile::Default;
-{
-  $Dist::Zilla::MintingProfile::Default::VERSION = '4.300030';
-}
 # ABSTRACT: Default minting profile provider
+$Dist::Zilla::MintingProfile::Default::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::MintingProfile::ShareDir';
 
@@ -11,6 +9,14 @@ use namespace::autoclean;
 use Dist::Zilla::Util;
 use Path::Class;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Default minting profile provider.
+#pod
+#pod This provider looks first in the F<~/.dzil/profiles/$profile_name> directory,
+#pod if not found it looks among the default profiles shipped with Dist::Zilla.
+#pod
+#pod =cut
 
 around profile_dir => sub {
   my ($orig, $self, $profile_name) = @_;
@@ -35,13 +41,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::MintingProfile::Default - Default minting profile provider
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -56,7 +64,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,8 @@
 package Dist::Zilla::Plugin::AutoPrereq;
-{
-  $Dist::Zilla::Plugin::AutoPrereq::VERSION = '4.300030';
-}
+# ABSTRACT: (DEPRECATED) the old name for Dist::Zilla::Plugin::AutoPrereqs
+$Dist::Zilla::Plugin::AutoPrereq::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Plugin::AutoPrereqs';
-# ABSTRACT: (DEPRECATED) the old name for Dist::Zilla::Plugin::AutoPrereqs
 
 use namespace::autoclean;
 
@@ -18,17 +16,25 @@ before register_component => sub {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod L<AutoPrereqs|Dist::Zilla::Plugin::AutoPrereqs>
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::AutoPrereq - (DEPRECATED) the old name for Dist::Zilla::Plugin::AutoPrereqs
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SEE ALSO
 
@@ -40,7 +46,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,10 @@
 package Dist::Zilla::Plugin::AutoPrereqs;
-{
-  $Dist::Zilla::Plugin::AutoPrereqs::VERSION = '4.300030';
-}
+# ABSTRACT: automatically extract prereqs from your modules
+$Dist::Zilla::Plugin::AutoPrereqs::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::PrereqSource',
+  'Dist::Zilla::Role::PPI',
   'Dist::Zilla::Role::FileFinderUser' => {
     default_finders => [ ':InstallModules', ':ExecFiles' ],
   },
@@ -20,18 +20,75 @@ with(
   },
 );
 
+#pod =attr finder
+#pod
+#pod This is the name of a L<FileFinder|Dist::Zilla::Role::FileFinder>
+#pod whose files will be scanned to determine runtime prerequisites.  It
+#pod may be specified multiple times.  The default value is
+#pod C<:InstallModules> and C<:ExecFiles>.
+#pod
+#pod =attr test_finder
+#pod
+#pod Just like C<finder>, but for test-phase prerequisites.  The default
+#pod value is C<:TestFiles>.
+#pod
+#pod =attr configure_finder
+#pod
+#pod Just like C<finder>, but for configure-phase prerequisites.  There is
+#pod no default value; AutoPrereqs will not determine configure-phase
+#pod prerequisites unless you set configure_finder.
+#pod
+#pod =cut
 
 use namespace::autoclean;
 
-# ABSTRACT: automatically extract prereqs from your modules
-
-use List::AllUtils 'uniq';
 use Moose::Autobox;
-use Perl::PrereqScanner 1.005; # do not prune common libs
-use PPI;
-use CPAN::Meta::Requirements;
-use version;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [AutoPrereqs]
+#pod   skip = ^Foo|Bar$
+#pod   skip = ^Other::Dist
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will extract loosely your distribution prerequisites from
+#pod your files using L<Perl::PrereqScanner>.
+#pod
+#pod If some prereqs are not found, you can still add them manually with the
+#pod L<Prereqs|Dist::Zilla::Plugin::Prereqs> plugin.
+#pod
+#pod This plugin will skip the modules shipped within your dist.
+#pod
+#pod =attr extra_scanners
+#pod
+#pod This is an arrayref of scanner names (as expected by Perl::PrereqScanner).
+#pod It will be passed as the C<extra_scanners> parameter to Perl::PrereqScanner.
+#pod
+#pod =attr scanners
+#pod
+#pod This is an arrayref of scanner names (as expected by Perl::PrereqScanner).
+#pod If present, it will be passed as the C<scanners> parameter to
+#pod Perl::PrereqScanner, which means that it will replace the default list
+#pod of scanners.
+#pod
+#pod =attr skips
+#pod
+#pod This is an arrayref of regular expressions, derived from all the 'skip' lines
+#pod in the configuration.  Any module names matching any of these regexes will not
+#pod be registered as prerequisites.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod L<Prereqs|Dist::Zilla::Plugin::Prereqs>, L<Perl::PrereqScanner>.
+#pod
+#pod =head1 CREDITS
+#pod
+#pod This plugin was originally contributed by Jerome Quelin.
+#pod
+#pod =cut
 
 sub mvp_multivalue_args { qw(extra_scanners scanners skips) }
 sub mvp_aliases { return { extra_scanner => 'extra_scanners',
@@ -57,6 +114,11 @@ has skips => (
 sub register_prereqs {
   my $self  = shift;
 
+  require Perl::PrereqScanner;
+  Perl::PrereqScanner->VERSION('1.016'); # don't skip "lib"
+  require CPAN::Meta::Requirements;
+  require List::MoreUtils;  # uniq
+
   my @modules;
 
   my $scanner = Perl::PrereqScanner->new(
@@ -79,6 +141,8 @@ sub register_prereqs {
     my $files = $self->$method;
 
     foreach my $file (@$files) {
+      # skip binary files
+      next if $file->is_bytes;
       # parse only perl files
       next unless $file->name =~ /\.(?:pm|pl|t|psgi)$/i
                || $file->content =~ /^#!(?:.*)perl(?:$|\s)/;
@@ -94,13 +158,15 @@ sub register_prereqs {
       } else {
         $this_thing[0] =~ s{^lib/}{};
       }
-      @this_thing = uniq @this_thing;
+      @this_thing = List::MoreUtils::uniq @this_thing;
       s{\.pm$}{} for @this_thing;
       s{/}{::}g for @this_thing;
       push @modules, @this_thing;
 
       # parse a file, and merge with existing prereqs
-      my $file_req = $scanner->scan_string($file->content);
+      my $file_req = $scanner->scan_ppi_document(
+        $self->ppi_document_for_file($file)
+      );
 
       $req->add_requirements($file_req);
     }
@@ -108,6 +174,8 @@ sub register_prereqs {
     # remove prereqs shipped with current dist
     $req->clear_requirement($_) for @modules;
 
+    $req->clear_requirement($_) for qw(Config Errno); # never indexed
+
     # remove prereqs from skiplist
     for my $skip (($self->skips || [])->flatten) {
       my $re   = qr/$skip/;
@@ -138,13 +206,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::AutoPrereqs - automatically extract prereqs from your modules
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -216,7 +286,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::AutoVersion;
-{
-  $Dist::Zilla::Plugin::AutoVersion::VERSION = '4.300030';
-}
 # ABSTRACT: take care of numbering versions so you don't have to
+$Dist::Zilla::Plugin::AutoVersion::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::VersionProvider',
@@ -11,9 +9,22 @@ with(
 
 use namespace::autoclean;
 
-use DateTime 0.44 (); # CLDR fixes
-
-
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin automatically produces a version string, generally based on the
+#pod current time.  By default, it will be in the format: 1.yyDDDn
+#pod
+#pod =cut
+
+#pod =attr major
+#pod
+#pod The C<major> attribute is just an integer that is meant to store the major
+#pod version number.  If no value is specified in configuration, it will default to
+#pod 1.
+#pod
+#pod This attribute's value can be referred to in the autoversion format template.
+#pod
+#pod =cut
 
 has major => (
   is   => 'ro',
@@ -22,6 +33,20 @@ has major => (
   default  => 1,
 );
 
+#pod =attr format
+#pod
+#pod The format is a L<Text::Template> string that will be rendered to form the
+#pod version.  It is meant to access to one variable, C<$major>, and one subroutine,
+#pod C<cldr>, which will format the current time (in GMT) using CLDR patterns (for
+#pod which consult the L<DateTime> documentation).
+#pod
+#pod The default value is:
+#pod
+#pod   {{ $major }}.{{ cldr('yyDDD') }}
+#pod   {{ sprintf('%01u', ($ENV{N} || 0)) }}
+#pod   {{$ENV{DEV} ? (sprintf '_%03u', $ENV{DEV}) : ''}}
+#pod
+#pod =cut
 
 has time_zone => (
   is       => 'ro',
@@ -42,13 +67,25 @@ has format => (
 sub provide_version {
   my ($self) = @_;
 
-  my $now = DateTime->now(time_zone => $self->time_zone);
+  # TODO declare this as a 'develop' prereq as we want it in
+  # `dzil listdeps --author`
+  require DateTime;
+  DateTime->VERSION('0.44'); # CLDR fixes
+
+  my $now;
 
   my $version = $self->fill_in_string(
     $self->format,
     {
       major => \( $self->major ),
-      cldr  => sub { $now->format_cldr($_[0]) },
+      cldr  => sub {
+        $now ||= do {
+          require DateTime;
+          DateTime->VERSION('0.44'); # CLDR fixes
+          DateTime->now(time_zone => $self->time_zone);
+        };
+        $now->format_cldr($_[0])
+      },
     },
   );
 
@@ -60,17 +97,32 @@ sub provide_version {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<PkgVersion|Dist::Zilla::Plugin::PkgVersion>,
+#pod L<PodVersion|Dist::Zilla::Plugin::PodVersion>,
+#pod L<NextRelease|Dist::Zilla::Plugin::NextRelease>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<VersionProvider|Dist::Zilla::Role::VersionProvider>,
+#pod L<TextTemplate|Dist::Zilla::Role::TextTemplate>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::AutoVersion - take care of numbering versions so you don't have to
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -117,7 +169,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,22 @@
 package Dist::Zilla::Plugin::BumpVersion;
-{
-  $Dist::Zilla::Plugin::BumpVersion::VERSION = '4.300030';
-}
 # ABSTRACT: (DEPRECATED) bump the version number by one before building
+$Dist::Zilla::Plugin::BumpVersion::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::BeforeBuild';
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod B<WARNING>  This plugin is deprecated and will be removed.  It is generally
+#pod useless.  It does not do what you think it does.
+#pod
+#pod If loaded, this plugin will ensure that the distribution's version number is
+#pod bumped up by one (in the smallest already-defined version units) before
+#pod building begins.  In other words, if F<dist.ini>'s version reads C<0.002> then
+#pod the newly built dist will be C<0.003>.
+#pod
+#pod =cut
 
 sub before_build {
   my ($self) = @_;
@@ -44,13 +53,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::BumpVersion - (DEPRECATED) bump the version number by one before building
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -68,7 +79,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,16 +1,23 @@
 package Dist::Zilla::Plugin::CPANFile;
-{
-  $Dist::Zilla::Plugin::CPANFile::VERSION = '4.300030';
-}
 # ABSTRACT: produce a cpanfile prereqs file
+$Dist::Zilla::Plugin::CPANFile::VERSION = '5.025';
 use Moose;
-use Moose::Autobox;
 with 'Dist::Zilla::Role::FileGatherer';
 
 use namespace::autoclean;
 
 use Dist::Zilla::File::FromCode;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will add a F<cpanfile> file to the distribution.
+#pod
+#pod =attr filename
+#pod
+#pod If given, parameter allows you to specify an alternate name for the generated
+#pod file.  It defaults, of course, to F<cpanfile>.
+#pod
+#pod =cut
 
 has filename => (
   is  => 'ro',
@@ -73,13 +80,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::CPANFile - produce a cpanfile prereqs file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -98,7 +107,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,24 +1,20 @@
 package Dist::Zilla::Plugin::ConfirmRelease;
-{
-  $Dist::Zilla::Plugin::ConfirmRelease::VERSION = '4.300030';
-}
+# ABSTRACT: prompt for confirmation before releasing
+$Dist::Zilla::Plugin::ConfirmRelease::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::BeforeRelease';
-# ABSTRACT: prompt for confirmation before releasing
 
 use namespace::autoclean;
 
-use Moose::Autobox;
-
 sub before_release {
   my ($self, $tgz) = @_;
 
   my $releasers = join q{, },
                   map {; $_->plugin_name }
-                  $self->zilla->plugins_with(-Releaser)->flatten;
+                  @{ $self->zilla->plugins_with(-Releaser) };
 
-  my $prompt = "*** Preparing to release $tgz with $releasers ***\n"
-             . "Do you want to continue the release process?";
+  $self->log("*** Preparing to release $tgz with $releasers ***");
+  my $prompt = "Do you want to continue the release process?";
 
   my $default = exists $ENV{DZIL_CONFIRMRELEASE_DEFAULT}
               ? $ENV{DZIL_CONFIRMRELEASE_DEFAULT}
@@ -35,17 +31,29 @@ sub before_release {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin prompts the author whether or not to continue before releasing
+#pod the distribution to CPAN.  It gives authors a chance to abort before
+#pod they upload.
+#pod
+#pod The default is "no", but you can set the environment variable
+#pod C<DZIL_CONFIRMRELEASE_DEFAULT> to "yes" if you just want to hit enter to
+#pod release.
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ConfirmRelease - prompt for confirmation before releasing
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -63,7 +71,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,18 +1,55 @@
 package Dist::Zilla::Plugin::DistINI;
-{
-  $Dist::Zilla::Plugin::DistINI::VERSION = '4.300030';
-}
 # ABSTRACT: a plugin to add a dist.ini to newly-minted dists
+$Dist::Zilla::Plugin::DistINI::VERSION = '5.025';
 use Moose;
 with qw(Dist::Zilla::Role::FileGatherer);
 
 use Dist::Zilla::File::FromCode;
 
-use Moose::Autobox 0.10; # for ->each_value
 use MooseX::Types::Moose qw(ArrayRef Str);
+use Path::Tiny;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugins produces a F<dist.ini> file in a new dist, specifying the required
+#pod core attributes from the dist being minted.
+#pod
+#pod This plugin is dead simple and pretty stupid, but should get better as dist
+#pod minting facilities improve.  For example, it will not specify any plugins.
+#pod
+#pod In the meantime, you may be happier with a F<dist.ini> template.
+#pod
+#pod =attr append_file
+#pod
+#pod This parameter may be a filename in the profile's directory to append to the
+#pod generated F<dist.ini> with things like plugins.  In other words, if your make
+#pod this file, called F<plugins.ini>:
+#pod
+#pod   [@Basic]
+#pod   [NextRelease]
+#pod   [@Git]
+#pod
+#pod ...and your F<profile.ini> includes:
+#pod
+#pod   [DistINI]
+#pod   append_file = plugins.ini
+#pod
+#pod ...then the generated C<dist.ini> in a newly-minted dist will look something
+#pod like this:
+#pod
+#pod   name    = My-New-Dist
+#pod   author  = E. Xavier Ample <example@example.com>
+#pod   license = Perl_5
+#pod   copyright_holder = E. Xavier Ample
+#pod   copyright_year   = 2010
+#pod
+#pod   [@Basic]
+#pod   [NextRelease]
+#pod   [@Git]
+#pod
+#pod =cut
 
 sub mvp_multivalue_args { qw(append_file) }
 
@@ -28,16 +65,12 @@ sub gather_files {
   my $zilla = $self->zilla;
 
   my $postlude = '';
-  $self->append_file->each_value(sub {
+
+  for (@{ $self->append_file }) {
     my $fn = $self->zilla->root->file($_);
 
-    $postlude .= do {
-      use autodie;
-      local $/;
-      open my $fh, '<', $fn;
-      <$fh>;
-    };
-  });
+    $postlude .= path($fn)->slurp_utf8;
+  }
 
   my $code = sub {
     my @core_attrs = qw(name authors copyright_holder);
@@ -75,13 +108,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::DistINI - a plugin to add a dist.ini to newly-minted dists
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -129,7 +164,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,152 @@
+package Dist::Zilla::Plugin::Encoding;
+# ABSTRACT: set the encoding of arbitrary files
+$Dist::Zilla::Plugin::Encoding::VERSION = '5.025';
+use Moose;
+with 'Dist::Zilla::Role::EncodingProvider';
+
+use namespace::autoclean;
+
+#pod =head1 SYNOPSIS
+#pod
+#pod This plugin allows you to explicitly set the encoding on some files in your
+#pod distribution. You can either specify the exact set of files (with the
+#pod "filenames" parameter) or provide the regular expressions to check (using
+#pod "match").
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [Encoding]
+#pod   encoding = Latin-3
+#pod
+#pod   filename = t/esperanto.t  ; this file is Esperanto
+#pod   match     = ^t/urkish/    ; these are all Turkish
+#pod
+#pod =cut
+
+sub mvp_multivalue_args { qw(filenames matches) }
+sub mvp_aliases { return { filename => 'filenames', match => 'matches' } }
+
+#pod =attr encoding
+#pod
+#pod This is the encoding to set on the selected files. The special value "bytes"
+#pod can be used to indicate raw files that should not be encoded.
+#pod
+#pod =cut
+
+has encoding => (
+  is   => 'ro',
+  isa  => 'Str',
+  required => 1,
+);
+
+#pod =attr filenames
+#pod
+#pod This is an arrayref of filenames to have their encoding set.
+#pod
+#pod =cut
+
+has filenames => (
+  is   => 'ro',
+  isa  => 'ArrayRef',
+  default => sub { [] },
+);
+
+#pod =attr matches
+#pod
+#pod This is an arrayref of regular expressions.  Any file whose name matches one of
+#pod these regex will have its encoding set.
+#pod
+#pod =cut
+
+has matches => (
+  is   => 'ro',
+  isa  => 'ArrayRef',
+  default => sub { [] },
+);
+
+sub set_file_encodings {
+  my ($self) = @_;
+
+  # never match (at least the filename characters)
+  my $matches_regex = qr/\000/;
+
+  $matches_regex = qr/$matches_regex|$_/ for @{$self->matches};
+
+  # \A\Q$_\E should also handle the `eq` check
+  $matches_regex = qr/$matches_regex|\A\Q$_\E/ for @{$self->filenames};
+
+  for my $file (@{$self->zilla->files}) {
+    next unless $file->name =~ $matches_regex;
+
+    $self->log_debug([
+      'setting encoding of %s to %s',
+      $file->name,
+      $self->encoding,
+    ]);
+
+    $file->encoding($self->encoding);
+  }
+
+  return;
+}
+
+__PACKAGE__->meta->make_immutable;
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Dist::Zilla::Plugin::Encoding - set the encoding of arbitrary files
+
+=head1 VERSION
+
+version 5.025
+
+=head1 SYNOPSIS
+
+This plugin allows you to explicitly set the encoding on some files in your
+distribution. You can either specify the exact set of files (with the
+"filenames" parameter) or provide the regular expressions to check (using
+"match").
+
+In your F<dist.ini>:
+
+  [Encoding]
+  encoding = Latin-3
+
+  filename = t/esperanto.t  ; this file is Esperanto
+  match     = ^t/urkish/    ; these are all Turkish
+
+=head1 ATTRIBUTES
+
+=head2 encoding
+
+This is the encoding to set on the selected files. The special value "bytes"
+can be used to indicate raw files that should not be encoded.
+
+=head2 filenames
+
+This is an arrayref of filenames to have their encoding set.
+
+=head2 matches
+
+This is an arrayref of regular expressions.  Any file whose name matches one of
+these regex will have its encoding set.
+
+=head1 AUTHOR
+
+Ricardo SIGNES <rjbs@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Ricardo SIGNES.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
@@ -1,14 +1,20 @@
 package Dist::Zilla::Plugin::ExecDir;
-{
-  $Dist::Zilla::Plugin::ExecDir::VERSION = '4.300030';
-}
 # ABSTRACT: install a directory's contents as executables
+$Dist::Zilla::Plugin::ExecDir::VERSION = '5.025';
 use Moose;
 
 use namespace::autoclean;
 
-use Moose::Autobox;
-
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [ExecDir]
+#pod   dir = scripts
+#pod
+#pod If no C<dir> is provided, the default is F<bin>.
+#pod
+#pod =cut
 
 has dir => (
   is   => 'ro',
@@ -20,7 +26,9 @@ sub find_files {
   my ($self) = @_;
 
   my $dir = $self->dir;
-  my $files = $self->zilla->files->grep(sub { index($_->name, "$dir/") == 0 });
+  my $files = [
+    grep { index($_->name, "$dir/") == 0 } @{ $self->zilla->files }
+  ];
 }
 
 with 'Dist::Zilla::Role::ExecFiles';
@@ -31,13 +39,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ExecDir - install a directory's contents as executables
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -54,7 +64,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,24 @@
 package Dist::Zilla::Plugin::ExtraTests;
-{
-  $Dist::Zilla::Plugin::ExtraTests::VERSION = '4.300030';
-}
 # ABSTRACT: rewrite ./xt tests to ./t tests with skips
+$Dist::Zilla::Plugin::ExtraTests::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::FileMunger';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin rewrites tests found in the following directories:
+#pod
+#pod   ./xt/author  - tests for author testing (env AUTHOR_TESTING is true)
+#pod   ./xt/release - tests for pre-release testers (env RELEASE_TESTING is true)
+#pod   ./xt/smoke   - tests for automated testers (env AUTOMATED_TESTING is true)
+#pod
+#pod The tests are renamed and moved to F<./t>, and they are rewritten to include
+#pod some simple Perl code to skip all included tests if the correct env vars are
+#pod not set.
+#pod
+#pod =cut
 
 sub munge_file {
   my ($self, $file) = @_;
@@ -63,13 +74,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ExtraTests - rewrite ./xt tests to ./t tests with skips
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -89,7 +102,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,9 +1,6 @@
 package Dist::Zilla::Plugin::FakeRelease;
-{
-  $Dist::Zilla::Plugin::FakeRelease::VERSION = '4.300030';
-}
 # ABSTRACT: fake plugin to test release
-
+$Dist::Zilla::Plugin::FakeRelease::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::Releaser';
 
@@ -32,17 +29,49 @@ sub release {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod     [FakeRelease]
+#pod     user = CPANAUTHORID ; # optional.
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin is a L<Releaser|Dist::Zilla::Role::Releaser> that does nothing. It
+#pod is directed to plugin authors, who may need a dumb release plugin to test their
+#pod shiny plugin implementing L<BeforeRelease|Dist::Zilla::Role::BeforeRelease>
+#pod and L<AfterRelease|Dist::Zilla::Role::AfterRelease>.
+#pod
+#pod When this plugin does the release, it will just log a message and finish.
+#pod
+#pod If you set the environment variable C<DZIL_FAKERELEASE_FAIL> to a true value,
+#pod the plugin will die instead of doing nothing. This can be useful for
+#pod authors wanting to test reliably that release failed.
+#pod
+#pod You can optionally provide the 'user' parameter, which defaults to 'AUTHORID',
+#pod which will allow things that depend on this metadata
+#pod ( Sometimes provided by L<UploadToCPAN|Dist::Zilla::Plugin::UploadToCPAN> ) to still work.
+#pod ( For example: L<Dist::Zilla::Plugin::Twitter> )
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<ConfirmRelease|Dist::Zilla::Plugin::ConfirmRelease>,
+#pod L<UploadToCPAN|Dist::Zilla::Plugin::UploadToCPAN>.
+#pod
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::FakeRelease - fake plugin to test release
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -79,7 +108,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,19 +1,45 @@
 package Dist::Zilla::Plugin::FileFinder::ByName;
-{
-  $Dist::Zilla::Plugin::FileFinder::ByName::VERSION = '4.300030';
-}
+# ABSTRACT: FileFinder matching on pathnames
+$Dist::Zilla::Plugin::FileFinder::ByName::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::FileFinder';
-# ABSTRACT: FileFinder matching on pathnames
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [FileFinder::ByName / MyFiles]
+#pod   dir   = bin     ; look in the bin/ directory
+#pod   dir   = lib     ; and the lib/ directory
+#pod   file  = *.pl    ; for .pl files
+#pod   match = \.pm$   ; and for .pm files
+#pod   skip  = ignore  ; that don't have "ignore" in the path
+#pod
+#pod =head1 CREDITS
+#pod
+#pod This plugin was originally contributed by Christopher J. Madsen.
+#pod
+#pod =cut
 
 use Moose::Util::TypeConstraints;
 use MooseX::Types::Moose qw(ArrayRef RegexpRef Str);
 
 use Text::Glob 0.08 qw(glob_to_regex_string);
 
+#pod =attr dir
+#pod
+#pod The file must be located in one of the specified directories (relative
+#pod to the root directory of the dist).
+#pod
+#pod =attr file
+#pod
+#pod The filename must match one of the specified patterns (which are
+#pod converted to regexs using L<Text::Glob> and combined with any C<match>
+#pod rules).
+#pod
+#pod =cut
 
 has dirs => (
   is       => 'ro',
@@ -31,6 +57,15 @@ has files => (
   my $type = subtype as ArrayRef[RegexpRef];
   coerce $type, from ArrayRef[Str], via { [map { qr/$_/ } @$_] };
 
+#pod =attr match
+#pod
+#pod The pathname must match one of these regular expressions.
+#pod
+#pod =attr skip
+#pod
+#pod The pathname must I<not> match any of these regular expressions.
+#pod
+#pod =cut
 
   has matches => (
     is      => 'ro',
@@ -101,17 +136,51 @@ sub find_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod FileFinder::ByName is a L<FileFinder|Dist::Zilla::Role::FileFinder> that
+#pod selects files by matching the criteria you specify against the pathname.
+#pod
+#pod There are three types of criteria you can use.  C<dir> limits the
+#pod search to a particular directory.  C<match> is a regular expression
+#pod that must match the pathname.  C<skip> is a regular expression that
+#pod must not match the pathname.
+#pod
+#pod Each key can be specified multiple times.  Multiple occurrences of the
+#pod same key are ORed together.  Different keys are ANDed together.  That
+#pod means that to be selected, a file must be located in one of the
+#pod C<dir>s, must match one of the C<match> regexs, and must not match any
+#pod of the C<skip> regexs.
+#pod
+#pod Note that C<file> and C<match> are considered to be the I<same> key.
+#pod They're just different ways to write a regex that the pathname must match.
+#pod
+#pod Omitting a particular key means that criterion will not apply to the
+#pod search.  Omitting all keys will select every file in your dist.
+#pod
+#pod Note: If you need to OR different types of criteria, then use more
+#pod than one instance of FileFinder::ByName.  A
+#pod L<FileFinderUser|Dist::Zilla::Role::FileFinderUser> should allow you
+#pod to specify more than one FileFinder to use.
+#pod
+#pod =for Pod::Coverage
+#pod mvp_aliases
+#pod mvp_multivalue_args
+#pod find_files
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::FileFinder::ByName - FileFinder matching on pathnames
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -186,7 +255,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,7 +1,6 @@
 package Dist::Zilla::Plugin::FileFinder::Filter;
-{
-  $Dist::Zilla::Plugin::FileFinder::Filter::VERSION = '4.300030';
-}
+# ABSTRACT: filter matches from other FileFinders
+$Dist::Zilla::Plugin::FileFinder::Filter::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::FileFinder',
@@ -9,10 +8,23 @@ with(
     default_finders => [],
   },
 );
-# ABSTRACT: filter matches from other FileFinders
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [FileFinder::Filter / MyFiles]
+#pod   finder = :InstallModules ; find files from :InstallModules
+#pod   finder = :ExecFiles      ; or :ExecFiles
+#pod   skip  = ignore           ; that don't have "ignore" in the path
+#pod
+#pod =head1 CREDITS
+#pod
+#pod This plugin was originally contributed by Christopher J. Madsen.
+#pod
+#pod =cut
 
 use Moose::Util::TypeConstraints;
 use MooseX::Types::Moose qw(ArrayRef RegexpRef Str);
@@ -21,6 +33,17 @@ use MooseX::Types::Moose qw(ArrayRef RegexpRef Str);
   my $type = subtype as ArrayRef[RegexpRef];
   coerce $type, from ArrayRef[Str], via { [map { qr/$_/ } @$_] };
 
+#pod =attr finder
+#pod
+#pod A FileFinder to supply the initial list of files.
+#pod May occur multiple times.
+#pod
+#pod =attr skip
+#pod
+#pod The pathname must I<not> match any of these regular expressions.
+#pod May occur multiple times.
+#pod
+#pod =cut
 
   has skips => (
     is      => 'ro',
@@ -54,17 +77,33 @@ sub find_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod FileFinder::Filter is a L<FileFinder|Dist::Zilla::Role::FileFinder> that
+#pod selects files by filtering the selections of other FileFinders.
+#pod
+#pod You specify one or more FileFinders to generate the initial list of
+#pod files.  Any file whose pathname matches any of the C<skip> regexs is
+#pod removed from that list.
+#pod
+#pod =for Pod::Coverage
+#pod mvp_aliases
+#pod mvp_multivalue_args
+#pod find_files
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::FileFinder::Filter - filter matches from other FileFinders
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -110,7 +149,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,11 @@
 package Dist::Zilla::Plugin::FinderCode;
-{
-  $Dist::Zilla::Plugin::FinderCode::VERSION = '4.300030';
-}
+# ABSTRACT: a callback-based FileFinder plugin
+$Dist::Zilla::Plugin::FinderCode::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::FileFinder';
-# ABSTRACT: a callback-based FileFinder plugin
 
 use namespace::autoclean;
 
-use Moose::Autobox;
 use Moose::Util::TypeConstraints;
 
 has code => (
@@ -34,7 +31,7 @@ sub find_files {
 sub _find_via_grep {
   my ($self) = @_;
 
-  my @files = grep { $self->code->($_, $self) } $self->zilla->files->flatten;
+  my @files = grep { $self->code->($_, $self) } @{ $self->zilla->files };
   return \@files;
 }
 
@@ -52,13 +49,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::FinderCode - a callback-based FileFinder plugin
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -66,7 +65,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::GatherDir::Template;
-{
-  $Dist::Zilla::Plugin::GatherDir::Template::VERSION = '4.300030';
-}
 # ABSTRACT: gather all the files in a directory and use them as templates
+$Dist::Zilla::Plugin::GatherDir::Template::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Plugin::GatherDir';
 with 'Dist::Zilla::Role::TextTemplate';
@@ -10,22 +8,34 @@ with 'Dist::Zilla::Role::TextTemplate';
 use namespace::autoclean;
 
 use autodie;
-use Moose::Autobox;
 use Dist::Zilla::File::FromCode;
-
+use Path::Tiny;
+
+#pod =head1 DESCRIPTION
+#pod
+#pod This is a subclass of the L<GatherDir|Dist::Zilla::Plugin::GatherDir>
+#pod plugin.  It works just like its parent class, except that each
+#pod gathered file is processed through L<Text::Template>.
+#pod
+#pod The variables C<$plugin> and C<$dist> will be provided to the
+#pod template, set to the GatherDir::Template plugin and the Dist::Zilla
+#pod object, respectively.
+#pod
+#pod It is meant to be used when minting dists with C<dzil new>, but could be used
+#pod in building existing dists, too.
+#pod
+#pod =cut
 
 sub _file_from_filename {
   my ($self, $filename) = @_;
 
-  my $template = do {
-    open my $fh, '<', $filename;
-    local $/;
-    <$fh>;
-  };
+  my $template = path($filename)->slurp_utf8;
+
+  my @stat = stat $filename or $self->log_fatal("$filename does not exist!");
 
   return Dist::Zilla::File::FromCode->new({
     name => $filename,
-    mode => ((stat $filename)[2] & 0755) | 0200, # kill world-writeability, make sure owner-writable.
+    mode => ($stat[2] & 0755) | 0200, # kill world-writeability, make sure owner-writable.
     code => sub {
       my ($file_obj) = @_;
       $self->fill_in_string(
@@ -46,13 +56,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::GatherDir::Template - gather all the files in a directory and use them as templates
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -73,7 +85,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::GatherDir;
-{
-  $Dist::Zilla::Plugin::GatherDir::VERSION = '4.300030';
-}
 # ABSTRACT: gather all the files in a directory
+$Dist::Zilla::Plugin::GatherDir::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 use MooseX::Types::Path::Class qw(Dir File);
@@ -10,14 +8,47 @@ with 'Dist::Zilla::Role::FileGatherer';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This is a very, very simple L<FileGatherer|Dist::Zilla::Role::FileGatherer>
+#pod plugin.  It looks in the directory named in the L</root> attribute and adds all
+#pod the files it finds there.  If the root begins with a tilde, the tilde is
+#pod replaced with the current user's home directory according to L<File::HomeDir>.
+#pod
+#pod Almost every dist will be built with one GatherDir plugin, since it's the
+#pod easiest way to get files from disk into your dist.  Most users just need:
+#pod
+#pod   [GatherDir]
+#pod
+#pod ...and this will pick up all the files from the current directory into the
+#pod dist.  You can use it multiple times, as you can any other plugin, by providing
+#pod a plugin name.  For example, if you want to include external specification
+#pod files into a subdir of your dist, you might write:
+#pod
+#pod   [GatherDir]
+#pod   ; this plugin needs no config and gathers most of your files
+#pod
+#pod   [GatherDir / SpecFiles]
+#pod   ; this plugin gets all the files in the root dir and adds them under ./spec
+#pod   root   = ~/projects/my-project/spec
+#pod   prefix = spec
+#pod
+#pod =cut
 
 use File::Find::Rule;
-use File::HomeDir;
 use File::Spec;
-use Path::Class;
+use Path::Tiny;
+use List::Util 1.33 'all';
 
 use namespace::autoclean;
 
+#pod =attr root
+#pod
+#pod This is the directory in which to look for files.  If not given, it defaults to
+#pod the dist root -- generally, the place where your F<dist.ini> or other
+#pod configuration file is located.
+#pod
+#pod =cut
 
 has root => (
   is   => 'ro',
@@ -28,6 +59,12 @@ has root => (
   default  => sub { shift->zilla->root },
 );
 
+#pod =attr prefix
+#pod
+#pod This parameter can be set to place the gathered files under a particular
+#pod directory.  See the L<description|DESCRIPTION> above for an example.
+#pod
+#pod =cut
 
 has prefix => (
   is  => 'ro',
@@ -35,6 +72,14 @@ has prefix => (
   default => '',
 );
 
+#pod =attr include_dotfiles
+#pod
+#pod By default, files will not be included if they begin with a dot.  This goes
+#pod both for files and for directories relative to the C<root>.
+#pod
+#pod In almost all cases, the default value (false) is correct.
+#pod
+#pod =cut
 
 has include_dotfiles => (
   is  => 'ro',
@@ -42,6 +87,13 @@ has include_dotfiles => (
   default => 0,
 );
 
+#pod =attr follow_symlinks
+#pod
+#pod By default, directories that are symlinks will not be followed. Note on the
+#pod other hand that in all followed directories, files which are symlinks are
+#pod always gathered.
+#pod
+#pod =cut
 
 has follow_symlinks => (
   is  => 'ro',
@@ -49,8 +101,15 @@ has follow_symlinks => (
   default => 0,
 );
 
-sub mvp_multivalue_args { qw(exclude_filename exclude_match) }
+sub mvp_multivalue_args { qw(exclude_filename exclude_match prune_directory) }
 
+#pod =attr exclude_filename
+#pod
+#pod To exclude certain files from being gathered, use the C<exclude_filename>
+#pod option.  The filename is matched exactly, relative to C<root>.
+#pod This may be used multiple times to specify multiple files to exclude.
+#pod
+#pod =cut
 
 has exclude_filename => (
   is   => 'ro',
@@ -58,6 +117,14 @@ has exclude_filename => (
   default => sub { [] },
 );
 
+#pod =attr exclude_match
+#pod
+#pod This is just like C<exclude_filename> but provides a regular expression
+#pod pattern.  Filenames matching the pattern (relative to C<root>)  are not
+#pod gathered.  This may be used
+#pod multiple times to specify multiple patterns to exclude.
+#pod
+#pod =cut
 
 has exclude_match => (
   is   => 'ro',
@@ -65,38 +132,76 @@ has exclude_match => (
   default => sub { [] },
 );
 
+#pod =attr prune_directory
+#pod
+#pod While traversing, any directory matching the regular expression pattern will
+#pod not be traversed further. This may be used multiple times to specify multiple
+#pod directories to skip.
+#pod
+#pod =cut
+
+has prune_directory => (
+  is   => 'ro',
+  isa  => 'ArrayRef',
+  default => sub { [] },
+);
+
+around dump_config => sub {
+  my $orig = shift;
+  my $self = shift;
+
+  my $config = $self->$orig;
+
+  $config->{+__PACKAGE__} = {
+    map { $_ => $self->$_ }
+      qw(root prefix include_dotfiles follow_symlinks exclude_filename exclude_match prune_directory),
+  };
+
+  return $config;
+};
+
 sub gather_files {
   my ($self) = @_;
 
   my $exclude_regex = qr/\000/;
-  $exclude_regex = qr/$exclude_regex|$_/
+  $exclude_regex = qr/(?:$exclude_regex)|$_/
     for ($self->exclude_match->flatten);
 
-  my %is_excluded = map {; $_ => 1 } $self->exclude_filename->flatten;
-
   my $root = "" . $self->root;
-  $root =~ s{^~([\\/])}{File::HomeDir->my_home . $1}e;
-  $root = Path::Class::dir($root);
+  $root =~ s{^~([\\/])}{require File::HomeDir; File::HomeDir::->my_home . $1}e;
+
+  my $prune_regex = qr/\000/;
+  $prune_regex = qr/$prune_regex|$_/
+    for ( $self->prune_directory->flatten,
+          $self->include_dotfiles ? () : ( qr/^\.[^.]/ ) );
 
+  # build up the rules
   my $rule = File::Find::Rule->new();
   $rule->extras({follow => $self->follow_symlinks});
-  FILE: for my $filename ($rule->file->in($root)) {
-    my $file = file($filename)->relative($root);
-
-    unless ($self->include_dotfiles) {
-      next FILE if $file->basename =~ qr/^\./;
-      next FILE if grep { /^\.[^.]/ } $file->dir->dir_list;
-    }
-
-    next if $file =~ $exclude_regex;
-    next if $is_excluded{ $file };
+  $rule->exec(sub { $self->log_debug('considering ' . path($_[-1])->relative($root)); 1 })
+    if $self->zilla->logger->get_debug;
+
+  $rule->or(
+    $rule->new->directory->exec(sub { /$prune_regex/ })->prune->discard,
+    $rule->new,
+  );
+
+  $rule->or($rule->new->file, $rule->new->symlink);
+  $rule->not_exec(sub { /^\.[^.]/ }) unless $self->include_dotfiles;   # exec passes basename as $_
+  $rule->exec(sub {
+    my $relative = path($_[-1])->relative($root);
+    $relative !~ $exclude_regex &&
+      all { $relative ne $_ } @{ $self->exclude_filename }
+  });
 
+  FILE: for my $filename ($rule->in($root)) {
     # _file_from_filename is overloaded in GatherDir::Template
     my $fileobj = $self->_file_from_filename($filename);
 
-    $file = Path::Class::file($self->prefix, $file) if $self->prefix;
+    my $file = path($filename)->relative($root);
+    $file = path($self->prefix, $file) if $self->prefix;
 
-    $fileobj->name($file->as_foreign('Unix')->stringify);
+    $fileobj->name($file->stringify);
     $self->add_file($fileobj);
   }
 
@@ -106,9 +211,11 @@ sub gather_files {
 sub _file_from_filename {
   my ($self, $filename) = @_;
 
+  my @stat = stat $filename or $self->log_fatal("$filename does not exist!");
+
   return Dist::Zilla::File::OnDisk->new({
     name => $filename,
-    mode => (stat $filename)[2] & 0755, # kill world-writeability
+    mode => $stat[2] & 0755, # kill world-writeability
   });
 }
 
@@ -119,13 +226,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::GatherDir - gather all the files in a directory
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -162,7 +271,7 @@ configuration file is located.
 
 =head2 prefix
 
-This parameter can be set to gather all the files found under a common
+This parameter can be set to place the gathered files under a particular
 directory.  See the L<description|DESCRIPTION> above for an example.
 
 =head2 include_dotfiles
@@ -181,21 +290,29 @@ always gathered.
 =head2 exclude_filename
 
 To exclude certain files from being gathered, use the C<exclude_filename>
-option. This may be used multiple times to specify multiple files to exclude.
+option.  The filename is matched exactly, relative to C<root>.
+This may be used multiple times to specify multiple files to exclude.
 
 =head2 exclude_match
 
 This is just like C<exclude_filename> but provides a regular expression
-pattern.  Files matching the pattern are not gathered.  This may be used
+pattern.  Filenames matching the pattern (relative to C<root>)  are not
+gathered.  This may be used
 multiple times to specify multiple patterns to exclude.
 
+=head2 prune_directory
+
+While traversing, any directory matching the regular expression pattern will
+not be traversed further. This may be used multiple times to specify multiple
+directories to skip.
+
 =head1 AUTHOR
 
 Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::GenerateFile;
-{
-  $Dist::Zilla::Plugin::GenerateFile::VERSION = '4.300030';
-}
 # ABSTRACT: build a custom file from only the plugin configuration
+$Dist::Zilla::Plugin::GenerateFile::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with (
@@ -14,11 +12,51 @@ use namespace::autoclean;
 
 use Dist::Zilla::File::InMemory;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [GenerateFile]
+#pod   filename    = todo/{{ $dist->name }}-master-plan.txt
+#pod   name_is_template = 1
+#pod   content_is_template = 1
+#pod   content = # Outlines the plan for world domination by {{$dist->name}}
+#pod   content =
+#pod   content = Item 1: Think of an idea!
+#pod   content = Item 2: ?
+#pod   content = Item 3: Profit!
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin adds a file to the distribution.
+#pod
+#pod You can specify the content, as a sequence of lines, in your configuration.
+#pod The specified filename and content might be literals or might be Text::Template
+#pod templates.
+#pod
+#pod =head2 Templating of the content
+#pod
+#pod If you provide C<content_is_template> (or C<is_template>) parameter of "1", the
+#pod content will be run through Text::Template.  The variables C<$plugin> and
+#pod C<$dist> will be provided, set to the GenerateFile plugin and the Dist::Zilla
+#pod object respectively.
+#pod
+#pod If you provide a C<name_is_template> parameter of "1", the filename will be run
+#pod through Text::Template.  The variables C<$plugin> and C<$dist> will be
+#pod provided, set to the GenerateFile plugin and the Dist::Zilla object
+#pod respectively.
+#pod
+#pod =cut
 
 sub mvp_aliases { +{ is_template => 'content_is_template' } }
 
 sub mvp_multivalue_args { qw(content) }
 
+#pod =attr filename
+#pod
+#pod This attribute names the file you want to generate.  It is required.
+#pod
+#pod =cut
 
 has filename => (
   is  => 'ro',
@@ -26,12 +64,24 @@ has filename => (
   required => 1,
 );
 
+#pod =attr content
+#pod
+#pod The C<content> attribute is an arrayref of lines that will be joined together
+#pod with newlines to form the file content.
+#pod
+#pod =cut
 
 has content => (
   is  => 'ro',
   isa => 'ArrayRef',
 );
 
+#pod =attr content_is_template, is_template
+#pod
+#pod This attribute is a bool indicating whether or not the content should be
+#pod treated as a Text::Template template.  By default, it is false.
+#pod
+#pod =cut
 
 has content_is_template => (
   is  => 'ro',
@@ -39,6 +89,14 @@ has content_is_template => (
   default => 0,
 );
 
+#pod =cut
+#pod
+#pod =attr name_is_template
+#pod
+#pod This attribute is a bool indicating whether or not the filename should be
+#pod treated as a Text::Template template.  By default, it is false.
+#pod
+#pod =cut
 
 has name_is_template => (
   is  => 'ro',
@@ -102,20 +160,22 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::GenerateFile - build a custom file from only the plugin configuration
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
 In your F<dist.ini>:
 
   [GenerateFile]
-  filename    = todo/{{ $dist->name =~ s/::/-/r }}_master-plan.txt
+  filename    = todo/{{ $dist->name }}-master-plan.txt
   name_is_template = 1
   content_is_template = 1
   content = # Outlines the plan for world domination by {{$dist->name}}
@@ -171,7 +231,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,19 +1,24 @@
 package Dist::Zilla::Plugin::InlineFiles;
-{
-  $Dist::Zilla::Plugin::InlineFiles::VERSION = '4.300030';
-}
 # ABSTRACT: files in a data section
+$Dist::Zilla::Plugin::InlineFiles::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with 'Dist::Zilla::Role::FileGatherer';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin exists only to be extended, and gathers all files contained in its
+#pod data section and those of its ancestors.  For more information, see
+#pod L<Data::Section|Data::Section>.
+#pod
+#pod =cut
 
 use Sub::Exporter::ForMethods;
-use Data::Section 0.004 # fixed header_re
+use Data::Section 0.200002 # encoding and bytes
   { installer => Sub::Exporter::ForMethods::method_installer },
-  '-setup';
+  '-setup' => { encoding => 'bytes' };
 use Dist::Zilla::File::InMemory;
 
 sub gather_files {
@@ -37,17 +42,28 @@ sub gather_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins inheriting from L<InlineFiles>:
+#pod L<MetaTests|Dist::Zilla::Plugin::MetaTests>,
+#pod L<PodCoverageTests|Dist::Zilla::Plugin::PodCoverageTests>,
+#pod L<PodSyntaxTests|Dist::Zilla::Plugin::PodSyntaxTests>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::InlineFiles - files in a data section
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -68,7 +84,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,18 @@
 package Dist::Zilla::Plugin::License;
-{
-  $Dist::Zilla::Plugin::License::VERSION = '4.300030';
-}
 # ABSTRACT: output a LICENSE file
+$Dist::Zilla::Plugin::License::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::FileGatherer';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin adds a F<LICENSE> file containing the full text of the
+#pod distribution's license, as produced by the C<fulltext> method of the
+#pod dist's L<Software::License> object.
+#pod
+#pod =cut
 
 use Dist::Zilla::File::InMemory;
 
@@ -26,17 +31,43 @@ sub gather_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod =over 4
+#pod
+#pod =item *
+#pod
+#pod the C<license> attribute of the L<Dist::Zilla> object to select the license
+#pod to use.
+#pod
+#pod =item *
+#pod
+#pod Dist::Zilla roles:
+#pod L<FileGatherer|Dist::Zilla::Role::FileGatherer>.
+#pod
+#pod =item *
+#pod
+#pod Other modules:
+#pod L<Software::License>,
+#pod L<Software::License::Artistic_2_0>.
+#pod
+#pod =back
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::License - output a LICENSE file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -72,7 +103,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,9 +1,6 @@
 package Dist::Zilla::Plugin::MakeMaker::Runner;
-{
-  $Dist::Zilla::Plugin::MakeMaker::Runner::VERSION = '4.300030';
-}
 # ABSTRACT: Test and build dists with a Makefile.PL
-
+$Dist::Zilla::Plugin::MakeMaker::Runner::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::BuildRunner',
@@ -24,17 +21,36 @@ sub build {
   my $self = shift;
 
   my $make = $self->make_path;
-  system($^X => 'Makefile.PL') and die "error with Makefile.PL\n";
-  system($make)                and die "error running $make\n";
+
+  my $makefile = $^O eq 'VMS' ? 'Descrip.MMS' : 'Makefile';
+
+  return
+    if -e $makefile and (stat 'Makefile.PL')[9] <= (stat $makefile)[9];
+
+  $self->log_debug("running $^X Makefile.PL");
+  system($^X => qw(Makefile.PL INSTALLMAN1DIR=none INSTALLMAN3DIR=none)) and die "error with Makefile.PL\n";
+
+  $self->log_debug("running $make");
+  system($make) and die "error running $make\n";
 
   return;
 }
 
 sub test {
-  my ( $self, $target ) = @_;
+  my ($self, $target, $arg) = @_;
 
   my $make = $self->make_path;
   $self->build;
+
+  my $job_count = $arg && exists $arg->{jobs}
+                ? $arg->{jobs}
+                : $self->default_jobs;
+
+  my $jobs = "j$job_count";
+  my $ho = "HARNESS_OPTIONS";
+  local $ENV{$ho} = $ENV{$ho} ? "$ENV{$ho}:$jobs" : $jobs;
+
+  $self->log_debug(join(' ', "running $make test", ( $self->zilla->logger->get_debug ? 'TEST_VERBOSE=1' : () )));
   system($make, 'test',
     ( $self->zilla->logger->get_debug ? 'TEST_VERBOSE=1' : () ),
   ) and die "error running $make test\n";
@@ -49,13 +65,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MakeMaker::Runner - Test and build dists with a Makefile.PL
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -63,7 +81,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,28 +1,49 @@
 package Dist::Zilla::Plugin::MakeMaker;
-{
-  $Dist::Zilla::Plugin::MakeMaker::VERSION = '4.300030';
-}
-
 # ABSTRACT: build a Makefile.PL that uses ExtUtils::MakeMaker
+$Dist::Zilla::Plugin::MakeMaker::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 
 use namespace::autoclean;
 
 use Config;
-use List::MoreUtils qw(any uniq);
+use CPAN::Meta::Requirements 2.121; # requirements_for_module
+use List::Util 'first';
 
 use Dist::Zilla::File::InMemory;
 use Dist::Zilla::Plugin::MakeMaker::Runner;
 
-
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will produce an L<ExtUtils::MakeMaker>-powered F<Makefile.PL> for
+#pod the distribution.  If loaded, the L<Manifest|Dist::Zilla::Plugin::Manifest>
+#pod plugin should also be loaded.
+#pod
+#pod =cut
+
+#pod =attr eumm_version
+#pod
+#pod This option declares the version of ExtUtils::MakeMaker required to configure
+#pod and build the distribution.  There is no default, although one may be added if
+#pod it can be determined that the generated F<Makefile.PL> requires some specific
+#pod minimum.  I<No testing has been done on this front.>
+#pod
+#pod =cut
 
 has eumm_version => (
   isa => 'Str',
   is  => 'rw',
-  default => '6.30',
 );
 
+#pod =attr make_path
+#pod
+#pod This option sets the path to F<make>, used to build your dist and run tests.
+#pod It defaults to the value for C<make> in L<Config>, or to C<make> if that isn't
+#pod set.
+#pod
+#pod You probably won't need to set this option.
+#pod
+#pod =cut
 
 has 'make_path' => (
   isa => 'Str',
@@ -37,48 +58,46 @@ has '_runner' => (
   default => sub {
     my ($self) = @_;
     Dist::Zilla::Plugin::MakeMaker::Runner->new({
-      zilla       => $self->zilla,
-      plugin_name => $self->plugin_name . '::Runner',
-      make_path   => $self->make_path,
+      zilla        => $self->zilla,
+      plugin_name  => $self->plugin_name . '::Runner',
+      make_path    => $self->make_path,
+      default_jobs => $self->default_jobs,
     });
   },
 );
 
 # This is here, rather than at the top, so that the "build" and "test" methods
 # will exist, as they are required by BuildRunner and TestRunner respectively.
-# I had originally fixed this with stub methods, but stub methods to not behave
+# I had originally fixed this with stub methods, but stub methods do not behave
 # properly with this use case until Moose 2.0300. -- rjbs, 2012-02-08
 with qw(
   Dist::Zilla::Role::BuildRunner
   Dist::Zilla::Role::InstallTool
   Dist::Zilla::Role::PrereqSource
+  Dist::Zilla::Role::FileGatherer
   Dist::Zilla::Role::TestRunner
   Dist::Zilla::Role::TextTemplate
 );
 
 my $template = q!
+# This file was automatically generated by {{ $generated_by }}.
 use strict;
 use warnings;
 
 {{ $perl_prereq ? qq[use $perl_prereq;] : ''; }}
 
-use ExtUtils::MakeMaker {{ $eumm_version }};
+use ExtUtils::MakeMaker{{ defined $eumm_version && 0+$eumm_version ? ' ' . $eumm_version : '' }};
 
 {{ $share_dir_code{preamble} || '' }}
 
 my {{ $WriteMakefileArgs }}
 
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
-  my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
-  my $pp = $WriteMakefileArgs{PREREQ_PM};
-  for my $mod ( keys %$br ) {
-    if ( exists $pp->{$mod} ) {
-      $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
-    }
-    else {
-      $pp->{$mod} = $br->{$mod};
-    }
-  }
+my {{ $fallback_prereqs }}
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+  delete $WriteMakefileArgs{TEST_REQUIRES};
+  delete $WriteMakefileArgs{BUILD_REQUIRES};
+  $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
 }
 
 delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
@@ -95,17 +114,31 @@ sub register_prereqs {
 
   $self->zilla->register_prereqs(
     { phase => 'configure' },
-    'ExtUtils::MakeMaker' => $self->eumm_version,
+    'ExtUtils::MakeMaker' => $self->eumm_version || 0,
   );
 
   return unless keys %{ $self->zilla->_share_dir_map };
 
   $self->zilla->register_prereqs(
     { phase => 'configure' },
-    'File::ShareDir::Install' => 0.03,
+    'File::ShareDir::Install' => 0.06,
   );
 }
 
+sub gather_files {
+  my ($self) = @_;
+
+  require Dist::Zilla::File::InMemory;
+
+  my $file = Dist::Zilla::File::InMemory->new({
+    name    => 'Makefile.PL',
+    content => $template,   # template evaluated later
+  });
+
+  $self->add_file($file);
+  return;
+}
+
 sub share_dir_code {
   my ($self) = @_;
 
@@ -113,7 +146,11 @@ sub share_dir_code {
 
   my $share_dir_map = $self->zilla->_share_dir_map;
   if ( keys %$share_dir_map ) {
-    my $preamble = qq{use File::ShareDir::Install;\n};
+    my $preamble = <<'PREAMBLE';
+use File::ShareDir::Install;
+$File::ShareDir::Install::INCLUDE_DOTFILES = 1;
+$File::ShareDir::Install::INCLUDE_DOTDIRS = 1;
+PREAMBLE
 
     if ( my $dist_share_dir = $share_dir_map->{dist} ) {
       $dist_share_dir = quotemeta $dist_share_dir;
@@ -157,24 +194,24 @@ sub write_makefile_args {
   my $prereqs = $self->zilla->prereqs;
   my $perl_prereq = $prereqs->requirements_for(qw(runtime requires))
     ->clone
+    ->add_requirements($prereqs->requirements_for(qw(configure requires)))
     ->add_requirements($prereqs->requirements_for(qw(build requires)))
+    ->add_requirements($prereqs->requirements_for(qw(test requires)))
     ->as_string_hash->{perl};
 
   $perl_prereq = version->parse($perl_prereq)->numify if $perl_prereq;
 
   my $prereqs_dump = sub {
-    $prereqs->requirements_for(@_)
-            ->clone
-            ->clear_requirement('perl')
-            ->as_string_hash;
+    $self->_normalize_eumm_versions(
+      $prereqs->requirements_for(@_)
+              ->clone
+              ->clear_requirement('perl')
+              ->as_string_hash
+    );
   };
 
-  my $build_prereq
-    = $prereqs->requirements_for(qw(build requires))
-    ->clone
-    ->add_requirements($prereqs->requirements_for(qw(test requires)))
-    ->clear_requirement('perl')
-    ->as_string_hash;
+  my $build_prereq = $prereqs_dump->(qw(build requires));
+  my $test_prereq = $prereqs_dump->(qw(test requires));
 
   my %write_makefile_args = (
     DISTNAME  => $self->zilla->name,
@@ -186,7 +223,8 @@ sub write_makefile_args {
     EXE_FILES => [ @exe_files ],
 
     CONFIGURE_REQUIRES => $prereqs_dump->(qw(configure requires)),
-    BUILD_REQUIRES     => $build_prereq,
+    keys %$build_prereq ? ( BUILD_REQUIRES => $build_prereq ) : (),
+    keys %$test_prereq ? ( TEST_REQUIRES => $test_prereq ) : (),
     PREREQ_PM          => $prereqs_dump->(qw(runtime   requires)),
 
     test => { TESTS => join q{ }, sort keys %test_dirs },
@@ -197,40 +235,75 @@ sub write_makefile_args {
   return \%write_makefile_args;
 }
 
+sub _normalize_eumm_versions {
+  my ($self, $prereqs) = @_;
+  for my $v (values %$prereqs) {
+    if (version::is_strict($v)) {
+      my $version = version->parse($v);
+      if ($version->is_qv) {
+        if ((() = $v =~ /\./g) > 1) {
+          $v =~ s/^v//;
+        }
+        else {
+          $v = $version->numify;
+        }
+      }
+    }
+  }
+  return $prereqs;
+}
+
+sub _dump_as {
+  my ($self, $ref, $name) = @_;
+  require Data::Dumper;
+  my $dumper = Data::Dumper->new( [ $ref ], [ $name ] );
+  $dumper->Sortkeys( 1 );
+  $dumper->Indent( 1 );
+  $dumper->Useqq( 1 );
+  return $dumper->Dump;
+}
+
+sub fallback_prereq_pm {
+  my $self = shift;
+  my $fallback
+    = $self->_normalize_eumm_versions(
+      $self->zilla->prereqs->merged_requires
+      ->clone
+      ->clear_requirement('perl')
+      ->as_string_hash
+    );
+  return $self->_dump_as( $fallback, '*FallbackPrereqs' );
+}
+
 sub setup_installer {
-  my ($self, $arg) = @_;
+  my ($self) = @_;
 
   my $write_makefile_args = $self->write_makefile_args;
 
   $self->__write_makefile_args($write_makefile_args); # save for testing
 
-  my $perl_prereq = delete $write_makefile_args->{MIN_PERL_VERSION};
+  my $perl_prereq = $write_makefile_args->{MIN_PERL_VERSION};
 
-  require Data::Dumper;
-  my $makefile_args_dumper = Data::Dumper->new(
-    [ $write_makefile_args ],
-    [ '*WriteMakefileArgs' ],
-  );
-  $makefile_args_dumper->Sortkeys( 1 );
-  $makefile_args_dumper->Indent( 1 );
-  $makefile_args_dumper->Useqq( 1 );
+  my $dumped_args = $self->_dump_as($write_makefile_args, '*WriteMakefileArgs');
 
+  my $file = first { $_->name eq 'Makefile.PL' } @{$self->zilla->files};
+
+  $self->log_debug([ 'updating contents of Makefile.PL in memory' ]);
   my $content = $self->fill_in_string(
-    $template,
+    $file->content,
     {
       eumm_version      => \($self->eumm_version),
       perl_prereq       => \$perl_prereq,
       share_dir_code    => $self->share_dir_code,
-      WriteMakefileArgs => \($makefile_args_dumper->Dump),
+      fallback_prereqs  => \($self->fallback_prereq_pm),
+      WriteMakefileArgs => \$dumped_args,
+      generated_by      => \sprintf("%s v%s",
+                              ref($self), $self->VERSION || '(dev)'),
     },
   );
 
-  my $file = Dist::Zilla::File::InMemory->new({
-    name    => 'Makefile.PL',
-    content => $content,
-  });
+  $file->content($content);
 
-  $self->add_file($file);
   return;
 }
 
@@ -243,17 +316,34 @@ has __write_makefile_args => (
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<ModuleBuild|Dist::Zilla::Plugin::ModuleBuild>,
+#pod L<Manifest|Dist::Zilla::Plugin::Manifest>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<BuildRunner|Dist::Zilla::Role::FileGatherer>,
+#pod L<InstallTool|Dist::Zilla::Role::InstallTool>,
+#pod L<PrereqSource|Dist::Zilla::Role::PrereqSource>,
+#pod L<TestRunner|Dist::Zilla::Role::TestRunner>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MakeMaker - build a Makefile.PL that uses ExtUtils::MakeMaker
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -266,9 +356,9 @@ plugin should also be loaded.
 =head2 eumm_version
 
 This option declares the version of ExtUtils::MakeMaker required to configure
-and build the distribution.  It defaults to 6.30, which ensures a working
-C<INSTALL_BASE>.  It can be safely set to earlier versions, although I<no
-testing has been done to determine the minimum version actually required>.
+and build the distribution.  There is no default, although one may be added if
+it can be determined that the generated F<Makefile.PL> requires some specific
+minimum.  I<No testing has been done on this front.>
 
 =head2 make_path
 
@@ -297,7 +387,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::Manifest;
-{
-  $Dist::Zilla::Plugin::Manifest::VERSION = '4.300030';
-}
 # ABSTRACT: build a MANIFEST file
+$Dist::Zilla::Plugin::Manifest::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with 'Dist::Zilla::Role::FileGatherer';
@@ -11,6 +9,24 @@ use namespace::autoclean;
 
 use Dist::Zilla::File::FromCode;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod If included, this plugin will produce a F<MANIFEST> file for the distribution,
+#pod listing all of the files it contains.  For obvious reasons, it should be
+#pod included as close to last as possible.
+#pod
+#pod This plugin is included in the L<@Basic|Dist::Zilla::PluginBundle::Basic>
+#pod bundle.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla core plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Manifest>,
+#pod L<ManifestSkip|Dist::Zilla::Plugin::ManifestSkip>.
+#pod
+#pod Other modules: L<ExtUtils::Manifest>.
+#pod
+#pod =cut
 
 sub __fix_filename {
   my ($name) = @_;
@@ -27,10 +43,14 @@ sub gather_files {
 
   my $file = Dist::Zilla::File::FromCode->new({
     name => 'MANIFEST',
+    code_return_type => 'bytes',
     code => sub {
-      $zilla->files->map(sub { $_->name })
-            ->sort->map( sub { __fix_filename($_) } )->join("\n")
-      . "\n",
+      my $generated_by = sprintf "%s v%s", ref($self), $self->VERSION || '(dev)';
+
+      return "# This file was automatically generated by $generated_by.\n"
+           . $zilla->files->map(sub { $_->name })
+               ->sort->map( sub { __fix_filename($_) } )->join("\n")
+           . "\n",
     },
   });
 
@@ -44,13 +64,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::Manifest - build a MANIFEST file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -75,7 +97,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::ManifestSkip;
-{
-  $Dist::Zilla::Plugin::ManifestSkip::VERSION = '4.300030';
-}
 # ABSTRACT: decline to build files that appear in a MANIFEST.SKIP-like file
+$Dist::Zilla::Plugin::ManifestSkip::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::FilePruner';
 
@@ -10,6 +8,30 @@ use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin reads a MANIFEST.SKIP-like file, as used by L<ExtUtils::MakeMaker>
+#pod and L<ExtUtils::Manifest>, and prunes any files that it declares should be
+#pod skipped.
+#pod
+#pod This plugin is included in the L<@Basic|Dist::Zilla::PluginBundle::Basic>
+#pod bundle.
+#pod
+#pod =attr skipfile
+#pod
+#pod This is the name of the file to read for MANIFEST.SKIP-like content.  It
+#pod defaults, unsurprisingly, to F<MANIFEST.SKIP>.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla core plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<PruneCruft|Dist::Zilla::Plugin::PruneCruft>,
+#pod L<PruneFiles|Dist::Zilla::Plugin::PruneFiles>.
+#pod
+#pod Other modules: L<ExtUtils::Manifest>.
+#pod
+#pod =cut
 
 has skipfile => (is => 'ro', required => 1, default => 'MANIFEST.SKIP');
 
@@ -61,13 +83,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ManifestSkip - decline to build files that appear in a MANIFEST.SKIP-like file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -100,7 +124,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,24 @@
 package Dist::Zilla::Plugin::MetaConfig;
-{
-  $Dist::Zilla::Plugin::MetaConfig::VERSION = '4.300030';
-}
 # ABSTRACT: summarize Dist::Zilla configuration into distmeta
+$Dist::Zilla::Plugin::MetaConfig::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::MetaProvider';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin adds a top-level C<x_Dist_Zilla> key to the
+#pod L<distmeta|Dist::Zilla/distmeta> for the distribution.  It describe the
+#pod Dist::Zilla version used as well as all the plugins used.  Each plugin's name,
+#pod package, and version will be included.  Plugins may augment their
+#pod implementation of the L<Dist::Zilla::Role::ConfigDumper> role methods to add
+#pod more data to this dump.
+#pod
+#pod More information may be added to the top-level of this metadata as time goes
+#pod on.
+#pod
+#pod =cut
 
 sub metadata {
   my ($self) = @_;
@@ -45,17 +56,25 @@ sub metadata {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla roles: L<MetaProvider|Dist::Zilla::Role::MetaProvider>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MetaConfig - summarize Dist::Zilla configuration into distmeta
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -79,7 +98,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,20 +1,27 @@
 package Dist::Zilla::Plugin::MetaJSON;
-{
-  $Dist::Zilla::Plugin::MetaJSON::VERSION = '4.300030';
-}
 # ABSTRACT: produce a META.json
+$Dist::Zilla::Plugin::MetaJSON::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with 'Dist::Zilla::Role::FileGatherer';
 
 use namespace::autoclean;
 
-use CPAN::Meta::Converter 2.101550; # improved downconversion
-use CPAN::Meta::Validator 2.101550; # improved downconversion
 use Dist::Zilla::File::FromCode;
-use Hash::Merge::Simple ();
-use JSON 2;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will add a F<META.json> file to the distribution.
+#pod
+#pod This file is meant to replace the old-style F<META.yml>.  For more information
+#pod on this file, see L<Module::Build::API> and L<CPAN::Meta>.
+#pod
+#pod =attr filename
+#pod
+#pod If given, parameter allows you to specify an alternate name for the generated
+#pod file.  It defaults, of course, to F<META.json>.
+#pod
+#pod =cut
 
 has filename => (
   is  => 'ro',
@@ -22,6 +29,15 @@ has filename => (
   default => 'META.json',
 );
 
+#pod =attr version
+#pod
+#pod This parameter lets you pick what version of the spec to use when generating
+#pod the output.  It defaults to 2 at present, but may be updated to new specs as
+#pod they are released and adopted.
+#pod
+#pod If you want a fixed version, specify it.
+#pod
+#pod =cut
 
 has version => (
   is  => 'ro',
@@ -34,8 +50,16 @@ sub gather_files {
 
   my $zilla = $self->zilla;
 
+  require JSON;
+  JSON->VERSION(2);
+  require CPAN::Meta::Converter;
+  CPAN::Meta::Converter->VERSION(2.101550); # improved downconversion
+  require CPAN::Meta::Validator;
+  CPAN::Meta::Validator->VERSION(2.101550); # improved downconversion
+
   my $file  = Dist::Zilla::File::FromCode->new({
     name => $self->filename,
+    code_return_type => 'text',
     code => sub {
       my $distmeta  = $zilla->distmeta;
 
@@ -50,7 +74,7 @@ sub gather_files {
       my $converter = CPAN::Meta::Converter->new($distmeta);
       my $output    = $converter->convert(version => $self->version);
 
-      JSON->new->ascii(1)->canonical(1)->pretty->encode($output)
+      JSON->new->canonical(1)->pretty->encode($output)
       . "\n";
     },
   });
@@ -62,17 +86,34 @@ sub gather_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<Manifest|Dist::Zilla::Plugin::Manifest>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<FileGatherer|Dist::Zilla::Role::FileGatherer>.
+#pod
+#pod Other modules:
+#pod L<CPAN::Meta>,
+#pod L<CPAN::Meta::Spec>, L<JSON>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MetaJSON - produce a META.json
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -115,7 +156,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,39 @@
 package Dist::Zilla::Plugin::MetaNoIndex;
-{
-  $Dist::Zilla::Plugin::MetaNoIndex::VERSION = '4.300030';
-}
 # ABSTRACT: Stop CPAN from indexing stuff
-
+$Dist::Zilla::Plugin::MetaNoIndex::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::MetaProvider';
 
 use namespace::autoclean;
 
+#pod =encoding utf8
+#pod
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [MetaNoIndex]
+#pod
+#pod   directory = t/author
+#pod   directory = examples
+#pod
+#pod   file = lib/Foo.pm
+#pod
+#pod   package = My::Module
+#pod
+#pod   namespace = My::Module
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin allows you to prevent PAUSE/CPAN from indexing files you don't
+#pod want indexed. This is useful if you build test classes or example classes
+#pod that are used for those purposes only, and are not part of the distribution.
+#pod It does this by adding a C<no_index> block to your F<META.json> (or
+#pod F<META.yml>) file in your distribution.
+#pod
+#pod =for Pod::Coverage mvp_aliases mvp_multivalue_args
+#pod
+#pod =cut
 
 my %ATTR_ALIAS = (
   directories => [ qw(directory dir folder) ],
@@ -29,6 +54,34 @@ sub mvp_aliases {
 
 sub mvp_multivalue_args { return keys %ATTR_ALIAS }
 
+#pod =attr directories
+#pod
+#pod Exclude folders and everything in them, for example: F<author.t>
+#pod
+#pod Aliases: C<folder>, C<dir>, C<directory>
+#pod
+#pod =attr files
+#pod
+#pod Exclude a specific file, for example: F<lib/Foo.pm>
+#pod
+#pod Alias: C<file>
+#pod
+#pod =attr packages
+#pod
+#pod Exclude by package name, for example: C<My::Package>
+#pod
+#pod Aliases: C<class>, C<module>, C<package>
+#pod
+#pod =attr namespaces
+#pod
+#pod Exclude everything under a specific namespace, for example: C<My::Package>
+#pod
+#pod Alias: C<namespace>
+#pod
+#pod B<NOTE:> This will not exclude the package C<My::Package>, only everything
+#pod under it like C<My::Package::Foo>.
+#pod
+#pod =cut
 
 for my $attr (keys %ATTR_ALIAS) {
   has $attr => (
@@ -39,6 +92,11 @@ for my $attr (keys %ATTR_ALIAS) {
   );
 }
 
+#pod =method metadata
+#pod
+#pod Returns a reference to a hash containing the distribution's no_index metadata.
+#pod
+#pod =cut
 
 sub metadata {
   my $self = shift;
@@ -55,17 +113,25 @@ sub metadata {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla roles: L<MetaProvider|Dist::Zilla::Role::MetaProvider>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MetaNoIndex - Stop CPAN from indexing stuff
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -125,8 +191,6 @@ under it like C<My::Package::Foo>.
 
 Returns a reference to a hash containing the distribution's no_index metadata.
 
-=encoding utf8
-
 =for Pod::Coverage mvp_aliases mvp_multivalue_args
 
 =head1 SEE ALSO
@@ -139,7 +203,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,24 @@
 package Dist::Zilla::Plugin::MetaResources;
-{
-  $Dist::Zilla::Plugin::MetaResources::VERSION = '4.300030';
-}
-
 # ABSTRACT: provide arbitrary "resources" for distribution metadata
+$Dist::Zilla::Plugin::MetaResources::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::MetaProvider';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin adds resources entries to the distribution's metadata.
+#pod
+#pod   [MetaResources]
+#pod   homepage          = http://example.com/~dude/project.asp
+#pod   bugtracker.web    = http://rt.cpan.org/NoAuth/Bugs.html?Dist=Project
+#pod   bugtracker.mailto = bug-project@rt.cpan.org
+#pod   repository.url    = git://github.com/dude/project.git
+#pod   repository.web    = http://github.com/dude/project
+#pod   repository.type   = git
+#pod
+#pod =cut
 
 has resources => (
   is       => 'ro',
@@ -23,6 +33,10 @@ sub BUILDARGS {
   my $zilla = delete $copy{zilla};
   my $name  = delete $copy{plugin_name};
 
+  if (exists $copy{license} && ref($copy{license}) ne 'ARRAY') {
+      $copy{license} = [ $copy{license} ];
+  }
+
   if (exists $copy{bugtracker}) {
     my $tracker = delete $copy{bugtracker};
     $copy{bugtracker}{web} = $tracker;
@@ -56,17 +70,27 @@ sub metadata {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla roles: L<MetaProvider|Dist::Zilla::Role::MetaProvider>.
+#pod
+#pod Dist::Zilla plugins on the CPAN: L<GithubMeta|Dist::Zilla::Plugin::GithubMeta>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MetaResources - provide arbitrary "resources" for distribution metadata
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -92,7 +116,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,32 @@
 package Dist::Zilla::Plugin::MetaTests;
-{
-  $Dist::Zilla::Plugin::MetaTests::VERSION = '4.300030';
-}
 # ABSTRACT: common extra tests for META.yml
+$Dist::Zilla::Plugin::MetaTests::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Plugin::InlineFiles';
 with 'Dist::Zilla::Role::PrereqSource';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This is an extension of L<Dist::Zilla::Plugin::InlineFiles>, providing the
+#pod following files:
+#pod
+#pod   xt/release/meta-yaml.t - a standard Test::CPAN::Meta test
+#pod
+#pod L<Test::CPAN::Meta> will be added as a C<develop requires> dependency (which
+#pod can be installed via C<< dzil listdeps --author | cpanm >>).
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<MetaResources|Dist::Zilla::Plugin::MetaResources>,
+#pod L<MetaNoIndex|Dist::Zilla::Plugin::MetaNoIndex>,
+#pod L<MetaYAML|Dist::Zilla::Plugin::MetaYAML>,
+#pod L<MetaJSON|Dist::Zilla::Plugin::MetaJSON>,
+#pod L<MetaConfig|Dist::Zilla::Plugin::MetaConfig>.
+#pod
+#pod =cut
 
 # Register the release test prereq as a "develop requires"
 # so it will be listed in "dzil listdeps --author"
@@ -28,13 +46,15 @@ __PACKAGE__->meta->make_immutable;
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MetaTests - common extra tests for META.yml
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -43,8 +63,8 @@ following files:
 
   xt/release/meta-yaml.t - a standard Test::CPAN::Meta test
 
-Note that this test doesn't actually do anything unless you have
-L<Test::CPAN::Meta> installed.
+L<Test::CPAN::Meta> will be added as a C<develop requires> dependency (which
+can be installed via C<< dzil listdeps --author | cpanm >>).
 
 =head1 SEE ALSO
 
@@ -61,7 +81,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -71,9 +91,8 @@ the same terms as the Perl 5 programming language system itself.
 __DATA__
 ___[ xt/release/distmeta.t ]___
 #!perl
+# This file was automatically generated by Dist::Zilla::Plugin::MetaTests.
 
-use Test::More;
+use Test::CPAN::Meta;
 
-eval "use Test::CPAN::Meta";
-plan skip_all => "Test::CPAN::Meta required for testing META.yml" if $@;
 meta_yaml_ok();
@@ -1,18 +1,25 @@
 package Dist::Zilla::Plugin::MetaYAML;
-{
-  $Dist::Zilla::Plugin::MetaYAML::VERSION = '4.300030';
-}
 # ABSTRACT: produce a META.yml
+$Dist::Zilla::Plugin::MetaYAML::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with 'Dist::Zilla::Role::FileGatherer';
 
+use Try::Tiny;
 use namespace::autoclean;
 
-use CPAN::Meta::Converter 2.101550; # improved downconversion
-use CPAN::Meta::Validator 2.101550; # improved downconversion
-use Hash::Merge::Simple ();
-
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will add a F<META.yml> file to the distribution.
+#pod
+#pod For more information on this file, see L<Module::Build::API> and L<CPAN::Meta>.
+#pod
+#pod =attr filename
+#pod
+#pod If given, parameter allows you to specify an alternate name for the generated
+#pod file.  It defaults, of course, to F<META.yml>.
+#pod
+#pod =cut
 
 has filename => (
   is  => 'ro',
@@ -20,6 +27,18 @@ has filename => (
   default => 'META.yml',
 );
 
+#pod =attr version
+#pod
+#pod This parameter lets you pick what version of the spec to use when generating
+#pod the output.  It defaults to 1.4, the most commonly supported version at
+#pod present.
+#pod
+#pod B<This may change without notice in the future.>
+#pod
+#pod Once version 2 of the META file spec is more widely supported, this may default
+#pod to 2.
+#pod
+#pod =cut
 
 has version => (
   is  => 'ro',
@@ -32,11 +51,16 @@ sub gather_files {
 
   require Dist::Zilla::File::FromCode;
   require YAML::Tiny;
+  require CPAN::Meta::Converter;
+  CPAN::Meta::Converter->VERSION(2.101550); # improved downconversion
+  require CPAN::Meta::Validator;
+  CPAN::Meta::Validator->VERSION(2.101550); # improved downconversion
 
   my $zilla = $self->zilla;
 
   my $file  = Dist::Zilla::File::FromCode->new({
     name => $self->filename,
+    code_return_type => 'text',
     code => sub {
       my $distmeta  = $zilla->distmeta;
 
@@ -50,8 +74,13 @@ sub gather_files {
 
       my $converter = CPAN::Meta::Converter->new($distmeta);
       my $output    = $converter->convert(version => $self->version);
-
-      YAML::Tiny::Dump($output);
+      my $yaml = try {
+        YAML::Tiny->new($output)->write_string; # text!
+      }
+      catch {
+        $self->log_fatal("Could not create YAML string: " . YAML::Tiny->errstr)
+      };
+      return $yaml;
     },
   });
 
@@ -62,17 +91,34 @@ sub gather_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<Manifest|Dist::Zilla::Plugin::Manifest>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<FileGatherer|Dist::Zilla::Role::FileGatherer>.
+#pod
+#pod Other modules:
+#pod L<CPAN::Meta>,
+#pod L<CPAN::Meta::Spec>, L<YAML>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::MetaYAML - produce a META.yml
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -117,7 +163,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,29 +1,57 @@
 package Dist::Zilla::Plugin::ModuleBuild;
-{
-  $Dist::Zilla::Plugin::ModuleBuild::VERSION = '4.300030';
-}
 # ABSTRACT: build a Build.PL that uses Module::Build
-use List::MoreUtils qw(any uniq);
+$Dist::Zilla::Plugin::ModuleBuild::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with (
   'Dist::Zilla::Role::BuildPL',
   'Dist::Zilla::Role::PrereqSource',
+  'Dist::Zilla::Role::FileGatherer',
   'Dist::Zilla::Role::TextTemplate',
 );
 
 use namespace::autoclean;
 
+use CPAN::Meta::Requirements 2.121; # requirements_for_module
 use Dist::Zilla::File::InMemory;
-use List::MoreUtils qw(any uniq);
+use List::Util 'first';
 use Data::Dumper;
 
-
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will create a F<Build.PL> for installing the dist using
+#pod L<Module::Build>.
+#pod
+#pod =cut
+
+#pod =attr mb_version
+#pod
+#pod B<Optional:> Specify the minimum version of L<Module::Build> to depend on.
+#pod
+#pod Defaults to 0.3601 if a sharedir is being used, otherwise 0.28.
+#pod
+#pod =attr mb_class
+#pod
+#pod B<Optional:> Specify the class to use to create the build object.  Defaults
+#pod to C<Module::Build> itself.  If another class is specified, then the value
+#pod of mb_lib will be used to generate a line like C<use lib 'inc'> to be added
+#pod to the generated Build.PL file.
+#pod
+#pod =attr mb_lib
+#pod
+#pod B<Optional:> Specify the list of directories to be passed to lib when using 
+#pod mb_class. Defaults to C<inc>. 
+#pod
+#pod =cut
 
 has 'mb_version' => (
   isa => 'Str',
   is  => 'rw',
-  default => '0.3601',
+  lazy => 1,
+  default => sub {
+    my $self = shift;
+    keys %{$self->zilla->_share_dir_map} ? '0.3601' : '0.28';
+  },
 );
 
 has 'mb_class' => (
@@ -39,6 +67,7 @@ has 'mb_lib' => (
 );
 
 my $template = q|
+# This file was automatically generated by {{ $generated_by }}.
 use strict;
 use warnings;
 
@@ -47,6 +76,13 @@ use Module::Build {{ $plugin->mb_version }};
 
 my {{ $module_build_args }}
 
+my {{ $fallback_build_prereqs }}
+
+unless ( eval { Module::Build->VERSION(0.4004) } ) {
+  delete $module_build_args{test_requires};
+  $module_build_args{build_requires} = \%fallback_build_requires;
+}
+
 my $build = {{ $plugin->mb_class }}->new(%module_build_args);
 
 $build->create_build_script;
@@ -63,6 +99,16 @@ sub _use_custom_class {
   }
 }
 
+sub _dump_as {
+  my ($self, $ref, $name) = @_;
+  require Data::Dumper;
+  my $dumper = Data::Dumper->new( [ $ref ], [ $name ] );
+  $dumper->Sortkeys( 1 );
+  $dumper->Indent( 1 );
+  $dumper->Useqq( 1 );
+  return $dumper->Dump;
+}
+
 sub register_prereqs {
   my ($self) = @_;
 
@@ -90,14 +136,11 @@ sub module_build_args {
   my %prereqs = (
     configure_requires => $prereqs->requirements_for(qw(configure requires)),
     build_requires     => $prereqs->requirements_for(qw(build     requires)),
+    test_requires      => $prereqs->requirements_for(qw(test      requires)),
     requires           => $prereqs->requirements_for(qw(runtime   requires)),
     recommends         => $prereqs->requirements_for(qw(runtime   recommends)),
   );
 
-  $prereqs{build_requires} = $prereqs{build_requires}->clone->add_requirements(
-    $prereqs->requirements_for(qw(test requires))
-  );
-
   (my $name = $self->zilla->name) =~ s/-/::/g;
 
   return {
@@ -115,8 +158,33 @@ sub module_build_args {
   };
 }
 
+sub fallback_build_requires {
+  my $self = shift;
+  my $prereqs = $self->zilla->prereqs;
+  my $merged = CPAN::Meta::Requirements->new;
+  for my $phase ( qw/build test/ ) {
+    my $req = $prereqs->requirements_for($phase, 'requires');
+    $merged->add_requirements( $req );
+  };
+  return $self->_dump_as( $merged->as_string_hash, '*fallback_build_requires' );
+}
+
+sub gather_files {
+  my ($self) = @_;
+
+  require Dist::Zilla::File::InMemory;
+
+  my $file = Dist::Zilla::File::InMemory->new({
+    name    => 'Build.PL',
+    content => $template,   # template evaluated later
+  });
+
+  $self->add_file($file);
+  return;
+}
+
 sub setup_installer {
-  my ($self, $arg) = @_;
+  my ($self) = @_;
 
   $self->log_fatal("can't build Build.PL; license has no known META.yml value")
     unless $self->zilla->license->meta_yml_name;
@@ -125,28 +193,26 @@ sub setup_installer {
 
   $self->__module_build_args($module_build_args);
 
-  my $module_build_dumper = Data::Dumper->new(
-    [ $module_build_args ],
-    [ '*module_build_args' ],
-  );
-  $module_build_dumper->Sortkeys( 1 );
-  $module_build_dumper->Indent( 1 );
-  $module_build_dumper->Useqq( 1 );
+  my $dumped_args = $self->_dump_as($module_build_args, '*module_build_args');
 
+  my $fallback_build_requires = $self->fallback_build_requires;
+
+  my $file = first { $_->name eq 'Build.PL' } @{$self->zilla->files};
+
+  $self->log_debug([ 'updating contents of Build.PL in memory' ]);
   my $content = $self->fill_in_string(
-    $template,
+    $file->content,
     {
-      plugin            => \$self,
-      module_build_args => \($module_build_dumper->Dump),
+      plugin                  => \$self,
+      module_build_args       => \$dumped_args,
+      fallback_build_prereqs  => \$fallback_build_requires,
+      generated_by            => \sprintf("%s v%s",
+                                    ref($self), $self->VERSION || '(dev)'),
     },
   );
 
-  my $file = Dist::Zilla::File::InMemory->new({
-    name    => 'Build.PL',
-    content => $content,
-  });
+  $file->content($content);
 
-  $self->add_file($file);
   return;
 }
 
@@ -159,17 +225,32 @@ has __module_build_args => (
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<@Filter|Dist::Zilla::PluginBundle::Filter>,
+#pod L<MakeMaker|Dist::Zilla::Plugin::MakeMaker>,
+#pod L<Manifest|Dist::Zilla::Plugin::Manifest>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<BuildPL|Dist::Zilla::Role::BuildPL>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ModuleBuild - build a Build.PL that uses Module::Build
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -182,7 +263,7 @@ L<Module::Build>.
 
 B<Optional:> Specify the minimum version of L<Module::Build> to depend on.
 
-Defaults to 0.3601
+Defaults to 0.3601 if a sharedir is being used, otherwise 0.28.
 
 =head2 mb_class
 
@@ -213,7 +294,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,21 @@
 package Dist::Zilla::Plugin::ModuleShareDirs;
-{
-  $Dist::Zilla::Plugin::ModuleShareDirs::VERSION = '4.300030';
-}
 # ABSTRACT: install a directory's contents as module-based "ShareDir" content
+$Dist::Zilla::Plugin::ModuleShareDirs::VERSION = '5.025';
 use Moose;
 
 use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [ModuleShareDirs]
+#pod   Foo::Bar = shares/foo_bar
+#pod   Foo::Baz = shares/foo_baz
+#pod
+#pod =cut
 
 has _module_map => (
   is   => 'ro',
@@ -62,13 +69,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ModuleShareDirs - install a directory's contents as module-based "ShareDir" content
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -84,7 +93,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,9 +1,6 @@
 package Dist::Zilla::Plugin::NextRelease;
-{
-  $Dist::Zilla::Plugin::NextRelease::VERSION = '4.300030';
-}
 # ABSTRACT: update the next release number in your changelog
-
+$Dist::Zilla::Plugin::NextRelease::VERSION = '5.025';
 use namespace::autoclean;
 
 use Moose;
@@ -13,7 +10,7 @@ with (
   'Dist::Zilla::Role::AfterRelease',
 );
 
-use DateTime 0.44; # CLDR fixes
+use Path::Tiny;
 use Moose::Util::TypeConstraints;
 use String::Formatter 0.100680 stringf => {
   -as => '_format_version',
@@ -23,6 +20,9 @@ use String::Formatter 0.100680 stringf => {
   codes => {
     v => sub { $_[0]->zilla->version },
     d => sub {
+      require DateTime;
+      DateTime->VERSION('0.44'); # CLDR fixes
+
       DateTime->from_epoch(epoch => $^T, time_zone => $_[0]->time_zone)
               ->format_cldr($_[1]),
     },
@@ -47,7 +47,7 @@ has time_zone => (
 has format => (
   is  => 'ro',
   isa => 'Str', # should be more validated Later -- rjbs, 2008-06-05
-  default => '%-9v %{yyyy-MM-dd HH:mm:ss VVVV}d',
+  default => '%-9v %{yyyy-MM-dd HH:mm:ssZZZZZ VVVV}d%{ (TRIAL RELEASE)}T',
 );
 
 has filename => (
@@ -119,17 +119,12 @@ sub munge_files {
 sub after_release {
   my ($self) = @_;
   my $filename = $self->filename;
+  my ($gathered_file) = grep { $_->name eq $filename } @{ $self->zilla->files };
+  $self->log_fatal("failed to find $filename in the distribution") if not $gathered_file;
+  my $iolayer = sprintf(":raw:encoding(%s)", $gathered_file->encoding);
 
   # read original changelog
-  my $content = do {
-    local $/;
-    open my $in_fh, '<', $filename
-      or Carp::croak("can't open $filename for reading: $!");
-
-    # Win32
-    binmode $in_fh, ':raw';
-    <$in_fh>
-  };
+  my $content = path($filename)->slurp({ binmode => $iolayer});
 
   # add the version and date to file content
   my $delim  = $self->delim;
@@ -141,29 +136,132 @@ sub after_release {
   $self->log_debug([ 'updating contents of %s on disk', $update_fn ]);
 
   # and finally rewrite the changelog on disk
-  open my $out_fh, '>', $update_fn
-    or Carp::croak("can't open $update_fn for writing: $!");
-
-  # Win32.
-  binmode $out_fh, ':raw';
-  print $out_fh $content or Carp::croak("error writing to $update_fn: $!");
-  close $out_fh or Carp::croak("error closing $update_fn: $!");
+  path($update_fn)->spew({binmode => $iolayer}, $content);
 }
 
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [NextRelease]
+#pod
+#pod In your F<Changes> file:
+#pod
+#pod   {{$NEXT}}
+#pod
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod Tired of having to update your F<Changes> file by hand with the new
+#pod version and release date / time each time you release your distribution?
+#pod Well, this plugin is for you.
+#pod
+#pod Add this plugin to your F<dist.ini>, and the following to your
+#pod F<Changes> file:
+#pod
+#pod   {{$NEXT}}
+#pod
+#pod The C<NextRelease> plugin will then do 2 things:
+#pod
+#pod =over 4
+#pod
+#pod =item * At build time, this special marker will be replaced with the
+#pod version and the build date, to form a standard changelog header. This
+#pod will be done to the in-memory file - the original F<Changes> file won't
+#pod be updated.
+#pod
+#pod =item * After release (when running C<dzil release>), since the version
+#pod and build date are now part of your dist's history, the real F<Changes>
+#pod file (not the in-memory one) will be updated with this piece of
+#pod information.
+#pod
+#pod =back
+#pod
+#pod The module accepts the following options in its F<dist.ini> section:
+#pod
+#pod =begin :list
+#pod
+#pod = filename
+#pod the name of your changelog file;  defaults to F<Changes>
+#pod
+#pod = update_filename
+#pod the file to which to write an updated changelog to; defaults to the C<filename>
+#pod
+#pod = format
+#pod sprintf-like string used to compute the next value of C<{{$NEXT}}>;
+#pod defaults to C<%-9v %{yyyy-MM-dd HH:mm:ss VVVV}d>
+#pod
+#pod = time_zone
+#pod the timezone to use when generating the date;  defaults to I<local>
+#pod
+#pod = user_stash
+#pod the name of the stash where the user's name and email address can be found;
+#pod defaults to C<%User>
+#pod
+#pod =end :list
+#pod
+#pod The module allows the following sprintf-like format codes in the C<format>:
+#pod
+#pod =begin :list
+#pod
+#pod = C<%v>
+#pod The distribution version
+#pod
+#pod = C<%{-TRIAL}T>
+#pod Expands to -TRIAL (or any other supplied string) if this
+#pod is a trial release, or the empty string if not.  A bare C<%T> means
+#pod C<%{-TRIAL}T>.
+#pod
+#pod = C<%{-TRIAL}V>
+#pod Equivalent to C<%v%{-TRIAL}T>, to allow for the application of modifiers such
+#pod as space padding to the entire version string produced.
+#pod
+#pod = C<%{CLDR format}d>
+#pod The date of the release.  You can use any CLDR format supported by
+#pod L<DateTime>.  You must specify the format; there is no default.
+#pod
+#pod = C<%U>
+#pod The name of the user making this release (from C<user_stash>).
+#pod
+#pod = C<%E>
+#pod The email address of the user making this release (from C<user_stash>).
+#pod
+#pod = C<%n>
+#pod A newline
+#pod
+#pod = C<%t>
+#pod A tab
+#pod
+#pod =end :list
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<AutoVersion|Dist::Zilla::Plugin::AutoVersion>,
+#pod L<PkgVersion|Dist::Zilla::Plugin::PkgVersion>,
+#pod L<PodVersion|Dist::Zilla::Plugin::PodVersion>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<AfterRelease|Dist::Zilla::Plugin::AfterRelease>,
+#pod L<FileMunger|Dist::Zilla::Role::FileMunger>,
+#pod L<TextTemplate|Dist::Zilla::Role::TextTemplate>.
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::NextRelease - update the next release number in your changelog
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -290,7 +388,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::PkgDist;
-{
-  $Dist::Zilla::Plugin::PkgDist::VERSION = '4.300030';
-}
 # ABSTRACT: add a $DIST to your packages
+$Dist::Zilla::Plugin::PkgDist::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::FileMunger',
@@ -14,8 +12,23 @@ with(
 
 use namespace::autoclean;
 
-use PPI;
-
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will add a line like the following to each package in each Perl
+#pod module or program (more or less) within the distribution:
+#pod
+#pod   { our $DIST = 'My-CPAN-Dist'; } # where 'My-CPAN-Dist' is your dist name
+#pod
+#pod It will skip any package declaration that includes a newline between the
+#pod C<package> keyword and the package name, like:
+#pod
+#pod   package
+#pod     Foo::Bar;
+#pod
+#pod This sort of declaration is also ignored by the CPAN toolchain, and is
+#pod typically used when doing monkey patching or other tricky things.
+#pod
+#pod =cut
 
 sub munge_files {
   my ($self) = @_;
@@ -93,13 +106,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::PkgDist - add a $DIST to your packages
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -123,7 +138,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::PkgVersion;
-{
-  $Dist::Zilla::Plugin::PkgVersion::VERSION = '4.300030';
-}
 # ABSTRACT: add a $VERSION to your packages
+$Dist::Zilla::Plugin::PkgVersion::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::FileMunger',
@@ -12,11 +10,64 @@ with(
   'Dist::Zilla::Role::PPI',
 );
 
-use PPI;
-use MooseX::Types::Perl qw(LaxVersionStr);
-
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod in dist.ini
+#pod
+#pod   [PkgVersion]
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin will add lines like the following to each package in each Perl
+#pod module or program (more or less) within the distribution:
+#pod
+#pod   $MyModule::VERSION = 0.001;
+#pod
+#pod ...where 0.001 is the version of the dist, and MyModule is the name of the
+#pod package being given a version.  (In other words, it always uses fully-qualified
+#pod names to assign versions.)
+#pod
+#pod It will skip any package declaration that includes a newline between the
+#pod C<package> keyword and the package name, like:
+#pod
+#pod   package
+#pod     Foo::Bar;
+#pod
+#pod This sort of declaration is also ignored by the CPAN toolchain, and is
+#pod typically used when doing monkey patching or other tricky things.
+#pod
+#pod =attr die_on_existing_version
+#pod
+#pod If true, then when PkgVersion sees an existing C<$VERSION> assignment, it will
+#pod throw an exception rather than skip the file.  This attribute defaults to
+#pod false.
+#pod
+#pod =attr die_on_line_insertion
+#pod
+#pod By default, PkgVersion look for a blank line after each C<package> statement.
+#pod If it finds one, it inserts the C<$VERSION> assignment on that line.  If it
+#pod doesn't, it will insert a new line, which means the shipped copy of the module
+#pod will have different line numbers (off by one) than the source.  If
+#pod C<die_on_line_insertion> is true, PkgVersion will raise an exception rather
+#pod than insert a new line.
+#pod
+#pod =attr finder
+#pod
+#pod =for stopwords FileFinder
+#pod
+#pod This is the name of a L<FileFinder|Dist::Zilla::Role::FileFinder> for finding
+#pod modules to edit.  The default value is C<:InstallModules> and C<:ExecFiles>;
+#pod this option can be used more than once.
+#pod
+#pod Other predefined finders are listed in
+#pod L<Dist::Zilla::Role::FileFinderUser/default_finders>.
+#pod You can define your own with the
+#pod L<[FileFinder::ByName]|Dist::Zilla::Plugin::FileFinder::ByName> and
+#pod L<[FileFinder::Filter]|Dist::Zilla::Plugin::FileFinder::Filter> plugins.
+#pod
+#pod =cut
 
 sub munge_files {
   my ($self) = @_;
@@ -27,37 +78,57 @@ sub munge_files {
 sub munge_file {
   my ($self, $file) = @_;
 
-  # XXX: for test purposes, for now! evil! -- rjbs, 2010-03-17
-  return                          if $file->name    =~ /^corpus\//;
+  if ($file->is_bytes) {
+    $self->log_debug($file->name . " has 'bytes' encoding, skipping...");
+    return;
+  }
 
-  return                          if $file->name    =~ /\.t$/i;
-  return $self->munge_perl($file) if $file->name    =~ /\.(?:pm|pl)$/i;
-  return $self->munge_perl($file) if $file->content =~ /^#!(?:.*)perl(?:$|\s)/;
-  return;
+  return $self->munge_perl($file);
 }
 
+has die_on_existing_version => (
+  is  => 'ro',
+  isa => 'Bool',
+  default => 0,
+);
+
+has die_on_line_insertion => (
+  is  => 'ro',
+  isa => 'Bool',
+  default => 0,
+);
+
 sub munge_perl {
   my ($self, $file) = @_;
 
   my $version = $self->zilla->version;
 
+  require version;
   Carp::croak("invalid characters in version")
-    unless LaxVersionStr->check($version);
+    unless version::is_lax($version);
 
   my $document = $self->ppi_document_for_file($file);
 
   if ($self->document_assigns_to_variable($document, '$VERSION')) {
+    if ($self->die_on_existing_version) {
+      $self->log_fatal([ 'existing assignment to $VERSION in %s', $file->name ]);
+    }
+
     $self->log([ 'skipping %s: assigns to $VERSION', $file->name ]);
     return;
   }
 
-  return unless my $package_stmts = $document->find('PPI::Statement::Package');
+  my $package_stmts = $document->find('PPI::Statement::Package');
+  unless ($package_stmts) {
+    $self->log_debug([ 'skipping %s: no package statement found', $file->name ]);
+    return;
+  }
 
   my %seen_pkg;
 
+  my $munged = 0;
   for my $stmt (@$package_stmts) {
     my $package = $stmt->namespace;
-
     if ($seen_pkg{ $package }++) {
       $self->log([ 'skipping package re-declaration for %s', $package ]);
       next;
@@ -68,14 +139,17 @@ sub munge_perl {
       next;
     }
 
+    $self->log("non-ASCII package name is likely to cause problems")
+      if $package =~ /\P{ASCII}/;
+
+    $self->log("non-ASCII version is likely to cause problems")
+      if $version =~ /\P{ASCII}/;
+
     # the \x20 hack is here so that when we scan *this* document we don't find
     # an assignment to version; it shouldn't be needed, but it's been annoying
     # enough in the past that I'm keeping it here until tests are better
     my $trial = $self->zilla->is_trial ? ' # TRIAL' : '';
-    my $perl = "{\n  \$$package\::VERSION\x20=\x20'$version';$trial\n}\n";
-
-    my $version_doc = PPI::Document->new(\$perl);
-    my @children = $version_doc->schildren;
+    my $perl = "\$$package\::VERSION\x20=\x20'$version';$trial";
 
     $self->log_debug([
       'adding $VERSION assignment to %s in %s',
@@ -83,28 +157,90 @@ sub munge_perl {
       $file->name,
     ]);
 
-    Carp::carp("error inserting version in " . $file->name)
-      unless $stmt->insert_after($children[0]->clone)
-      and    $stmt->insert_after( PPI::Token::Whitespace->new("\n") );
+    my $blank;
+
+    {
+      my $curr = $stmt;
+      while (1) {
+        # avoid bogus locations due to insert_after
+        $document->flush_locations if $munged;
+        my $curr_line_number = $curr->line_number + 1;
+        my $find = $document->find(sub {
+          my $line = $_[1]->line_number;
+          return $line > $curr_line_number ? undef : $line == $curr_line_number;
+        });
+
+        last unless $find and @$find == 1;
+
+        if ($find->[0]->isa('PPI::Token::Comment')) {
+          $curr = $find->[0];
+          next;
+        }
+
+        if ("$find->[0]" =~ /\A\s*\z/) {
+          $blank = $find->[0];
+        }
+
+        last;
+      }
+    }
+
+    $perl = $blank ? "$perl\n" : "\n$perl";
+
+    # Why can't I use PPI::Token::Unknown? -- rjbs, 2014-01-11
+    my $bogus_token = PPI::Token::Comment->new($perl);
+
+    if ($blank) {
+      Carp::carp("error inserting version in " . $file->name)
+        unless $blank->insert_after($bogus_token);
+      $blank->delete;
+    } else {
+      my $method = $self->die_on_line_insertion ? 'log_fatal' : 'log';
+      $self->$method([
+        'no blank line for $VERSION after package %s statement on line %s',
+        $stmt->namespace,
+        $stmt->line_number,
+      ]);
+
+      Carp::carp("error inserting version in " . $file->name)
+        unless $stmt->insert_after($bogus_token);
+    }
+
+    $munged = 1;
   }
 
-  $self->save_ppi_document_to_file($document, $file);
+  $self->save_ppi_document_to_file($document, $file) if $munged;
 }
 
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<PodVersion|Dist::Zilla::Plugin::PodVersion>,
+#pod L<AutoVersion|Dist::Zilla::Plugin::AutoVersion>,
+#pod L<NextRelease|Dist::Zilla::Plugin::NextRelease>.
+#pod
+#pod Other Dist::Zilla plugins:
+#pod L<OurPkgVersion|Dist::Zilla::Plugin::OurPkgVersion> inserts version
+#pod numbers using C<our $VERSION = '...';> and without changing line numbers
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::PkgVersion - add a $VERSION to your packages
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -117,9 +253,7 @@ in dist.ini
 This plugin will add lines like the following to each package in each Perl
 module or program (more or less) within the distribution:
 
-  {
-    $MyModule::VERSION = 0.001;
-  }
+  $MyModule::VERSION = 0.001;
 
 ...where 0.001 is the version of the dist, and MyModule is the name of the
 package being given a version.  (In other words, it always uses fully-qualified
@@ -134,6 +268,37 @@ C<package> keyword and the package name, like:
 This sort of declaration is also ignored by the CPAN toolchain, and is
 typically used when doing monkey patching or other tricky things.
 
+=head1 ATTRIBUTES
+
+=head2 die_on_existing_version
+
+If true, then when PkgVersion sees an existing C<$VERSION> assignment, it will
+throw an exception rather than skip the file.  This attribute defaults to
+false.
+
+=head2 die_on_line_insertion
+
+By default, PkgVersion look for a blank line after each C<package> statement.
+If it finds one, it inserts the C<$VERSION> assignment on that line.  If it
+doesn't, it will insert a new line, which means the shipped copy of the module
+will have different line numbers (off by one) than the source.  If
+C<die_on_line_insertion> is true, PkgVersion will raise an exception rather
+than insert a new line.
+
+=head2 finder
+
+=for stopwords FileFinder
+
+This is the name of a L<FileFinder|Dist::Zilla::Role::FileFinder> for finding
+modules to edit.  The default value is C<:InstallModules> and C<:ExecFiles>;
+this option can be used more than once.
+
+Other predefined finders are listed in
+L<Dist::Zilla::Role::FileFinderUser/default_finders>.
+You can define your own with the
+L<[FileFinder::ByName]|Dist::Zilla::Plugin::FileFinder::ByName> and
+L<[FileFinder::Filter]|Dist::Zilla::Plugin::FileFinder::Filter> plugins.
+
 =head1 SEE ALSO
 
 Core Dist::Zilla plugins:
@@ -151,7 +316,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,29 @@
 package Dist::Zilla::Plugin::PodCoverageTests;
-{
-  $Dist::Zilla::Plugin::PodCoverageTests::VERSION = '4.300030';
-}
 # ABSTRACT: a release test for Pod coverage
+$Dist::Zilla::Plugin::PodCoverageTests::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Plugin::InlineFiles';
 with 'Dist::Zilla::Role::PrereqSource';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This is an extension of L<Dist::Zilla::Plugin::InlineFiles>, providing the
+#pod following files:
+#pod
+#pod   xt/release/pod-coverage.t - a standard Test::Pod::Coverage test
+#pod
+#pod This test uses L<Pod::Coverage::TrustPod> to check your Pod coverage.  This
+#pod means that to indicate that some subs should be treated as covered, even if no
+#pod documentation can be found, you can add:
+#pod
+#pod   =for Pod::Coverage sub_name other_sub this_one_too
+#pod
+#pod L<Test::Pod::Coverage> C<1.08> and L<Pod::Coverage::TrustPod> will be added as
+#pod C<develop requires> dependencies.
+#pod
+#pod =cut
 
 # Register the release test prereq as a "develop requires"
 # so it will be listed in "dzil listdeps --author"
@@ -30,13 +45,15 @@ __PACKAGE__->meta->make_immutable;
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::PodCoverageTests - a release test for Pod coverage
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -51,13 +68,16 @@ documentation can be found, you can add:
 
   =for Pod::Coverage sub_name other_sub this_one_too
 
+L<Test::Pod::Coverage> C<1.08> and L<Pod::Coverage::TrustPod> will be added as
+C<develop requires> dependencies.
+
 =head1 AUTHOR
 
 Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -67,15 +87,9 @@ the same terms as the Perl 5 programming language system itself.
 __DATA__
 ___[ xt/release/pod-coverage.t ]___
 #!perl
+# This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests.
 
-use Test::More;
-
-eval "use Test::Pod::Coverage 1.08";
-plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage"
-  if $@;
-
-eval "use Pod::Coverage::TrustPod";
-plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage"
-  if $@;
+use Test::Pod::Coverage 1.08;
+use Pod::Coverage::TrustPod;
 
 all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' });
@@ -1,14 +1,22 @@
 package Dist::Zilla::Plugin::PodSyntaxTests;
-{
-  $Dist::Zilla::Plugin::PodSyntaxTests::VERSION = '4.300030';
-}
 # ABSTRACT: a release test for Pod syntax
+$Dist::Zilla::Plugin::PodSyntaxTests::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Plugin::InlineFiles';
 with 'Dist::Zilla::Role::PrereqSource';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This is an extension of L<Dist::Zilla::Plugin::InlineFiles>, providing the
+#pod following files:
+#pod
+#pod   xt/release/pod-syntax.t   - a standard Test::Pod test
+#pod
+#pod L<Test::Pod> C<1.41> will be added as a C<develop requires> dependency.
+#pod
+#pod =cut
 
 
 # Register the release test prereq as a "develop requires"
@@ -31,13 +39,15 @@ __PACKAGE__->meta->make_immutable;
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::PodSyntaxTests - a release test for Pod syntax
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -54,7 +64,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -64,9 +74,8 @@ the same terms as the Perl 5 programming language system itself.
 __DATA__
 ___[ xt/release/pod-syntax.t ]___
 #!perl
+# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests.
 use Test::More;
-
-eval "use Test::Pod 1.41";
-plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
+use Test::Pod 1.41;
 
 all_pod_files_ok();
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::PodVersion;
-{
-  $Dist::Zilla::Plugin::PodVersion::VERSION = '4.300030';
-}
 # ABSTRACT: add a VERSION head1 to each Perl document
+$Dist::Zilla::Plugin::PodVersion::VERSION = '5.025';
 use Moose;
 with(
   'Dist::Zilla::Role::FileMunger',
@@ -13,6 +11,14 @@ with(
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin adds a C<=head1 VERSION> section to most perl files in the
+#pod distribution, indicating the version of the dist being built.  This section is
+#pod added after C<=head1 NAME>.  If there is no such section, the version section
+#pod will not be added.
+#pod
+#pod =cut
 
 sub munge_files {
   my ($self) = @_;
@@ -43,7 +49,7 @@ sub munge_pod {
     $_++; # move past the =head1 line itself
     $_++ while $content[$_] =~ /^\s*$/;
 
-    $_++; # move past the line with the abstract
+    $_++ while $content[$_] !~ /^\s*$/; # move past the abstract
     $_++ while $content[$_] =~ /^\s*$/;
 
     splice @content, $_ - 1, 0, (
@@ -70,17 +76,28 @@ sub munge_pod {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<PkgVersion|Dist::Zilla::Plugin::PkgVersion>,
+#pod L<AutoVersion|Dist::Zilla::Plugin::AutoVersion>,
+#pod L<NextRelease|Dist::Zilla::Plugin::NextRelease>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::PodVersion - add a VERSION head1 to each Perl document
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -102,7 +119,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,21 @@
 package Dist::Zilla::Plugin::Prereq;
-{
-  $Dist::Zilla::Plugin::Prereq::VERSION = '4.300030';
-}
 # ABSTRACT: (DEPRECATED) the old name of the Prereqs plugin
+$Dist::Zilla::Plugin::Prereq::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Plugin::Prereqs';
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod This plugin extends C<[Prereqs]> and adds nothing.  It is the old name for
+#pod Prereqs, and will be removed in a few versions.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla plugins: L<Prereqs|Dist::Zilla::Plugin::Prereqs>.
+#pod
+#pod =cut
 
 before register_component => sub {
   die "[Prereq] is incompatible with Dist::Zilla >= v5; replace it with [Prereqs] (note the
@@ -23,13 +31,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::Prereq - (DEPRECATED) the old name of the Prereqs plugin
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -46,7 +56,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,88 @@
 package Dist::Zilla::Plugin::Prereqs;
-{
-  $Dist::Zilla::Plugin::Prereqs::VERSION = '4.300030';
-}
 # ABSTRACT: list simple prerequisites
+$Dist::Zilla::Plugin::Prereqs::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::PrereqSource';
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [Prereqs]
+#pod   Foo::Bar = 1.002
+#pod   MRO::Compat = 10
+#pod   Sub::Exporter = 0
+#pod
+#pod You can specify requirements for different phases and relationships with:
+#pod
+#pod   [Prereqs]
+#pod   -phase = test
+#pod   -relationship = recommends
+#pod
+#pod   Fitz::Fotz    = 1.23
+#pod   Text::SoundEx = 3
+#pod
+#pod Remember that if you load two Prereqs plugins, each will needs its own name,
+#pod added like this:
+#pod
+#pod   [Prereqs / PluginName]
+#pod   -phase = test
+#pod   -relationship = recommends
+#pod
+#pod   Fitz::Fotz    = 1.23
+#pod   Text::SoundEx = 3
+#pod
+#pod If the name is the CamelCase concatenation of a phase and relationship
+#pod (or just a relationship), it will set those parameters implicitly.  If
+#pod you use a custom name, but it does not specify the relationship, and
+#pod you didn't specify either C<-phase> or C<-relationship>, it throws the
+#pod error C<No -phase or -relationship specified>.  This is to prevent a
+#pod typo that makes the name meaningless from slipping by unnoticed.
+#pod
+#pod The example below is equivalent to the example above, except for the name of
+#pod the resulting plugin:
+#pod
+#pod   [Prereqs / TestRecommends]
+#pod   Fitz::Fotz    = 1.23
+#pod   Text::SoundEx = 3
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This module adds "fixed" prerequisites to your distribution.  These are prereqs
+#pod with a known, fixed minimum version that doesn't change based on platform or
+#pod other conditions.
+#pod
+#pod You can specify prerequisites for different phases and kinds of relationships.
+#pod In C<RuntimeRequires>, the phase is Runtime and the relationship is Requires.
+#pod These are described in more detail in the L<CPAN::Meta
+#pod specification|CPAN::Meta::Spec/PREREQUISITES>.
+#pod
+#pod The phases are:
+#pod
+#pod =for :list
+#pod * configure
+#pod * build
+#pod * test
+#pod * runtime
+#pod * develop
+#pod
+#pod The relationship types are:
+#pod
+#pod =for :list
+#pod * requires
+#pod * recommends
+#pod * suggests
+#pod * conflicts
+#pod
+#pod If the phase is omitted, it will default to I<runtime>; thus, specifying
+#pod "Prereqs / Recommends" in your dist.ini is equivalent to I<RuntimeRecommends>.
+#pod
+#pod Not all of these phases are useful for all tools, especially tools that only
+#pod understand version 1.x CPAN::Meta files.
+#pod
+#pod =cut
 
 has prereq_phase => (
   is   => 'ro',
@@ -67,6 +142,7 @@ sub BUILDARGS {
 
   # Handle magic plugin names:
   unless (($other{phase} and $other{type})
+            # plugin comes from a bundle
           or $name =~ m! (?: \A | / ) Prereqs? \z !x) {
 
     my ($phase, $type) = $name =~ /\A
@@ -107,17 +183,37 @@ sub register_prereqs {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod =over 4
+#pod
+#pod =item *
+#pod
+#pod Core Dist::Zilla plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<AutoPrereqs|Dist::Zilla::Plugin::AutoPrereqs>.
+#pod
+#pod =item *
+#pod
+#pod The CPAN Meta specification: L<CPAN::Meta/PREREQUISITES>.
+#pod
+#pod =back
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::Prereqs - list simple prerequisites
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -164,7 +260,7 @@ the resulting plugin:
 =head1 DESCRIPTION
 
 This module adds "fixed" prerequisites to your distribution.  These are prereqs
-with a known, fixed minimum version that doens't change based on platform or
+with a known, fixed minimum version that doesn't change based on platform or
 other conditions.
 
 You can specify prerequisites for different phases and kinds of relationships.
@@ -248,7 +344,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::PruneCruft;
-{
-  $Dist::Zilla::Plugin::PruneCruft::VERSION = '4.300030';
-}
 # ABSTRACT: prune stuff that you probably don't mean to include
+$Dist::Zilla::Plugin::PruneCruft::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 use Moose::Util::TypeConstraints;
@@ -10,6 +8,34 @@ with 'Dist::Zilla::Role::FilePruner';
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod This plugin tries to compensate for the stupid crap that turns up in your
+#pod working copy, removing it before it gets into your dist and screws everything
+#pod up.
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [PruneCruft]
+#pod
+#pod If you would like to exclude certain exclusions, use the C<except> option (it
+#pod can be specified multiple times):
+#pod
+#pod   [PruneCruft]
+#pod   except = \.gitignore
+#pod   except = t/.*/\.keep$
+#pod
+#pod This plugin is included in the L<@Basic|Dist::Zilla::PluginBundle::Basic>
+#pod bundle.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla plugins:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<PruneFiles|Dist::Zilla::Plugin::PruneFiles>,
+#pod L<ManifestSkip|Dist::Zilla::Plugin::ManifestSkip>.
+#pod
+#pod =cut
 
 {
   my $type = subtype as 'ArrayRef[RegexpRef]';
@@ -38,12 +64,16 @@ sub exclude_file {
   return 1 if index($file->name, $self->zilla->name . '-') == 0;
   return 1 if $file->name =~ /\A\./;
   return 1 if $file->name =~ /\A(?:Build|Makefile)\z/;
+  return 1 if $file->name eq 'Makefile.old';
   return 1 if $file->name =~ /\Ablib/;
   return 1 if $file->name =~ /\.(?:o|bs)$/;
   return 1 if $file->name =~ /\A_Inline/;
   return 1 if $file->name eq 'MYMETA.yml';
   return 1 if $file->name eq 'MYMETA.json';
   return 1 if $file->name eq 'pm_to_blib';
+  # Avoid bundling fatlib/ dir created by App::FatPacker
+  # https://github.com/andk/pause/pull/65
+  return 1 if substr($file->name, 0, 7) eq 'fatlib/';
 
   if ((my $file = $file->name) =~ s/\.c$//) {
       for my $other ($self->zilla->files->flatten) {
@@ -75,13 +105,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::PruneCruft - prune stuff that you probably don't mean to include
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -116,7 +148,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,18 +1,41 @@
 package Dist::Zilla::Plugin::PruneFiles;
-{
-  $Dist::Zilla::Plugin::PruneFiles::VERSION = '4.300030';
-}
-# ABSTRACT: prune arbirary files from the dist
+# ABSTRACT: prune arbitrary files from the dist
+$Dist::Zilla::Plugin::PruneFiles::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with 'Dist::Zilla::Role::FilePruner';
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod This plugin allows you to explicitly prune some files from your
+#pod distribution. You can either specify the exact set of files (with the
+#pod "filenames" parameter) or provide the regular expressions to
+#pod check (using "match").
+#pod
+#pod This is useful if another plugin (maybe a FileGatherer) adds a
+#pod bunch of files, and you only want a subset of them.
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [PruneFiles]
+#pod   filename = xt/release/pod-coverage.t ; pod coverage tests are for jerks
+#pod   filename = todo-list.txt             ; keep our secret plans to ourselves
+#pod
+#pod   match     = ^test_data/
+#pod   match     = ^test.cvs$
+#pod
+#pod =cut
 
 sub mvp_multivalue_args { qw(filenames matches) }
 sub mvp_aliases { return { filename => 'filenames', match => 'matches' } }
 
+#pod =attr filenames
+#pod
+#pod This is an arrayref of filenames to be pruned from the distribution.
+#pod
+#pod =cut
 
 has filenames => (
   is   => 'ro',
@@ -20,6 +43,12 @@ has filenames => (
   default => sub { [] },
 );
 
+#pod =attr matches
+#pod
+#pod This is an arrayref of regular expressions and files matching any of them,
+#pod will be pruned from the distribution.
+#pod
+#pod =cut
 
 has matches => (
   is   => 'ro',
@@ -52,17 +81,28 @@ sub prune_files {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla plugins:
+#pod L<PruneCruft|Dist::Zilla::Plugin::PruneCruft>,
+#pod L<GatherDir|Dist::Zilla::Plugin::GatherDir>,
+#pod L<ManifestSkip|Dist::Zilla::Plugin::ManifestSkip>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
-Dist::Zilla::Plugin::PruneFiles - prune arbirary files from the dist
+Dist::Zilla::Plugin::PruneFiles - prune arbitrary files from the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -80,7 +120,7 @@ In your F<dist.ini>:
   filename = xt/release/pod-coverage.t ; pod coverage tests are for jerks
   filename = todo-list.txt             ; keep our secret plans to ourselves
 
-  match     = ^test_data/*
+  match     = ^test_data/
   match     = ^test.cvs$
 
 =head1 ATTRIBUTES
@@ -107,7 +147,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,26 @@
 package Dist::Zilla::Plugin::Readme;
-{
-  $Dist::Zilla::Plugin::Readme::VERSION = '4.300030';
-}
 # ABSTRACT: build a README file
+$Dist::Zilla::Plugin::Readme::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
-with qw/Dist::Zilla::Role::FileGatherer Dist::Zilla::Role::TextTemplate/;
+with qw/Dist::Zilla::Role::FileGatherer
+    Dist::Zilla::Role::TextTemplate
+    Dist::Zilla::Role::FileMunger/;
 
+use Moose::Util::TypeConstraints;
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin adds a very simple F<README> file to the distribution, citing the
+#pod dist's name, version, abstract, and license.  It may be more useful or
+#pod informative in the future.
+#pod
+#pod =cut
+
+has _file_obj => (
+  is => 'rw', isa => role_type('Dist::Zilla::Role::File'),
+);
 
 sub gather_files {
   my ($self, $arg) = @_;
@@ -24,19 +36,38 @@ version {{ $dist->version }}:
 
 {{ $dist->license->notice }}
 
+This README file was generated by {{ $generated_by }}.
+
 |;
 
-  my $content = $self->fill_in_string(
-    $template,
-    { dist => \($self->zilla) },
+  $self->add_file(
+    $self->_file_obj(
+      Dist::Zilla::File::InMemory->new(
+        name => 'README',
+        content => $template,
+      )
+    )
   );
 
-  my $file = Dist::Zilla::File::InMemory->new({
-    content => $content,
-    name    => 'README',
-  });
+  return;
+}
+
+sub munge_files {
+  my $self = shift;
+
+  my $file = $self->_file_obj;
+
+  $file->content(
+    $self->fill_in_string(
+      $file->content,
+      {
+        dist => \($self->zilla),
+        generated_by => \sprintf("%s v%s",
+                          ref($self), $self->VERSION || '(dev)'),
+      }
+    )
+  );
 
-  $self->add_file($file);
   return;
 }
 
@@ -47,13 +78,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::Readme - build a README file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -67,7 +100,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Plugin::RemovePrereqs;
-{
-  $Dist::Zilla::Plugin::RemovePrereqs::VERSION = '4.300030';
-}
 # ABSTRACT: a plugin to remove gathered prereqs
+$Dist::Zilla::Plugin::RemovePrereqs::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::PrereqSource';
 
@@ -13,6 +11,24 @@ use Moose::Autobox;
 use MooseX::Types::Moose qw(ArrayRef);
 use MooseX::Types::Perl  qw(ModuleName);
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [RemovePrereqs]
+#pod   remove = Foo::Bar
+#pod   remove = MRO::Compat
+#pod
+#pod This will remove any prerequisite of any type from any prereq phase.  This is
+#pod useful for eliminating incorrectly detected prereqs.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Dist::Zilla plugins:
+#pod L<Prereqs|Dist::Zilla::Plugin::Prereqs>,
+#pod L<AutoPrereqs|Dist::Zilla::Plugin::AutoPrereqs>.
+#pod
+#pod =cut
 
 sub mvp_multivalue_args { qw(modules_to_remove) }
 
@@ -63,13 +79,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::RemovePrereqs - a plugin to remove gathered prereqs
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -94,7 +112,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,22 @@
 package Dist::Zilla::Plugin::ShareDir;
-{
-  $Dist::Zilla::Plugin::ShareDir::VERSION = '4.300030';
-}
 # ABSTRACT: install a directory's contents as "ShareDir" content
+$Dist::Zilla::Plugin::ShareDir::VERSION = '5.025';
 use Moose;
 
 use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [ShareDir]
+#pod   dir = share
+#pod
+#pod If no C<dir> is provided, the default is F<share>.
+#pod
+#pod =cut
 
 has dir => (
   is   => 'ro',
@@ -39,13 +47,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::ShareDir - install a directory's contents as "ShareDir" content
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -54,7 +64,7 @@ In your F<dist.ini>:
   [ShareDir]
   dir = share
 
-  If no C<dir> is provided, the default is F<share>.
+If no C<dir> is provided, the default is F<share>.
 
 =head1 AUTHOR
 
@@ -62,7 +72,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,21 +1,63 @@
 package Dist::Zilla::Plugin::TemplateModule;
-{
-  $Dist::Zilla::Plugin::TemplateModule::VERSION = '4.300030';
-}
 # ABSTRACT: a simple module-from-template plugin
+$Dist::Zilla::Plugin::TemplateModule::VERSION = '5.025';
 use Moose;
 with qw(Dist::Zilla::Role::ModuleMaker Dist::Zilla::Role::TextTemplate);
 
+use Path::Tiny;
+
 use namespace::autoclean;
 
 use autodie;
 
 use Sub::Exporter::ForMethods;
-use Data::Section 0.004 # fixed header_re
+use Data::Section 0.200002 # encoding and bytes
   { installer => Sub::Exporter::ForMethods::method_installer },
   '-setup';
 use Dist::Zilla::File::InMemory;
 
+#pod =head1 MINTING CONFIGURATION
+#pod
+#pod This module is part of the standard configuration of the default L<Dist::Zilla>
+#pod Minting Profile, and all profiles that don't set a custom ':DefaultModuleMaker'
+#pod so you don't need to normally do anything to configure it.
+#pod
+#pod   dzil new Some::Module
+#pod   # creates ./Some-Module/*
+#pod   # creates ./Some-Module/lib/Some/Module.pm
+#pod
+#pod However, for those who wish to configure this ( or any subclasses ) this is
+#pod presently required:
+#pod
+#pod   [TemplateModule / :DefaultModuleMaker]
+#pod   ; template  = SomeFile.pm
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This is a L<ModuleMaker|Dist::Zilla::Role::ModuleMaker> used for creating new
+#pod Perl modules files when minting a new dist with C<dzil new>.  It uses
+#pod L<Text::Template> (via L<Dist::Zilla::Role::TextTemplate>) to render a template
+#pod into a Perl module.  The template is given two variables for use in rendering:
+#pod C<$name>, the module name; and C<$dist>, the Dist::Zilla object.  The module is
+#pod always created as a file under F<./lib>.
+#pod
+#pod By default, the template looks something like this:
+#pod
+#pod   use strict;
+#pod   use warnings;
+#pod   package {{ $name }};
+#pod
+#pod   1;
+#pod
+#pod =attr template
+#pod
+#pod The C<template> parameter may be given to the plugin to provide a different
+#pod filename, absolute or relative to the build/profile directory.
+#pod
+#pod If this parameter is not specified, this module will use the boilerplate module
+#pod template included in this module.
+#pod
+#pod =cut
 
 has template => (
   is  => 'ro',
@@ -29,11 +71,7 @@ sub make_module {
   my $template;
 
   if ($self->has_template) {
-    open my $fh, '<', $self->template;
-
-    # Win32
-    binmode $fh, ':raw';
-    $template = do { local $/; <$fh> };
+    $template = path( $self->template )->slurp_utf8;
   } else {
     $template = ${ $self->section_data('Module.pm') };
   }
@@ -61,13 +99,15 @@ __PACKAGE__->meta->make_immutable;
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::TemplateModule - a simple module-from-template plugin
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -118,7 +158,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,27 @@
 package Dist::Zilla::Plugin::TestRelease;
-{
-  $Dist::Zilla::Plugin::TestRelease::VERSION = '4.300030';
-}
+# ABSTRACT: extract archive and run tests before releasing the dist
+$Dist::Zilla::Plugin::TestRelease::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::BeforeRelease';
-# ABSTRACT: extract archive and run tests before releasing the dist
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin runs before a release happens.  It will extract the to-be-released
+#pod archive into a temporary directory and use the TestRunner plugins to run its
+#pod tests.  If the tests fail, the release is aborted and the temporary directory
+#pod is left in place.  If the tests pass, the temporary directory is cleaned up and
+#pod the release process continues.
+#pod
+#pod This will set the RELEASE_TESTING and AUTHOR_TESTING env vars while running the
+#pod test suite.
+#pod
+#pod =head1 CREDITS
+#pod
+#pod This plugin was originally contributed by Christopher J. Madsen.
+#pod
+#pod =cut
 
 use File::pushd ();
 use Moose::Autobox;
@@ -52,13 +66,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::TestRelease - extract archive and run tests before releasing the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -81,7 +97,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,9 @@
 package Dist::Zilla::Plugin::UploadToCPAN;
-{
-  $Dist::Zilla::Plugin::UploadToCPAN::VERSION = '4.300030';
-}
 # ABSTRACT: upload the dist to CPAN
+$Dist::Zilla::Plugin::UploadToCPAN::VERSION = '5.025';
 use Moose;
 with qw(Dist::Zilla::Role::BeforeRelease Dist::Zilla::Role::Releaser);
 
-use CPAN::Uploader 0.101550; # ua string
-use File::HomeDir;
 use File::Spec;
 use Moose::Util::TypeConstraints;
 use Scalar::Util qw(weaken);
@@ -15,11 +11,36 @@ use Try::Tiny;
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod If loaded, this plugin will allow the F<release> command to upload to the CPAN.
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin looks for configuration in your C<dist.ini> or (more
+#pod likely) C<~/.dzil/config.ini>:
+#pod
+#pod   [%PAUSE]
+#pod   username = YOUR-PAUSE-ID
+#pod   password = YOUR-PAUSE-PASSWORD
+#pod
+#pod If this configuration does not exist, it can read the configuration from
+#pod C<~/.pause>, in the same format that L<cpan-upload> requires:
+#pod
+#pod   user YOUR-PAUSE-ID
+#pod   password YOUR-PAUSE-PASSWORD
+#pod
+#pod If neither configuration exists, it will prompt you to enter your
+#pod username and password during the BeforeRelease phase.  Entering a
+#pod blank username or password will abort the release.
+#pod
+#pod =cut
 
 {
   package
     Dist::Zilla::Plugin::UploadToCPAN::_Uploader;
-  use parent 'CPAN::Uploader';
+  # CPAN::Uploader will be loaded later if used
+  our @ISA = 'CPAN::Uploader';
   # Report CPAN::Uploader's version, not ours:
   sub _ua_string { CPAN::Uploader->_ua_string }
 
@@ -54,6 +75,12 @@ sub mvp_aliases {
   return { user => 'username' };
 }
 
+#pod =attr username
+#pod
+#pod This option supplies the user's PAUSE username.  If not supplied, it will be
+#pod looked for in the user's PAUSE configuration.
+#pod
+#pod =cut
 
 has username => (
   is   => 'ro',
@@ -68,6 +95,12 @@ has username => (
   },
 );
 
+#pod =attr password
+#pod
+#pod This option supplies the user's PAUSE password.  If not supplied, it will be
+#pod looked for in the user's PAUSE configuration.
+#pod
+#pod =cut
 
 has password => (
   is   => 'ro',
@@ -82,15 +115,42 @@ has password => (
   },
 );
 
+#pod =attr pause_cfg_file
+#pod
+#pod This is the name of the file containing your pause credentials.  It defaults
+#pod F<.pause>.  If you give a relative path, it is taken to be relative to
+#pod L</pause_cfg_dir>.
+#pod
+#pod =cut
+
 has pause_cfg_file => (
   is      => 'ro',
   isa     => 'Str',
   lazy    => 1,
-  default => sub {
-    File::Spec->catfile(File::HomeDir->my_home, '.pause');
-  },
+  default => sub { '.pause' },
+);
+
+#pod =attr pause_cfg_dir
+#pod
+#pod This is the directory for resolving a relative L</pause_cfg_file>.
+#pod It defaults to C<< File::HomeDir->my_home >>.
+#pod
+#pod =cut
+
+has pause_cfg_dir => (
+  is      => 'ro',
+  isa     => 'Str',
+  lazy    => 1,
+  default => sub { require File::HomeDir; File::HomeDir::->my_home },
 );
 
+#pod =attr pause_cfg
+#pod
+#pod This is a hashref of defaults loaded from F<~/.pause> -- this attribute is
+#pod subject to removal in future versions, as the config-loading behavior in
+#pod CPAN::Uploader is improved.
+#pod
+#pod =cut
 
 has pause_cfg => (
   is      => 'ro',
@@ -98,20 +158,25 @@ has pause_cfg => (
   lazy    => 1,
   default => sub {
     my $self = shift;
-    open my $fh, '<', $self->pause_cfg_file
-      or return {};
-    my %ret;
-    # basically taken from the parsing code used by cpan-upload
-    # (maybe this should be part of the CPAN::Uploader api?)
-    while (<$fh>) {
-      next if /^\s*(?:#.*)?$/;
-      my ($k, $v) = /^\s*(\w+)\s+(.+)$/;
-      $ret{$k} = $v;
-    }
-    return \%ret;
+    require CPAN::Uploader;
+    my $file = $self->pause_cfg_file;
+    $file = File::Spec->catfile($self->pause_cfg_dir, $file)
+      unless File::Spec->file_name_is_absolute($file);
+    my $cfg = try {
+      CPAN::Uploader->read_config_file($file)
+    } catch {
+      {};
+    };
+    return $cfg;
   },
 );
 
+#pod =attr subdir
+#pod
+#pod If given, this specifies a subdirectory under the user's home directory to
+#pod which to upload.  Using this option is not recommended.
+#pod
+#pod =cut
 
 has subdir => (
     is        => 'ro',
@@ -119,6 +184,13 @@ has subdir => (
     predicate => 'has_subdir',
 );
 
+#pod =attr upload_uri
+#pod
+#pod If given, this specifies an alternate URI for the PAUSE upload form.  By
+#pod default, the default supplied by L<CPAN::Uploader> is used.  Using this option
+#pod is not recommended in most cases.
+#pod
+#pod =cut
 
 has upload_uri => (
   is => 'ro',
@@ -133,6 +205,10 @@ has uploader => (
   default => sub {
     my ($self) = @_;
 
+    # Load the module lazily
+    require CPAN::Uploader;
+    CPAN::Uploader->VERSION('0.103004');  # require HTTPS
+
     my $uploader = Dist::Zilla::Plugin::UploadToCPAN::_Uploader->new({
       user     => $self->username,
       password => $self->password,
@@ -177,13 +253,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Plugin::UploadToCPAN - upload the dist to CPAN
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -220,6 +298,17 @@ looked for in the user's PAUSE configuration.
 This option supplies the user's PAUSE password.  If not supplied, it will be
 looked for in the user's PAUSE configuration.
 
+=head2 pause_cfg_file
+
+This is the name of the file containing your pause credentials.  It defaults
+F<.pause>.  If you give a relative path, it is taken to be relative to
+L</pause_cfg_dir>.
+
+=head2 pause_cfg_dir
+
+This is the directory for resolving a relative L</pause_cfg_file>.
+It defaults to C<< File::HomeDir->my_home >>.
+
 =head2 pause_cfg
 
 This is a hashref of defaults loaded from F<~/.pause> -- this attribute is
@@ -243,7 +332,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::PluginBundle::Basic;
-{
-  $Dist::Zilla::PluginBundle::Basic::VERSION = '4.300030';
-}
 # ABSTRACT: the basic plugins to maintain and release CPAN dists
+$Dist::Zilla::PluginBundle::Basic::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::PluginBundle::Easy';
 
@@ -34,17 +32,53 @@ sub configure {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin is meant to be a basic "first step" bundle for using Dist::Zilla.
+#pod It won't munge any of your code, but will generate a F<Makefile.PL> and allows
+#pod easy, reliable releasing of distributions.
+#pod
+#pod It includes the following plugins with their default configuration:
+#pod
+#pod =for :list
+#pod * L<Dist::Zilla::Plugin::GatherDir>
+#pod * L<Dist::Zilla::Plugin::PruneCruft>
+#pod * L<Dist::Zilla::Plugin::ManifestSkip>
+#pod * L<Dist::Zilla::Plugin::MetaYAML>
+#pod * L<Dist::Zilla::Plugin::License>
+#pod * L<Dist::Zilla::Plugin::Readme>
+#pod * L<Dist::Zilla::Plugin::ExtraTests>
+#pod * L<Dist::Zilla::Plugin::ExecDir>
+#pod * L<Dist::Zilla::Plugin::ShareDir>
+#pod * L<Dist::Zilla::Plugin::MakeMaker>
+#pod * L<Dist::Zilla::Plugin::Manifest>
+#pod * L<Dist::Zilla::Plugin::TestRelease>
+#pod * L<Dist::Zilla::Plugin::ConfirmRelease>
+#pod * L<Dist::Zilla::Plugin::UploadToCPAN>
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins: L<@Filter|Dist::Zilla::PluginBundle::Filter>.
+#pod
+#pod Dist::Zilla roles:
+#pod L<PluginBundle|Dist::Zilla::Role::PluginBundle>,
+#pod L<PluginBundle::Easy|Dist::Zilla::Role::PluginBundle::Easy>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::PluginBundle::Basic - the basic plugins to maintain and release CPAN dists
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -128,7 +162,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::PluginBundle::Classic;
-{
-  $Dist::Zilla::PluginBundle::Classic::VERSION = '4.300030';
-}
 # ABSTRACT: the classic (old) default configuration for Dist::Zilla
+$Dist::Zilla::PluginBundle::Classic::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::PluginBundle::Easy';
 
@@ -37,17 +35,55 @@ sub configure {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This bundle is more or less the original configuration bundled with
+#pod Dist::Zilla.  More than likely, you'd rather be using
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic> or a more complex bundle.  This one
+#pod will muck around with your code by adding C<$VERSION> declarations and will
+#pod mess with you Pod by adding a C<=head1 VERSION> section, but it won't get you a
+#pod lot of more useful features like autoversioning, autoprereqs, or Pod::Weaver.
+#pod
+#pod It includes the following plugins with their default configuration:
+#pod
+#pod =for :list
+#pod * L<Dist::Zilla::Plugin::GatherDir>
+#pod * L<Dist::Zilla::Plugin::PruneCruft>
+#pod * L<Dist::Zilla::Plugin::ManifestSkip>
+#pod * L<Dist::Zilla::Plugin::MetaYAML>
+#pod * L<Dist::Zilla::Plugin::License>
+#pod * L<Dist::Zilla::Plugin::Readme>
+#pod * L<Dist::Zilla::Plugin::PkgVersion>
+#pod * L<Dist::Zilla::Plugin::PodVersion>
+#pod * L<Dist::Zilla::Plugin::PodCoverageTests>
+#pod * L<Dist::Zilla::Plugin::PodSyntaxTests>
+#pod * L<Dist::Zilla::Plugin::ExtraTests>
+#pod * L<Dist::Zilla::Plugin::ExecDir>
+#pod * L<Dist::Zilla::Plugin::ShareDir>
+#pod * L<Dist::Zilla::Plugin::MakeMaker>
+#pod * L<Dist::Zilla::Plugin::Manifest>
+#pod * L<Dist::Zilla::Plugin::ConfirmRelease>
+#pod * L<Dist::Zilla::Plugin::UploadToCPAN>
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::PluginBundle::Classic - the classic (old) default configuration for Dist::Zilla
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -142,7 +178,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::PluginBundle::FakeClassic;
-{
-  $Dist::Zilla::PluginBundle::FakeClassic::VERSION = '4.300030';
-}
 # ABSTRACT: build something more or less like a "classic" CPAN dist
+$Dist::Zilla::PluginBundle::FakeClassic::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::PluginBundle::Classic';
 
@@ -36,13 +34,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::PluginBundle::FakeClassic - build something more or less like a "classic" CPAN dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -50,7 +50,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,16 +1,43 @@
 package Dist::Zilla::PluginBundle::Filter;
-{
-  $Dist::Zilla::PluginBundle::Filter::VERSION = '4.300030';
-}
 # ABSTRACT: use another bundle, with some plugins removed
+$Dist::Zilla::PluginBundle::Filter::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 with 'Dist::Zilla::Role::PluginBundle';
 
 use namespace::autoclean;
 
+use Class::Load qw(try_load_class);
 use Dist::Zilla::Util;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod In your F<dist.ini>:
+#pod
+#pod   [@Filter]
+#pod   -bundle = @Basic
+#pod   -remove = ShareDir
+#pod   -remove = UploadToCPAN
+#pod   option = for_basic
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This plugin bundle actually wraps and modifies another plugin bundle.  It
+#pod includes all the configuration for the bundle named in the C<-bundle> attribute,
+#pod but removes all the entries whose package is given in the C<-remove> attributes.
+#pod
+#pod Options not prefixed with C<-> will be passed to the bundle to be filtered.
+#pod
+#pod B<NOTE:> When you filter a bundle you B<SHOULD NOT> include it directly in
+#pod your C<dist.ini> file. This plugin will take care of including it for you.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins: L<@Basic|Dist::Zilla::PluginBundle::Basic>.
+#pod
+#pod Dist::Zilla roles: L<PluginBundle|Dist::Zilla::Role::PluginBundle>.
+#pod
+#pod =cut
 
 sub mvp_multivalue_args { qw(remove -remove) }
 
@@ -33,18 +60,21 @@ sub bundle_config {
   Carp::croak("no bundle given for bundle filter")
     unless my $bundle = $config->{filter}->{bundle};
 
-  $bundle = Dist::Zilla::Util->expand_config_package_name($bundle);
+  my $pkg = Dist::Zilla::Util->expand_config_package_name($bundle);
 
   my $load_opts = {};
   if( my $v = $config->{filter}->{version} ){
     $load_opts->{'-version'} = $v;
   }
 
-  Class::MOP::load_class($bundle, $load_opts);
+  unless (try_load_class($pkg, $load_opts)) {
+    # XXX Naughty! -- rjbs, 2013-07-23
+    Config::MVP::Section->missing_package($pkg, $bundle);
+  }
 
-  my @plugins = $bundle->bundle_config({
+  my @plugins = $pkg->bundle_config({
     name    => $section->{name}, # not 100% sure about this -- rjbs, 2010-03-06
-    package => $bundle,
+    package => $pkg,
     payload => $config->{bundle} || {},
   });
 
@@ -67,13 +97,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::PluginBundle::Filter - use another bundle, with some plugins removed
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -93,6 +125,9 @@ but removes all the entries whose package is given in the C<-remove> attributes.
 
 Options not prefixed with C<-> will be passed to the bundle to be filtered.
 
+B<NOTE:> When you filter a bundle you B<SHOULD NOT> include it directly in
+your C<dist.ini> file. This plugin will take care of including it for you.
+
 =head1 SEE ALSO
 
 Core Dist::Zilla plugins: L<@Basic|Dist::Zilla::PluginBundle::Basic>.
@@ -105,7 +140,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,20 +1,39 @@
 package Dist::Zilla::Prereqs;
-{
-  $Dist::Zilla::Prereqs::VERSION = '4.300030';
-}
 # ABSTRACT: the prerequisites of a Dist::Zilla distribution
+$Dist::Zilla::Prereqs::VERSION = '5.025';
 use Moose;
 use Moose::Autobox;
 use MooseX::Types::Moose qw(Bool HashRef);
 
 use CPAN::Meta::Prereqs 2.120630; # add_string_requirement
-use Hash::Merge::Simple ();
 use Path::Class ();
 use String::RewritePrefix;
 use CPAN::Meta::Requirements 2.121; # requirements_for_module
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Dist::Zilla::Prereqs is a subcomponent of Dist::Zilla.  The C<prereqs>
+#pod attribute on your Dist::Zilla object is a Dist::Zilla::Prereqs object, and is
+#pod responsible for keeping track of the distribution's prerequisites.
+#pod
+#pod In fact, a Dist::Zilla::Prereqs object is just a thin layer over a
+#pod L<CPAN::Meta::Prereqs> object, stored in the C<cpan_meta_prereqs> attribute.
+#pod
+#pod Almost everything this object does is proxied to the CPAN::Meta::Prereqs
+#pod object, so you should really read how I<that> works.
+#pod
+#pod Dist::Zilla::Prereqs proxies the following methods to the CPAN::Meta::Prereqs
+#pod object:
+#pod
+#pod =for :list
+#pod * finalize
+#pod * is_finalized
+#pod * requirements_for
+#pod * as_string_hash
+#pod
+#pod =cut
 
 has cpan_meta_prereqs => (
   is  => 'ro',
@@ -29,6 +48,35 @@ has cpan_meta_prereqs => (
   ) ],
 );
 
+# storing this is sort of gross, but MakeMaker winds up needing the same data
+# anyway. -- xdg, 2013-10-22
+has merged_requires => (
+  is => 'ro',
+  isa => 'CPAN::Meta::Requirements',
+  init_arg => undef,
+  default => sub { CPAN::Meta::Requirements->new },
+);
+
+#pod =method register_prereqs
+#pod
+#pod   $prereqs->register_prereqs(%prereqs);
+#pod
+#pod   $prereqs->register_prereqs(\%arg, %prereqs);
+#pod
+#pod This method adds new minimums to the prereqs object.  If a hashref is the first
+#pod arg, it may have entries for C<phase> and C<type> to indicate what kind of
+#pod prereqs are being registered.  (For more information on phase and type, see
+#pod L<CPAN::Meta::Spec>.)  For example, you might say:
+#pod
+#pod   $prereqs->register_prereqs(
+#pod     { phase => 'test', type => 'recommends' },
+#pod     'Test::Foo' => '1.23',
+#pod     'XML::YZZY' => '2.01',
+#pod   );
+#pod
+#pod If not given, phase and type default to runtime and requires, respectively.
+#pod
+#pod =cut
 
 sub register_prereqs {
   my $self = shift;
@@ -47,6 +95,43 @@ sub register_prereqs {
   return;
 }
 
+before 'finalize' => sub {
+  my ($self) = @_;
+  $self->sync_runtime_build_test_requires;
+};
+
+
+# this avoids a long-standing CPAN.pm bug that incorrectly merges runtime and
+# "build" (build+test) requirements by ensuring requirements stay unified
+# across all three phases
+sub sync_runtime_build_test_requires {
+  my $self = shift;
+
+  # first pass: generated merged requirements
+  for my $phase ( qw/runtime build test/ ) {
+    my $req = $self->requirements_for($phase, 'requires');
+    $self->merged_requires->add_requirements( $req );
+  };
+
+  # second pass: update from merged requirements
+  for my $phase ( qw/runtime build test/ ) {
+    my $req = $self->requirements_for($phase, 'requires');
+    for my $mod ( $req->required_modules ) {
+      $req->clear_requirement( $mod );
+      $req->add_string_requirement(
+        $mod => $self->merged_requires->requirements_for_module($mod)
+      );
+    }
+  }
+
+  # and add configure requires for other consumers expecting this to be a full
+  # merge across all phases required by users
+  $self->merged_requires->add_requirements(
+      $self->requirements_for('configure', 'requires'));
+
+  return;
+}
+
 __PACKAGE__->meta->make_immutable;
 1;
 
@@ -54,13 +139,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Prereqs - the prerequisites of a Dist::Zilla distribution
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -124,7 +211,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,20 @@
 package Dist::Zilla::Role::AfterBuild;
-{
-  $Dist::Zilla::Role::AfterBuild::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs after building is mostly complete
+$Dist::Zilla::Role::AfterBuild::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<after_build> method called once all
+#pod the files have been written out.  It is passed a hashref with the following
+#pod data:
+#pod
+#pod   build_root - the directory in which the dist was built
+#pod
+#pod =cut
 
 requires 'after_build';
 
@@ -17,13 +24,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::AfterBuild - something that runs after building is mostly complete
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -39,7 +48,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,20 @@
 package Dist::Zilla::Role::AfterMint;
-{
-  $Dist::Zilla::Role::AfterMint::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs after minting is mostly complete
+$Dist::Zilla::Role::AfterMint::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<after_mint> method called once all
+#pod the files have been written out.  It is passed a hashref with the following
+#pod data:
+#pod
+#pod   mint_root - the directory in which the dist was minted
+#pod
+#pod =cut
 
 requires 'after_mint';
 
@@ -17,13 +24,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::AfterMint - something that runs after minting is mostly complete
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -39,7 +48,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,18 @@
 package Dist::Zilla::Role::AfterRelease;
-{
-  $Dist::Zilla::Role::AfterRelease::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs after release is mostly complete
+$Dist::Zilla::Role::AfterRelease::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<after_release> method called once
+#pod the release is done. The archive filename, if one was built, is passed as the
+#pod sole argument.
+#pod
+#pod =cut
 
 requires 'after_release';
 
@@ -17,18 +22,21 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::AfterRelease - something that runs after release is mostly complete
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
-Plugins implementing this role have their C<after_release> method called
-once the release is done.
+Plugins implementing this role have their C<after_release> method called once
+the release is done. The archive filename, if one was built, is passed as the
+sole argument.
 
 =head1 AUTHOR
 
@@ -36,7 +44,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::BeforeArchive;
-{
-  $Dist::Zilla::Role::BeforeArchive::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs before the archive file is built
+$Dist::Zilla::Role::BeforeArchive::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<before_archive> method
+#pod called before the archive is actually built.
+#pod
+#pod =cut
 
 requires 'before_archive';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::BeforeArchive - something that runs before the archive file is built
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::BeforeBuild;
-{
-  $Dist::Zilla::Role::BeforeBuild::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs before building really begins
+$Dist::Zilla::Role::BeforeBuild::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<before_build> method called
+#pod before any other plugins are consulted.
+#pod
+#pod =cut
 
 requires 'before_build';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::BeforeBuild - something that runs before building really begins
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::BeforeMint;
-{
-  $Dist::Zilla::Role::BeforeMint::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs before minting really begins
+$Dist::Zilla::Role::BeforeMint::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<before_mint> method called
+#pod before any other plugins are consulted.
+#pod
+#pod =cut
 
 requires 'before_mint';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::BeforeMint - something that runs before minting really begins
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::BeforeRelease;
-{
-  $Dist::Zilla::Role::BeforeRelease::VERSION = '4.300030';
-}
 # ABSTRACT: something that runs before release really begins
+$Dist::Zilla::Role::BeforeRelease::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<before_release> method
+#pod called before the release is actually done.
+#pod
+#pod =cut
 
 requires 'before_release';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::BeforeRelease - something that runs before release really begins
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,7 +1,6 @@
 package Dist::Zilla::Role::BuildPL;
-{
-  $Dist::Zilla::Role::BuildPL::VERSION = '4.300030';
-}
+# ABSTRACT: Common ground for Build.PL based builders
+$Dist::Zilla::Role::BuildPL::VERSION = '5.025';
 use Moose::Role;
 
 with qw(
@@ -12,20 +11,45 @@ with qw(
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This role is a helper for Build.PL based installers. It implements the
+#pod L<Dist::Zilla::Plugin::BuildRunner> and L<Dist::Zilla::Plugin::TestRunner>
+#pod roles, and requires you to implement the L<Dist::Zilla::Plugin::PrereqSource>
+#pod and L<Dist::Zilla::Plugin::InstallTool> roles yourself.
+#pod
+#pod =cut
+
 sub build {
   my $self = shift;
 
+  return
+    if -e 'Build' and (stat 'Build.PL')[9] <= (stat 'Build')[9];
+
+  $self->log_debug("running $^X Build.PL");
   system $^X, 'Build.PL' and die "error with Build.PL\n";
+
+  $self->log_debug("running $^X Build");
   system $^X, 'Build'    and die "error running $^X Build\n";
 
   return;
 }
 
 sub test {
-  my ($self, $target) = @_;
+  my ($self, $target, $arg) = @_;
 
   $self->build;
+
+  my $job_count = $arg && exists $arg->{jobs}
+                ? $arg->{jobs}
+                : $self->default_jobs;
+  my $jobs = "j$job_count";
+  my $ho = "HARNESS_OPTIONS";
+  local $ENV{$ho} = $ENV{$ho} ? "$ENV{$ho}:$jobs" : $jobs;
+
   my @testing = $self->zilla->logger->get_debug ? '--verbose' : ();
+
+  $self->log_debug('running ' . join(' ', $^X, 'Build', 'test', @testing));
   system $^X, 'Build', 'test', @testing and die "error running $^X Build test\n";
 
   return;
@@ -33,23 +57,26 @@ sub test {
 
 1;
 
-# ABSTRACT: Common ground for Build.PL based builders
-
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::BuildPL - Common ground for Build.PL based builders
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
-This role is a helper for Build.PL based installers. It implements the L<Dist::Zilla::Plugin::BuildRunner> and L<Dist::Zilla::Plugin::TestRunner> roles, and requires you to implement the L<Dist::Zilla::Plugin::PrereqSource> and L<Dist::Zilla::Plugin::InstallTool> roles yourself.
+This role is a helper for Build.PL based installers. It implements the
+L<Dist::Zilla::Plugin::BuildRunner> and L<Dist::Zilla::Plugin::TestRunner>
+roles, and requires you to implement the L<Dist::Zilla::Plugin::PrereqSource>
+and L<Dist::Zilla::Plugin::InstallTool> roles yourself.
 
 =head1 AUTHOR
 
@@ -57,7 +84,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,23 @@
 package Dist::Zilla::Role::BuildRunner;
-{
-  $Dist::Zilla::Role::BuildRunner::VERSION = '4.300030';
-}
 # ABSTRACT: something used as a delegating agent during 'dzil run'
+$Dist::Zilla::Role::BuildRunner::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<build> method called during
+#pod C<dzil run>.  It's passed the root directory of the build test dir.
+#pod
+#pod =head1 REQUIRED METHODS
+#pod
+#pod =head2 build
+#pod
+#pod This method will throw an exception on failure.
+#pod
+#pod =cut
 
 requires 'build';
 
@@ -17,13 +27,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::BuildRunner - something used as a delegating agent during 'dzil run'
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -42,7 +54,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::Chrome;
-{
-  $Dist::Zilla::Role::Chrome::VERSION = '4.300030';
-}
 # ABSTRACT: something that provides a user interface for Dist::Zilla
+$Dist::Zilla::Role::Chrome::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
@@ -19,13 +17,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::Chrome - something that provides a user interface for Dist::Zilla
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -33,7 +33,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::ConfigDumper;
-{
-  $Dist::Zilla::Role::ConfigDumper::VERSION = '4.300030';
-}
-# ABSTRACT: something that can dump its (public, simplified) configuraiton
+# ABSTRACT: something that can dump its (public, simplified) configuration
+$Dist::Zilla::Role::ConfigDumper::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
@@ -15,13 +13,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
-Dist::Zilla::Role::ConfigDumper - something that can dump its (public, simplified) configuraiton
+Dist::Zilla::Role::ConfigDumper - something that can dump its (public, simplified) configuration
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -29,7 +29,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,54 @@
+package Dist::Zilla::Role::EncodingProvider;
+# ABSTRACT: something that sets a files' encoding
+$Dist::Zilla::Role::EncodingProvider::VERSION = '5.025';
+use Moose::Role;
+with 'Dist::Zilla::Role::Plugin';
+
+use namespace::autoclean;
+
+#pod =head1 DESCRIPTION
+#pod
+#pod EncodingProvider plugins do their work after files are gathered, but before
+#pod they're munged.  They're meant to set the C<encoding> on files.
+#pod
+#pod The method C<set_file_encodings> is called with no arguments.
+#pod
+#pod =cut
+
+requires 'set_file_encodings';
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Dist::Zilla::Role::EncodingProvider - something that sets a files' encoding
+
+=head1 VERSION
+
+version 5.025
+
+=head1 DESCRIPTION
+
+EncodingProvider plugins do their work after files are gathered, but before
+they're munged.  They're meant to set the C<encoding> on files.
+
+The method C<set_file_encodings> is called with no arguments.
+
+=head1 AUTHOR
+
+Ricardo SIGNES <rjbs@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Ricardo SIGNES.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::ExecFiles;
-{
-  $Dist::Zilla::Role::ExecFiles::VERSION = '4.300030';
-}
 # ABSTRACT: something that finds files to install as executables
+$Dist::Zilla::Role::ExecFiles::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::FileFinder';
 
@@ -23,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::ExecFiles - something that finds files to install as executables
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -37,7 +37,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,24 @@
 package Dist::Zilla::Role::File;
-{
-  $Dist::Zilla::Role::File::VERSION = '4.300030';
-}
 # ABSTRACT: something that can act like a file
+$Dist::Zilla::Role::File::VERSION = '5.025';
 use Moose::Role;
 
 use Moose::Util::TypeConstraints;
+use Try::Tiny;
 
 use namespace::autoclean;
 
+with 'Dist::Zilla::Role::StubBuild';
+
+#pod =head1 DESCRIPTION
+#pod
+#pod This role describes a file that may be written into the shipped distribution.
+#pod
+#pod =attr name
+#pod
+#pod This is the name of the file to be written out.
+#pod
+#pod =cut
 
 has name => (
   is   => 'rw',
@@ -16,11 +26,68 @@ has name => (
   required => 1,
 );
 
+#pod =attr added_by
+#pod
+#pod This is a list of strings describing when and why the file was added
+#pod to the distribution and when it was updated (its content, filename, or other attributes).  It will
+#pod generally be updated by a plugin implementing the
+#pod L<FileMunger|Dist::Zilla::Role::FileMunger> role.  Its accessor will return
+#pod the list of strings, concatenated with C<'; '>.
+#pod
+#pod =cut
 
 has added_by => (
-  is => 'ro',
+  isa => 'ArrayRef[Str]',
+  lazy => 1,
+  default => sub { [] },
+  traits => ['Array'],
+  init_arg => undef,
+  handles => {
+    _push_added_by => 'push',
+    added_by => [ join => '; ' ],
+  },
 );
 
+around name => sub {
+  my $orig = shift;
+  my $self = shift;
+  if (@_) {
+    my ($pkg, $line) = $self->_caller_of('name');
+    $self->_push_added_by(sprintf("filename set by %s (%s line %s)", $self->_caller_plugin_name, $pkg, $line));
+  }
+  return $self->$orig(@_);
+};
+
+sub _caller_of {
+  my ($self, $function) = @_;
+
+  for (my $level = 1; $level < 50; ++$level)
+  {
+    my @frame = caller($level);
+    last if not defined $frame[0];
+    return ( (caller($level))[0,2] ) if $frame[3] =~ m/::${function}$/;
+  }
+  return 'unknown', '0';
+}
+
+sub _caller_plugin_name {
+  my $self = shift;
+
+  for (my $level = 1; $level < 50; ++$level)
+  {
+    my @frame = caller($level);
+    last if not defined $frame[0];
+    return $1 if $frame[0] =~ m/^Dist::Zilla::Plugin::(.+)$/;
+  }
+  return 'unknown';
+}
+
+#pod =attr mode
+#pod
+#pod This is the mode with which the file should be written out.  It's an integer
+#pod with the usual C<chmod> semantics.  It defaults to 0644.
+#pod
+#pod =cut
 
 my $safe_file_mode = subtype(
   as 'Int',
@@ -34,7 +101,59 @@ has mode => (
   default => 0644,
 );
 
+requires 'encoding';
 requires 'content';
+requires 'encoded_content';
+
+#pod =method is_bytes
+#pod
+#pod Returns true if the C<encoding> is bytes.  When true, accessing
+#pod C<content> will be an error.
+#pod
+#pod =cut
+
+sub is_bytes {
+    my ($self) = @_;
+    return $self->encoding eq 'bytes';
+}
+
+sub _encode {
+  my ($self, $text) = @_;
+  my $enc = $self->encoding;
+  if ( $self->is_bytes ) {
+    return $text; # XXX hope you were right that it really was bytes
+  }
+  else {
+    require Encode;
+    my $bytes =
+      try { Encode::encode($enc, $text, Encode::FB_CROAK()) }
+      catch { $self->_throw("encode $enc" => $_) };
+    return $bytes;
+  }
+}
+
+sub _decode {
+  my ($self, $bytes) = @_;
+  my $enc = $self->encoding;
+  if ( $self->is_bytes ) {
+    $self->_throw(decode => "Can't decode text from 'bytes' encoding");
+  }
+  else {
+    require Encode;
+    my $text =
+      try { Encode::decode($enc, $bytes, Encode::FB_CROAK()) }
+      catch { $self->_throw("decode $enc" => $_) };
+    return $text;
+  }
+}
+
+sub _throw {
+  my ($self, $op, $msg) = @_;
+  my ($name, $added_by) = map {; $self->$_ } qw/name added_by/;
+  confess(
+    "Could not $op $name; $added_by; error was: $msg; maybe you need the [Encoding] plugin to specify an encoding"
+  );
+}
 
 1;
 
@@ -42,13 +161,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::File - something that can act like a file
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -62,22 +183,31 @@ This is the name of the file to be written out.
 
 =head2 added_by
 
-This is a string describing when and why the file was added to the
-distribution.  It will generally be set by a plugin implementing the
-L<FileInjector|Dist::Zilla::Role::FileInjector> role.
+This is a list of strings describing when and why the file was added
+to the distribution and when it was updated (its content, filename, or other attributes).  It will
+generally be updated by a plugin implementing the
+L<FileMunger|Dist::Zilla::Role::FileMunger> role.  Its accessor will return
+the list of strings, concatenated with C<'; '>.
 
 =head2 mode
 
 This is the mode with which the file should be written out.  It's an integer
 with the usual C<chmod> semantics.  It defaults to 0644.
 
+=head1 METHODS
+
+=head2 is_bytes
+
+Returns true if the C<encoding> is bytes.  When true, accessing
+C<content> will be an error.
+
 =head1 AUTHOR
 
 Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::FileFinder;
-{
-  $Dist::Zilla::Role::FileFinder::VERSION = '4.300030';
-}
 # ABSTRACT: something that finds files within the distribution
+$Dist::Zilla::Role::FileFinder::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
@@ -10,6 +8,37 @@ use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod A FileFinder plugin locates files within the distribution.  This role exists so
+#pod that sets of files can be easily described in one configuration section and
+#pod then used by one or more other plugin.
+#pod
+#pod Plugins implementing this role must provide a C<find_files> method which will
+#pod be called with no arguments and must return an arrayref of files.  (This
+#pod arrayref should not be re-used, as it may be altered once returned.)
+#pod
+#pod For example, imagine a simple glob-like FileFinder that expects configuration
+#pod like this:
+#pod
+#pod   [Glob / RootModules]
+#pod   glob = *.pm
+#pod
+#pod This sets up a FileFinder named "RootModules" which will contain all F<pm>
+#pod files in the root directory.
+#pod
+#pod Another plugin that knows how to use FileFinder plugins might be configured
+#pod like this:
+#pod
+#pod   [ModuleRelocator]
+#pod   finder = RootModules
+#pod   relocate_to = attic
+#pod
+#pod Finders may operate on any rules they like, checking file size, content, name,
+#pod or other properties.  They should re-perform their "finding" on each call to
+#pod C<find_files> as the files in the distribution may have changed.
+#pod
+#pod =cut
 
 requires 'find_files';
 
@@ -19,13 +48,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::FileFinder - something that finds files within the distribution
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -63,7 +94,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,25 +1,107 @@
 package Dist::Zilla::Role::FileFinderUser;
-{
-  $Dist::Zilla::Role::FileFinderUser::VERSION = '4.300030';
-}
 # ABSTRACT: something that uses FileFinder plugins
+$Dist::Zilla::Role::FileFinderUser::VERSION = '5.025';
 use MooseX::Role::Parameterized;
 
 use namespace::autoclean;
 
-
+#pod =head1 DESCRIPTION
+#pod
+#pod This role enables you to search for files in the dist. This makes it easy to find specific
+#pod files and have the code factored out to common methods.
+#pod
+#pod Here's an example of a finder: ( taken from AutoPrereqs )
+#pod
+#pod   with 'Dist::Zilla::Role::FileFinderUser' => {
+#pod       default_finders  => [ ':InstallModules', ':ExecFiles' ],
+#pod   };
+#pod
+#pod Then you use it in your code like this:
+#pod
+#pod   foreach my $file ( $self->found_files ) {
+#pod     # $file is an object! Look at L<Dist::Zilla::Role::File>
+#pod   }
+#pod
+#pod =cut
+
+#pod =attr finder_arg_names
+#pod
+#pod Define the name of the attribute which will hold this finder. Be sure to specify different names
+#pod if you have multiple finders!
+#pod
+#pod This is an ArrayRef.
+#pod
+#pod Default: [ qw( finder ) ]
+#pod
+#pod =cut
 
 parameter finder_arg_names => (
   isa => 'ArrayRef',
   default => sub { [ 'finder' ] },
 );
 
+#pod =attr default_finders
+#pod
+#pod This attribute is an arrayref of plugin names for the default plugins the
+#pod consuming plugin will use as finders.
+#pod
+#pod Example: C<< [ qw( :InstallModules :ExecFiles ) ] >>
+#pod
+#pod The default finders are:
+#pod
+#pod =begin :list
+#pod
+#pod = :InstallModules
+#pod
+#pod Searches your lib/ directory for pm/pod files
+#pod
+#pod = :IncModules
+#pod
+#pod Searches your inc/ directory for pm files
+#pod
+#pod = :MainModule
+#pod
+#pod Finds the C<main_module> of your dist
+#pod
+#pod = :TestFiles
+#pod
+#pod Searches your t/ directory and lists the files in it.
+#pod
+#pod = :ExecFiles
+#pod
+#pod Searches your distribution for executable files.  Hint: Use the
+#pod L<Dist::Zilla::Plugin::ExecDir> plugin to mark those files as executables.
+#pod
+#pod = :ShareFiles
+#pod
+#pod Searches your ShareDir directory and lists the files in it.
+#pod Hint: Use the L<Dist::Zilla::Plugin::ShareDir> plugin to set up the sharedir.
+#pod
+#pod = :All
+#pod
+#pod Returns all files in the distribution.
+#pod
+#pod = :None
+#pod
+#pod Returns nothing.
+#pod
+#pod =end :list
+#pod
+#pod =cut
 
 parameter default_finders => (
   isa => 'ArrayRef',
   required => 1,
 );
 
+#pod =attr method
+#pod
+#pod This will be the name of the subroutine installed in your package for this
+#pod finder.  Be sure to specify different names if you have multiple finders!
+#pod
+#pod Default: found_files
+#pod
+#pod =cut
 
 parameter method => (
   isa     => 'Str',
@@ -79,13 +161,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::FileFinderUser - something that uses FileFinder plugins
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -118,7 +202,7 @@ Default: [ qw( finder ) ]
 =head2 default_finders
 
 This attribute is an arrayref of plugin names for the default plugins the
-consuming plugin will use as finder.s
+consuming plugin will use as finders.
 
 Example: C<< [ qw( :InstallModules :ExecFiles ) ] >>
 
@@ -150,7 +234,15 @@ L<Dist::Zilla::Plugin::ExecDir> plugin to mark those files as executables.
 =item :ShareFiles
 
 Searches your ShareDir directory and lists the files in it.
-Hint: Use the L<Dist::Zilla::Plugin::ShareDir> plugin to setup the sharedir.
+Hint: Use the L<Dist::Zilla::Plugin::ShareDir> plugin to set up the sharedir.
+
+=item :All
+
+Returns all files in the distribution.
+
+=item :None
+
+Returns nothing.
 
 =back
 
@@ -167,7 +259,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::FileGatherer;
-{
-  $Dist::Zilla::Role::FileGatherer::VERSION = '4.300030';
-}
 # ABSTRACT: something that gathers files into the distribution
+$Dist::Zilla::Role::FileGatherer::VERSION = '5.025';
 use Moose::Role;
 with qw/Dist::Zilla::Role::Plugin Dist::Zilla::Role::FileInjector/;
 
@@ -10,6 +8,17 @@ use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod A FileGatherer plugin is a special sort of
+#pod L<FileInjector|Dist::Zilla::Role::FileInjector> that runs early in the build
+#pod cycle, finding files to include in the distribution.  It is expected to call
+#pod its C<add_file> method to add one or more files to inclusion.
+#pod
+#pod Plugins implementing FileGatherer must provide a C<gather_files> method, which
+#pod will be called during the build process.
+#pod
+#pod =cut
 
 requires 'gather_files';
 
@@ -19,13 +28,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::FileGatherer - something that gathers files into the distribution
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -43,7 +54,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,21 +1,32 @@
 package Dist::Zilla::Role::FileInjector;
-{
-  $Dist::Zilla::Role::FileInjector::VERSION = '4.300030';
-}
 # ABSTRACT: something that can add files to the distribution
+$Dist::Zilla::Role::FileInjector::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This role should be implemented by any plugin that plans to add files into the
+#pod distribution.  It provides one method (C<L</add_file>>, documented below),
+#pod which adds a file to the distribution, noting the place of addition.
+#pod
+#pod =method add_file
+#pod
+#pod   $plugin->add_file($dzil_file);
+#pod
+#pod This adds a file to the distribution, setting the file's C<added_by> attribute
+#pod as it does so.
+#pod
+#pod =cut
 
 sub add_file {
   my ($self, $file) = @_;
   my ($pkg, undef, $line) = caller;
 
-  $file->meta->get_attribute('added_by')->set_value(
-    $file,
+  $file->_set_added_by(
     sprintf("%s (%s line %s)", $self->plugin_name, $pkg, $line),
   );
 
@@ -29,13 +40,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::FileInjector - something that can add files to the distribution
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -58,7 +71,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::FileMunger;
-{
-  $Dist::Zilla::Role::FileMunger::VERSION = '4.300030';
-}
 # ABSTRACT: something that alters a file's destination or content
+$Dist::Zilla::Role::FileMunger::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
@@ -10,6 +8,22 @@ use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod A FileMunger has an opportunity to mess around with each file that will be
+#pod included in the distribution.  Each FileMunger's C<munge_files> method is
+#pod called once.  By default, this method will just call the C<munge_file> method
+#pod (note the missing terminal 's') once for each file, excluding files with an
+#pod encoding attribute of 'bytes'.
+#pod
+#pod The C<munge_file> method is expected to change attributes about the file before
+#pod it is written out to the built distribution.
+#pod
+#pod If you want to modify all files (including ones with an encoding of 'bytes') or
+#pod want to select a more limited set of files, you can provide your own
+#pod C<munge_files> method.
+#pod
+#pod =cut
 
 sub munge_files {
   my ($self) = @_;
@@ -17,7 +31,14 @@ sub munge_files {
   $self->log_fatal("no munge_file behavior implemented!")
     unless $self->can('munge_file');
 
-  $self->munge_file($_) for $self->zilla->files->flatten;
+  for my $file ($self->zilla->files->flatten) {
+    if ($file->is_bytes) {
+      $self->log_debug($file->name . " has 'bytes' encoding, skipping...");
+      next;
+    }
+
+    $self->munge_file($file);
+  }
 }
 
 1;
@@ -26,23 +47,30 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::FileMunger - something that alters a file's destination or content
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
 A FileMunger has an opportunity to mess around with each file that will be
 included in the distribution.  Each FileMunger's C<munge_files> method is
-called once.  By default, this method will just call the C<munge_file> (note
-the missing terminal 's') once for each file.
+called once.  By default, this method will just call the C<munge_file> method
+(note the missing terminal 's') once for each file, excluding files with an
+encoding attribute of 'bytes'.
+
+The C<munge_file> method is expected to change attributes about the file before
+it is written out to the built distribution.
 
-This method is expected to change attributes about the file before it is
-written out to the built distribution.
+If you want to modify all files (including ones with an encoding of 'bytes') or
+want to select a more limited set of files, you can provide your own
+C<munge_files> method.
 
 =head1 AUTHOR
 
@@ -50,7 +78,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,19 @@
 package Dist::Zilla::Role::FilePruner;
-{
-  $Dist::Zilla::Role::FilePruner::VERSION = '4.300030';
-}
 # ABSTRACT: something that removes found files from the distribution
+$Dist::Zilla::Role::FilePruner::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing FilePruner have their C<prune_files> method called once
+#pod all the L<FileGatherer|Dist::Zilla::Role::FileGatherer> plugins have been
+#pod called.  They are expected to (optionally) remove files from the list of files
+#pod to be included in the distribution.
+#pod
+#pod =cut
 
 requires 'prune_files';
 
@@ -17,13 +23,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::FilePruner - something that removes found files from the distribution
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -38,7 +46,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::InstallTool;
-{
-  $Dist::Zilla::Role::InstallTool::VERSION = '4.300030';
-}
 # ABSTRACT: something that creates an install program for a dist
+$Dist::Zilla::Role::InstallTool::VERSION = '5.025';
 use Moose::Role;
 with qw(
   Dist::Zilla::Role::Plugin
@@ -13,6 +11,16 @@ use namespace::autoclean;
 
 use Moose::Autobox;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing InstallTool have their C<setup_installer> method called to
+#pod inject files after all other file injection and munging has taken place.
+#pod They're expected to produce files needed to make the distribution
+#pod installable, like F<Makefile.PL> or F<Build.PL> and add them with the
+#pod C<add_file> method provided by L<Dist::Zilla::Role::FileInjector>, which is
+#pod also composed by this role.
+#pod
+#pod =cut
 
 requires 'setup_installer';
 
@@ -22,13 +30,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::InstallTool - something that creates an install program for a dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -45,7 +55,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,29 @@
 package Dist::Zilla::Role::LicenseProvider;
-{
-  $Dist::Zilla::Role::LicenseProvider::VERSION = '4.300030';
-}
 # ABSTRACT: something that provides a license for the dist
+$Dist::Zilla::Role::LicenseProvider::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role must provide a C<provide_license> method that
+#pod will be called when setting the dist's license.
+#pod
+#pod If a LicenseProvider offers a license but one has already been set, an
+#pod exception will be raised.  If C<provides_license> returns undef, it will be
+#pod ignored.
+#pod
+#pod =head1 REQUIRED METHODS
+#pod
+#pod =head2 C<< provide_license($copyright_holder, $copyright_year) >>
+#pod
+#pod Generate license object. Returned object should be an instance of
+#pod L<Software::License>.
+#pod
+#pod Plugins are responsible for injecting C<$copyright_holder> and
+#pod C<$copyright_year> arguments into the license if these arguments are defined.
+#pod
+#pod =cut
 
 requires 'provide_license';
 
@@ -16,13 +34,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::LicenseProvider - something that provides a license for the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -49,7 +69,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,29 +1,38 @@
 package Dist::Zilla::Role::MetaProvider;
-{
-  $Dist::Zilla::Role::MetaProvider::VERSION = '4.300030';
-}
 # ABSTRACT: something that provides metadata (for META.yml/json)
+$Dist::Zilla::Role::MetaProvider::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This role provides data to merge into the distribution metadata.
+#pod
+#pod =method metadata
+#pod
+#pod This method (which must be provided by classes implementing this role)
+#pod returns a hashref of data to be (deeply) merged together with pre-existing
+#pod metadata.
+#pod
+#pod =cut
 
 requires 'metadata';
 
 1;
 
-__END__
-
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::MetaProvider - something that provides metadata (for META.yml/json)
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -52,9 +61,22 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 =cut
+
+__END__
+
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins implementing this role:
+#pod L<ConfigMeta|Dist::Zilla::Plugin::ConfigMeta>.
+#pod L<MetaNoIndex|Dist::Zilla::Plugin::MetaNoIndex>.
+#pod
+#pod Dist::Zilla plugins on the CPAN:
+#pod L<GithubMeta|Dist::Zilla::Plugin::GithubMeta>...
+#pod
+#pod =cut
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::MintingProfile::ShareDir;
-{
-  $Dist::Zilla::Role::MintingProfile::ShareDir::VERSION = '4.300030';
-}
 # ABSTRACT: something that keeps its minting profile in a sharedir
+$Dist::Zilla::Role::MintingProfile::ShareDir::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::MintingProfile';
 
@@ -11,6 +9,12 @@ use namespace::autoclean;
 use File::ShareDir;
 use Path::Class;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod This role includes L<Dist::Zilla::Role::MintingProfile>, providing a
+#pod C<profile_dir> method that looks in the I<module>'s L<ShareDir|File::ShareDir>.
+#pod
+#pod =cut
 
 sub profile_dir {
   my ($self, $profile_name) = @_;
@@ -29,13 +33,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::MintingProfile::ShareDir - something that keeps its minting profile in a sharedir
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -48,7 +54,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::MintingProfile;
-{
-  $Dist::Zilla::Role::MintingProfile::VERSION = '4.300030';
-}
 # ABSTRACT: something that can find a minting profile dir
+$Dist::Zilla::Role::MintingProfile::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
@@ -10,6 +8,24 @@ use namespace::autoclean;
 use File::ShareDir;
 use Path::Class;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role should provide C<profile_dir> method, which,
+#pod given a minting profile name, returns its directory.
+#pod
+#pod The minting profile is a directory, containing arbitrary files used during
+#pod creation of new distribution. Among other things notably, it should contain the
+#pod 'profile.ini' file, listing the plugins used for minter initialization.
+#pod
+#pod The default implementation C<profile_dir> looks in the module's
+#pod L<ShareDir|File::ShareDir>.
+#pod
+#pod After installing your profile, users will be able to start a new distribution,
+#pod based on your profile with the:
+#pod
+#pod   $ dzil new -P Provider -p profile_name Distribution::Name
+#pod
+#pod =cut
 
 requires 'profile_dir';
 
@@ -19,13 +35,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::MintingProfile - something that can find a minting profile dir
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -50,7 +68,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::ModuleMaker;
-{
-  $Dist::Zilla::Role::ModuleMaker::VERSION = '4.300030';
-}
 # ABSTRACT: something that injects module files into the dist
+$Dist::Zilla::Role::ModuleMaker::VERSION = '5.025';
 use Moose::Role;
 with qw(
   Dist::Zilla::Role::Plugin
@@ -11,6 +9,19 @@ with qw(
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<make_module> method called for each
+#pod module requesting creation by the plugin with this name.  It is passed a
+#pod hashref with the following data:
+#pod
+#pod   name - the name of the module to make (a MooseX::Types::Perl::ModuleName)
+#pod
+#pod Classes composing this role also compose
+#pod L<FileInjector|Dist::Zilla::Role::FileInjector> and are expected to inject a
+#pod file for the module being created.
+#pod
+#pod =cut
 
 requires 'make_module';
 
@@ -20,13 +31,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::ModuleMaker - something that injects module files into the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -46,7 +59,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,165 @@
+package Dist::Zilla::Role::MutableFile;
+# ABSTRACT: something that can act like a file with changeable contents
+$Dist::Zilla::Role::MutableFile::VERSION = '5.025';
+use Moose::Role;
+
+use Moose::Util::TypeConstraints;
+use MooseX::SetOnce;
+use namespace::autoclean;
+
+#pod =head1 DESCRIPTION
+#pod
+#pod This role describes a file whose contents may be modified
+#pod
+#pod =attr encoding
+#pod
+#pod Default is 'UTF-8'. Can only be set once.
+#pod
+#pod =cut
+
+with 'Dist::Zilla::Role::File';
+
+sub encoding;
+
+has encoding => (
+  is          => 'rw',
+  isa         => 'Str',
+  lazy        => 1,
+  default     => 'UTF-8',
+  traits      => [ qw(SetOnce) ],
+);
+
+#pod =attr content
+#pod
+#pod =cut
+
+has _content => (
+  is          => 'rw',
+  isa         => 'Str',
+  lazy        => 1,
+  builder     => '_build_content',
+  clearer     => 'clear_content',
+  predicate   => 'has_content',
+);
+
+sub content {
+  my $self = shift;
+  if ( ! @_ ) {
+    # if we have it or we're tasked to provide it, return it (possibly lazily
+    # generated from a builder); otherwise, get it from the encoded_content
+    if ( $self->has_content || $self->_content_source eq 'content' ) {
+      return $self->_content;
+    }
+    else {
+      return $self->_content($self->_decode($self->encoded_content));
+    }
+  }
+  else {
+    my ($pkg, $line) = $self->_caller_of('content');
+    $self->_content_source('content');
+    $self->_push_added_by(sprintf("content set by %s (%s line %s)", $self->_caller_plugin_name, $pkg, $line));
+    $self->clear_encoded_content;
+    return $self->_content(@_);
+  }
+}
+
+#pod =attr encoded_content
+#pod
+#pod =cut
+
+has _encoded_content => (
+  is          => 'rw',
+  isa         => 'Str',
+  lazy        => 1,
+  builder     => '_build_encoded_content',
+  clearer     => 'clear_encoded_content',
+  predicate   => 'has_encoded_content',
+);
+
+sub encoded_content {
+  my $self = shift;
+  if ( ! @_ ) {
+    # if we have it or we're tasked to provide it, return it (possibly lazily
+    # generated from a builder); otherwise, get it from the content
+    if ($self->has_encoded_content || $self->_content_source eq 'encoded_content') {
+      return $self->_encoded_content;
+    }
+    else {
+      return $self->_encoded_content($self->_encode($self->content));
+    }
+  }
+  my ($pkg, $line) = $self->_caller_of('encoded_content');
+  $self->_content_source('encoded_content');
+  $self->_push_added_by(sprintf("encoded_content set by %s (%s line %s)", $self->_caller_plugin_name, $pkg, $line));
+  $self->clear_content;
+  $self->_encoded_content(@_);
+}
+
+has _content_source => (
+    is => 'rw',
+    isa => enum([qw/content encoded_content/]),
+    lazy => 1,
+    builder => '_build_content_source',
+);
+
+sub _set_added_by {
+  my ($self, $value) = @_;
+  return $self->_push_added_by(sprintf("%s added by %s", $self->_content_source, $value));
+};
+
+# we really only need one of these and only if _content or _encoded_content
+# isn't provided, but roles can't do that, so we'll insist on both just in case
+# and let classes provide stubs if they provide _content or _encoded_content
+# another way
+
+requires '_build_content';
+requires '_build_encoded_content';
+
+# we need to know the content source so we know where we might need to rely on
+# lazy loading to give us content. It should be set by the class if there is a
+# class-wide default or just stubbed if a BUILD modifier sets it per-object.
+
+requires '_build_content_source';
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Dist::Zilla::Role::MutableFile - something that can act like a file with changeable contents
+
+=head1 VERSION
+
+version 5.025
+
+=head1 DESCRIPTION
+
+This role describes a file whose contents may be modified
+
+=head1 ATTRIBUTES
+
+=head2 encoding
+
+Default is 'UTF-8'. Can only be set once.
+
+=head2 content
+
+=head2 encoded_content
+
+=head1 AUTHOR
+
+Ricardo SIGNES <rjbs@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Ricardo SIGNES.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
@@ -1,11 +1,19 @@
 package Dist::Zilla::Role::NameProvider;
-{
-  $Dist::Zilla::Role::NameProvider::VERSION = '4.300030';
-}
 # ABSTRACT: something that provides a name for the dist
+$Dist::Zilla::Role::NameProvider::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role must provide a C<provide_name> method that
+#pod will be called when setting the dist's name.
+#pod
+#pod If a NameProvider offers a name but one has already been set, an
+#pod exception will be raised.  If C<provide_name> returns undef, it will be
+#pod ignored.
+#pod
+#pod =cut
 
 requires 'provide_name';
 
@@ -16,13 +24,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::NameProvider - something that provides a name for the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -39,7 +49,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::PPI;
-{
-  $Dist::Zilla::Role::PPI::VERSION = '4.300030';
-}
 # ABSTRACT: a role for plugins which use PPI
+$Dist::Zilla::Role::PPI::VERSION = '5.025';
 use Moose::Role;
 
 use Moose::Util::TypeConstraints;
@@ -10,44 +8,82 @@ use Moose::Util::TypeConstraints;
 use namespace::autoclean;
 
 use Digest::MD5 qw(md5);
-
+use Storable qw(dclone);
+
+#pod =head1 DESCRIPTION
+#pod
+#pod This role provides some common utilities for plugins which use PPI
+#pod
+#pod =method ppi_document_for_file
+#pod
+#pod   my $document = $self->ppi_document_for_file($file);
+#pod
+#pod Given a dzil file object (anything that does L<Dist::Zilla::Role::File>), this
+#pod method returns a new L<PPI::Document> for that file's content.
+#pod
+#pod Internally, this method caches these documents. If multiple plugins want a
+#pod document for the same file, this avoids reparsing it.
+#pod
+#pod =cut
 
 my %CACHE;
 
 sub ppi_document_for_file {
   my ($self, $file) = @_;
 
-  my $content = $file->content;
+  my $encoded_content = $file->encoded_content;
 
   # We cache on the MD5 checksum to detect if the document has been modified
   # by some other plugin since it was last parsed, our document is invalid.
-  my $md5 = md5($content);
-  return $CACHE{$md5} if $CACHE{$md5};
+  my $md5 = md5($encoded_content);
+  return $CACHE{$md5}->clone if $CACHE{$md5};
 
-  my $document = PPI::Document->new(\$content)
+  require PPI::Document;
+  my $document = PPI::Document->new(\$encoded_content)
     or Carp::croak(PPI::Document->errstr);
 
-  return $CACHE{$md5} = $document;
+  return ($CACHE{$md5} = $document)->clone;
 }
 
+#pod =method save_ppi_document_to_file
+#pod
+#pod   my $document = $self->save_ppi_document_to_file($document,$file);
+#pod
+#pod Given a L<PPI::Document> and a dzil file object (anything that does
+#pod L<Dist::Zilla::Role::File>), this method saves the serialized document in the
+#pod file.
+#pod
+#pod It also updates the internal PPI document cache with the new document.
+#pod
+#pod =cut
 
 sub save_ppi_document_to_file {
   my ($self, $document, $file) = @_;
 
   my $new_content = $document->serialize;
 
-  $CACHE{ md5($new_content) } = $document;
+  $file->encoded_content($new_content);
 
-  $file->content($new_content);
+  $CACHE{ md5($new_content) } = $document->clone;
 }
 
+#pod =method document_assigns_to_variable
+#pod
+#pod   if( $self->ppi_document_for_file($document, '$FOO')) { ... }
+#pod
+#pod This method returns true if the document assigns to the given variable.
+#pod
+#pod =cut
 
 sub document_assigns_to_variable {
   my ($self, $document, $variable) = @_;
 
   my $finder = sub {
     my $node = $_[1];
-    return 1 if $node->isa('PPI::Statement') && $node->content =~ /(?<!\\)\Q$variable\E\s*=/sm;
+    return 1 if $node->isa('PPI::Statement')
+      && $node->content =~ /^[^#]*(?<!\\)\Q$variable\E\s*=/sm
+      && !$node->isa('PPI::Statement::End')
+      && !$node->isa('PPI::Statement::Data');
     return 0;
   };
 
@@ -63,13 +99,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::PPI - a role for plugins which use PPI
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -109,7 +147,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::Plugin;
-{
-  $Dist::Zilla::Role::Plugin::VERSION = '4.300030';
-}
 # ABSTRACT: something that gets plugged in to Dist::Zilla
+$Dist::Zilla::Role::Plugin::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::ConfigDumper';
 
@@ -12,6 +10,16 @@ use MooseX::Types;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod The Plugin role should be applied to all plugin classes.  It provides a few key
+#pod methods and attributes that all plugins will need.
+#pod
+#pod =attr plugin_name
+#pod
+#pod The plugin name is generally determined when configuration is read.
+#pod
+#pod =cut
 
 has plugin_name => (
   is  => 'ro',
@@ -19,6 +27,12 @@ has plugin_name => (
   required => 1,
 );
 
+#pod =attr zilla
+#pod
+#pod This attribute contains the Dist::Zilla object into which the plugin was
+#pod plugged.
+#pod
+#pod =cut
 
 has zilla => (
   is  => 'ro',
@@ -27,6 +41,12 @@ has zilla => (
   weak_ref => 1,
 );
 
+#pod =method log
+#pod
+#pod The plugin's C<log> method delegates to the Dist::Zilla object's
+#pod L<Dist::Zilla/log> method after including a bit of argument-munging.
+#pod
+#pod =cut
 
 has logger => (
   is   => 'ro',
@@ -75,13 +95,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::Plugin - something that gets plugged in to Dist::Zilla
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -112,7 +134,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,34 @@
 package Dist::Zilla::Role::PluginBundle::Easy;
-{
-  $Dist::Zilla::Role::PluginBundle::Easy::VERSION = '4.300030';
-}
 # ABSTRACT: something that bundles a bunch of plugins easily
 # This plugin was originally contributed by Christopher J. Madsen
+$Dist::Zilla::Role::PluginBundle::Easy::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::PluginBundle';
 
 use namespace::autoclean;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   package Dist::Zilla::PluginBundle::Example;
+#pod   use Moose;
+#pod   with 'Dist::Zilla::Role::PluginBundle::Easy';
+#pod
+#pod   sub configure {
+#pod     my $self = shift;
+#pod
+#pod     $self->add_plugins('VersionFromModule');
+#pod     $self->add_bundle('Basic');
+#pod   }
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod This role builds upon the PluginBundle role, adding methods to take most of the
+#pod grunt work out of creating a bundle.  It supplies the C<bundle_config> method
+#pod for you.  In exchange, you must supply a C<configure> method, which will store
+#pod the bundle's configuration in the C<plugins> attribute by calling
+#pod C<add_plugins> and/or C<add_bundle>.
+#pod
+#pod =cut
 
 use Moose::Autobox;
 use MooseX::Types::Moose qw(Str ArrayRef HashRef);
@@ -31,6 +51,12 @@ use namespace::autoclean;
 
 requires 'configure';
 
+#pod =attr name
+#pod
+#pod This is the bundle name, taken from the Section passed to
+#pod C<bundle_config>.
+#pod
+#pod =cut
 
 has name => (
   is       => 'ro',
@@ -38,6 +64,12 @@ has name => (
   required => 1,
 );
 
+#pod =attr payload
+#pod
+#pod This hashref contains the bundle's parameters (if any), taken from the
+#pod Section passed to C<bundle_config>.
+#pod
+#pod =cut
 
 has payload => (
   is       => 'ro',
@@ -45,6 +77,13 @@ has payload => (
   required => 1,
 );
 
+#pod =attr plugins
+#pod
+#pod This arrayref contains the configuration that will be returned by
+#pod C<bundle_config>.  You normally modify this by using the
+#pod C<add_plugins> and C<add_bundle> methods.
+#pod
+#pod =cut
 
 has plugins => (
   is       => 'ro',
@@ -62,6 +101,24 @@ sub bundle_config {
   return $self->plugins->flatten;
 }
 
+#pod =method add_plugins
+#pod
+#pod   $self->add_plugins('Plugin1', [ Plugin2 => \%plugin2config ])
+#pod
+#pod Use this method to add plugins to your bundle.
+#pod
+#pod It is passed a list of plugin specifiers, which can be one of a few things:
+#pod
+#pod =for :list
+#pod * a plugin moniker (like you might provide in your config file)
+#pod * an arrayref of: C<< [ $moniker, $plugin_name, \%plugin_config ] >>
+#pod
+#pod In the case of an arrayref, both C<$plugin_name> and C<\%plugin_config> are
+#pod optional.
+#pod
+#pod The plugins are added to the config in the order given.
+#pod
+#pod =cut
 
 sub add_plugins {
   my ($self, @plugin_specs) = @_;
@@ -90,6 +147,14 @@ sub add_plugins {
   }
 }
 
+#pod =method add_bundle
+#pod
+#pod   $self->add_bundle(BundleName => \%bundle_config)
+#pod
+#pod Use this method to add all the plugins from another bundle to your bundle.  If
+#pod you omit C<%bundle_config>, an empty hashref will be supplied.
+#pod
+#pod =cut
 
 sub add_bundle {
   my ($self, $bundle, $payload) = @_;
@@ -101,7 +166,7 @@ sub add_bundle {
   if( my $v = $payload->{':version'} ){
     $load_opts->{'-version'} = $v;
   }
-  Class::MOP::load_class($package, $load_opts);
+  Class::Load::load_class($package, $load_opts);
 
   $bundle = "\@$bundle" unless $bundle =~ /^@/;
 
@@ -114,6 +179,20 @@ sub add_bundle {
   );
 }
 
+#pod =method config_slice
+#pod
+#pod   $hash_ref = $self->config_slice(arg1, { arg2 => 'plugin_arg2' })
+#pod
+#pod Use this method to extract parameters from your bundle's C<payload> so
+#pod that you can pass them to a plugin or subsidiary bundle.  It supports
+#pod easy renaming of parameters, since a plugin may expect a parameter
+#pod name that's too generic to be suitable for a bundle.
+#pod
+#pod Each arg is either a key in C<payload>, or a hashref that maps keys in
+#pod C<payload> to keys in the hash being constructed.  If any specified
+#pod key does not exist in C<payload>, then it is omitted from the result.
+#pod
+#pod =cut
 
 sub config_slice {
   my $self = shift;
@@ -141,13 +220,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::PluginBundle::Easy - something that bundles a bunch of plugins easily
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -206,7 +287,7 @@ a plugin moniker (like you might provide in your config file)
 
 =item *
 
-an arrayref of: C<< [ $moniker, $plugin_name, \%plugin_config >>
+an arrayref of: C<< [ $moniker, $plugin_name, \%plugin_config ] >>
 
 =back
 
@@ -241,7 +322,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,18 @@
 package Dist::Zilla::Role::PluginBundle;
-{
-  $Dist::Zilla::Role::PluginBundle::VERSION = '4.300030';
-}
 # ABSTRACT: something that bundles a bunch of plugins
+$Dist::Zilla::Role::PluginBundle::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod When loading configuration, if the config reader encounters a PluginBundle, it
+#pod will replace its place in the plugin list with the result of calling its
+#pod C<bundle_config> method, which will be passed a Config::MVP::Section to
+#pod configure the bundle.
+#pod
+#pod =cut
 
 sub register_component {
   my ($class, $name, $arg, $self) = @_;
@@ -22,13 +28,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::PluginBundle - something that bundles a bunch of plugins
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -43,7 +51,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::PrereqSource;
-{
-  $Dist::Zilla::Role::PrereqSource::VERSION = '4.300030';
-}
 # ABSTRACT: something that registers prerequisites
+$Dist::Zilla::Role::PrereqSource::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod PrereqSource plugins have a C<register_prereqs> method that should register
+#pod prereqs with the Dist::Zilla object.
+#pod
+#pod =cut
 
 requires 'register_prereqs';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::PrereqSource - something that registers prerequisites
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::Releaser;
-{
-  $Dist::Zilla::Role::Releaser::VERSION = '4.300030';
-}
 # ABSTRACT: something that makes a release of the dist
+$Dist::Zilla::Role::Releaser::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<release> method called when
+#pod releasing.  It's passed the distribution tarball to be released.
+#pod
+#pod =cut
 
 requires 'release';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::Releaser - something that makes a release of the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::ShareDir;
-{
-  $Dist::Zilla::Role::ShareDir::VERSION = '4.300030';
-}
 # ABSTRACT: something that picks a directory to install as shared files
+$Dist::Zilla::Role::ShareDir::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::FileFinder';
 
@@ -20,13 +18,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::ShareDir - something that picks a directory to install as shared files
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -34,7 +34,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,17 @@
 package Dist::Zilla::Role::Stash::Authors;
-{
-  $Dist::Zilla::Role::Stash::Authors::VERSION = '4.300030';
-}
+# ABSTRACT: a stash that provides a list of author strings
+$Dist::Zilla::Role::Stash::Authors::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Stash';
-# ABSTRACT: a stash that provides a list of author strings
 
 use namespace::autoclean;
 
+#pod =head1 OVERVIEW
+#pod
+#pod An Authors stash must provide an C<authors> method that returns an arrayref of
+#pod author strings, generally in the form "Name <email>".
+#pod
+#pod =cut
 
 requires 'authors';
 
@@ -17,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::Stash::Authors - a stash that provides a list of author strings
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -36,7 +42,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,16 @@
 package Dist::Zilla::Role::Stash::Login;
-{
-  $Dist::Zilla::Role::Stash::Login::VERSION = '4.300030';
-}
+# ABSTRACT: a stash with username/password credentials
+$Dist::Zilla::Role::Stash::Login::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Stash';
-# ABSTRACT: a stash with username/password credentials
 
 use namespace::autoclean;
 
+#pod =head1 OVERVIEW
+#pod
+#pod A Login stash must provide a C<username> and C<password> method.
+#pod
+#pod =cut
 
 requires 'username';
 requires 'password';
@@ -18,13 +21,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::Stash::Login - a stash with username/password credentials
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -36,7 +41,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,8 +1,6 @@
 package Dist::Zilla::Role::Stash;
-{
-  $Dist::Zilla::Role::Stash::VERSION = '4.300030';
-}
 # ABSTRACT: something that stores options or data for later reference
+$Dist::Zilla::Role::Stash::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
@@ -31,13 +29,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::Stash - something that stores options or data for later reference
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -45,7 +45,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,35 @@
+package Dist::Zilla::Role::StubBuild;
+# ABSTRACT: provides an empty BUILD methods
+$Dist::Zilla::Role::StubBuild::VERSION = '5.025';
+use Moose::Role;
+
+sub BUILD {}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Dist::Zilla::Role::StubBuild - provides an empty BUILD methods
+
+=head1 VERSION
+
+version 5.025
+
+=head1 AUTHOR
+
+Ricardo SIGNES <rjbs@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Ricardo SIGNES.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
@@ -1,34 +1,86 @@
 package Dist::Zilla::Role::TestRunner;
-{
-  $Dist::Zilla::Role::TestRunner::VERSION = '4.300030';
-}
 # ABSTRACT: something used as a delegating agent to 'dzil test'
+$Dist::Zilla::Role::TestRunner::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role have their C<test> method called when
+#pod testing.  It's passed the root directory of the build test dir and an
+#pod optional hash reference of arguments.  Valid arguments include:
+#pod
+#pod =for :list
+#pod * jobs -- if parallel testing is supported, this indicates how many to run at once
+#pod
+#pod =method test
+#pod
+#pod This method should throw an exception on failure.
+#pod
+#pod =cut
 
 requires 'test';
 
+#pod =attr default_jobs
+#pod
+#pod This attribute is the default value that should be used as the C<jobs> argument
+#pod to the C<test> method.
+#pod
+#pod =cut
+
+has default_jobs => (
+  is      => 'ro',
+  isa     => 'Int', # non-negative
+  default => 1,
+);
+
+around dump_config => sub {
+  my ($orig, $self) = @_;
+  my $config = $self->$orig;
+
+  $config->{'' . __PACKAGE__} = { default_jobs => $self->default_jobs };
+
+  return $config;
+};
+
 1;
 
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::TestRunner - something used as a delegating agent to 'dzil test'
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
 Plugins implementing this role have their C<test> method called when
-testing.  It's passed the root directory of the build test dir.
+testing.  It's passed the root directory of the build test dir and an
+optional hash reference of arguments.  Valid arguments include:
+
+=over 4
+
+=item *
+
+jobs -- if parallel testing is supported, this indicates how many to run at once
+
+=back
+
+=head1 ATTRIBUTES
+
+=head2 default_jobs
+
+This attribute is the default value that should be used as the C<jobs> argument
+to the C<test> method.
 
 =head1 METHODS
 
@@ -42,7 +94,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,15 +1,26 @@
 package Dist::Zilla::Role::TextTemplate;
-{
-  $Dist::Zilla::Role::TextTemplate::VERSION = '4.300030';
-}
 # ABSTRACT: something that renders a Text::Template template string
+$Dist::Zilla::Role::TextTemplate::VERSION = '5.025';
 use Moose::Role;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing TextTemplate may call their own C<L</fill_in_string>>
+#pod method to render templates using L<Text::Template|Text::Template>.
+#pod
+#pod =cut
 
 use Text::Template;
 
+#pod =attr delim
+#pod
+#pod This attribute (which can't easily be set!) is a two-element array reference
+#pod returning the Text::Template delimiters to use.  It defaults to C<{{> and
+#pod C<}}>.
+#pod
+#pod =cut
 
 # XXX: Later, add a way to set this in config. -- rjbs, 2008-06-02
 has delim => (
@@ -20,6 +31,18 @@ has delim => (
   default  => sub { [ qw(  {{  }}  ) ] },
 );
 
+#pod =method fill_in_string
+#pod
+#pod   my $rendered = $plugin->fill_in_string($template, \%stash, \%arg);
+#pod
+#pod This uses Text::Template to fill in the given template using the variables
+#pod given in the C<%stash>.  The stash becomes the HASH argument to Text::Template,
+#pod so scalars must be scalar references rather than plain scalars.
+#pod
+#pod C<%arg> is dereferenced and passed in as extra arguments to Text::Template's
+#pod C<fill_in_string> routine.
+#pod
+#pod =cut
 
 sub fill_in_string {
   my ($self, $string, $stash, $arg) = @_;
@@ -52,13 +75,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::TextTemplate - something that renders a Text::Template template string
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -92,7 +117,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,29 +1,46 @@
 package Dist::Zilla::Role::VersionProvider;
-{
-  $Dist::Zilla::Role::VersionProvider::VERSION = '4.300030';
-}
 # ABSTRACT: something that provides a version number for the dist
+$Dist::Zilla::Role::VersionProvider::VERSION = '5.025';
 use Moose::Role;
 with 'Dist::Zilla::Role::Plugin';
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Plugins implementing this role must provide a C<provide_version> method that
+#pod will be called when setting the dist's version.
+#pod
+#pod If a VersionProvider offers a version but one has already been set, an
+#pod exception will be raised.  If C<provides_version> returns undef, it will be
+#pod ignored.
+#pod
+#pod =cut
 
 requires 'provide_version';
 
 1;
 
+#pod =head1 SEE ALSO
+#pod
+#pod Core Dist::Zilla plugins implementing this role:
+#pod L<AutoVersion|Dist::Zilla::Plugin::AutoVersion>.
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Role::VersionProvider - something that provides a version number for the dist
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -45,7 +62,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -0,0 +1,51 @@
+package Dist::Zilla::Stash::Mint;
+# ABSTRACT: a stash of your default minting provider/profile
+$Dist::Zilla::Stash::Mint::VERSION = '5.025';
+use Moose;
+with 'Dist::Zilla::Role::Stash';
+
+use namespace::autoclean;
+
+has provider => (
+  is  => 'ro',
+  isa => 'Str',
+  required => 0,
+  default => 'Default',
+);
+
+has profile => (
+  is  => 'ro',
+  isa => 'Str',
+  required => 0,
+  default => 'default',
+);
+
+__PACKAGE__->meta->make_immutable;
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Dist::Zilla::Stash::Mint - a stash of your default minting provider/profile
+
+=head1 VERSION
+
+version 5.025
+
+=head1 AUTHOR
+
+Ricardo SIGNES <rjbs@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Ricardo SIGNES.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
@@ -1,12 +1,16 @@
 package Dist::Zilla::Stash::PAUSE;
-{
-  $Dist::Zilla::Stash::PAUSE::VERSION = '4.300030';
-}
-use Moose;
 # ABSTRACT: a stash of your PAUSE credentials
+$Dist::Zilla::Stash::PAUSE::VERSION = '5.025';
+use Moose;
 
 use namespace::autoclean;
 
+#pod =head1 OVERVIEW
+#pod
+#pod The PAUSE stash is a L<Login|Dist::Zilla::Role::Stash::Login> stash generally
+#pod used for uploading to PAUSE.
+#pod
+#pod =cut
 
 sub mvp_aliases {
   return { user => 'username' };
@@ -32,13 +36,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Stash::PAUSE - a stash of your PAUSE credentials
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -51,7 +57,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,8 @@
 package Dist::Zilla::Stash::Rights;
-{
-  $Dist::Zilla::Stash::Rights::VERSION = '4.300030';
-}
+# ABSTRACT: a stash of your default licensing terms
+$Dist::Zilla::Stash::Rights::VERSION = '5.025';
 use Moose;
 with 'Dist::Zilla::Role::Stash';
-# ABSTRACT: a stash of your default licensing terms
 
 use namespace::autoclean;
 
@@ -32,13 +30,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Stash::Rights - a stash of your default licensing terms
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -46,7 +46,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,9 +1,7 @@
 package Dist::Zilla::Stash::User;
-{
-  $Dist::Zilla::Stash::User::VERSION = '4.300030';
-}
-use Moose;
 # ABSTRACT: a stash of user name and email
+$Dist::Zilla::Stash::User::VERSION = '5.025';
+use Moose;
 
 use namespace::autoclean;
 
@@ -32,13 +30,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Stash::User - a stash of user name and email
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -46,7 +46,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,11 @@
 package Dist::Zilla::Tester;
-{
-  $Dist::Zilla::Tester::VERSION = '4.300030';
-}
+# ABSTRACT: a testing-enabling stand-in for Dist::Zilla
+$Dist::Zilla::Tester::VERSION = '5.025';
 use Moose;
 extends 'Dist::Zilla::Dist::Builder';
-# ABSTRACT: a testing-enabling stand-in for Dist::Zilla
 
 # XXX: Adding this autoclean causes problem.  "Builder" and "Minter" do not
-# show in in tests.  I'm really not sure why. -- rjbs, 2011-08-19
+# show in tests.  I'm really not sure why. -- rjbs, 2011-08-19
 # use namespace::autoclean;
 
 use autodie;
@@ -15,6 +13,7 @@ use Dist::Zilla::Chrome::Test;
 use File::pushd ();
 use File::Spec;
 use File::Temp;
+use Path::Tiny;
 
 use Sub::Exporter::Util ();
 use Sub::Exporter -setup => {
@@ -36,12 +35,33 @@ sub builder { 'Dist::Zilla::Tester::_Builder' }
 sub minter { 'Dist::Zilla::Tester::_Minter' }
 
 {
-  package Dist::Zilla::Tester::_Role;
-{
-  $Dist::Zilla::Tester::_Role::VERSION = '4.300030';
-}
+  package
+    Dist::Zilla::Tester::_Role;
+
   use Moose::Role;
 
+  has tempdir_root => (
+    is => 'rw', isa => 'Str|Undef',
+    writer => '_set_tempdir_root',
+  );
+  has tempdir_obj => (
+    is => 'ro', isa => 'File::Temp::Dir',
+    clearer => '_clear_tempdir_obj',
+    writer => '_set_tempdir_obj',
+  );
+
+  sub DEMOLISH {}
+  around DEMOLISH => sub {
+    my $orig = shift;
+    my $self = shift;
+
+    # File::Temp deletes the directory when it goes out of scope
+    $self->_clear_tempdir_obj;
+
+    rmdir $self->tempdir_root if $self->tempdir_root;
+    return $self->$orig(@_);
+  };
+
   has tempdir => (
     is   => 'ro',
     writer   => '_set_tempdir',
@@ -66,14 +86,17 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
   sub slurp_file {
     my ($self, $filename) = @_;
 
-    return scalar do {
-      local $/;
-      open my $fh, '<', $self->tempdir->file($filename);
+    Path::Tiny::path(
+      $self->tempdir->file($filename)
+    )->slurp_utf8;
+  }
 
-      # Win32.
-      binmode $fh, ':raw';
-      <$fh>;
-    };
+  sub slurp_file_raw {
+    my ($self, $filename) = @_;
+
+    Path::Tiny::path(
+      $self->tempdir->file($filename)
+    )->slurp_raw;
   }
 
   sub _metadata_generator_id { 'Dist::Zilla::Tester' }
@@ -83,10 +106,8 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
 
 {
   package Dist::Zilla::Tester::_Builder;
-{
-  $Dist::Zilla::Tester::_Builder::VERSION = '4.300030';
-}
-  use Moose;
+$Dist::Zilla::Tester::_Builder::VERSION = '5.025';
+use Moose;
   extends 'Dist::Zilla::Dist::Builder';
   with 'Dist::Zilla::Tester::_Role';
 
@@ -106,10 +127,11 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
 
     mkdir $tempdir_root if defined $tempdir_root and not -d $tempdir_root;
 
-    my $tempdir = dir( File::Temp::tempdir(
+    my $tempdir_obj = File::Temp->newdir(
         CLEANUP => 1,
         (defined $tempdir_root ? (DIR => $tempdir_root) : ()),
-    ))->absolute;
+    );
+    my $tempdir = dir($tempdir_obj)->absolute;
 
     my $root = $tempdir->subdir('source');
     $root->mkpath;
@@ -124,15 +146,12 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
 
     if (my $files = $tester_arg->{add_files}) {
       while (my ($name, $content) = each %$files) {
-        my $fn = $tempdir->file($name);
+        die "File name '$name' does not seem to be legal on the current OS"
+          if !path_looks_legal($name);
+        my $unix_name = Path::Class::File->new_foreign("Unix", $name);
+        my $fn = $tempdir->file($unix_name);
         $fn->dir->mkpath;
-        open my $fh, '>', $fn;
-
-        # Win32 fix for crlf translation.
-        #   maybe :raw:utf8? -- Kentnl - 2010-06-10
-        binmode $fh, ':raw';
-        print { $fh } $content;
-        close $fh;
+        Path::Tiny::path($fn)->spew_utf8($content);
       }
     }
 
@@ -141,8 +160,12 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
 
     local @INC = map {; ref($_) ? $_ : File::Spec->rel2abs($_) } @INC;
 
+    local $ENV{DZIL_GLOBAL_CONFIG_ROOT} = $tester_arg->{global_config_root};
+
     my $zilla = $self->$orig($arg);
 
+    $zilla->_set_tempdir_root($tempdir_root);
+    $zilla->_set_tempdir_obj($tempdir_obj);
     $zilla->_set_tempdir($tempdir);
 
     return $zilla;
@@ -175,14 +198,21 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
   };
 
   no Moose;
+
+  sub path_looks_legal {
+    return 1 if $^O eq "linux";
+    my ($path) = @_;
+    my $unix_path = Path::Class::File->new_foreign("Unix", $path)->stringify;
+    return 0 if $path ne $unix_path;
+    my $round_tripped = file($path)->as_foreign("Unix")->stringify;
+    return $path eq $round_tripped;
+  }
 }
 
 {
   package Dist::Zilla::Tester::_Minter;
-{
-  $Dist::Zilla::Tester::_Minter::VERSION = '4.300030';
-}
-  use Moose;
+$Dist::Zilla::Tester::_Minter::VERSION = '5.025';
+use Moose;
   extends 'Dist::Zilla::Dist::Minter';
   with 'Dist::Zilla::Tester::_Role';
 
@@ -232,10 +262,11 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
 
     mkdir $tempdir_root if defined $tempdir_root and not -d $tempdir_root;
 
-    my $tempdir = dir( File::Temp::tempdir(
+    my $tempdir_obj = File::Temp->newdir(
         CLEANUP => 1,
         (defined $tempdir_root ? (DIR => $tempdir_root) : ()),
-    ))->absolute;
+    );
+    my $tempdir = dir($tempdir_obj)->absolute;
 
     local $arg->{chrome} = Dist::Zilla::Chrome::Test->new;
 
@@ -252,6 +283,8 @@ sub minter { 'Dist::Zilla::Tester::_Minter' }
 
     my $zilla = $self->$orig($profile_data, $arg);
 
+    $zilla->_set_tempdir_root($tempdir_root);
+    $zilla->_set_tempdir_obj($tempdir_obj);
     $zilla->_set_tempdir($tempdir);
 
     return $zilla;
@@ -266,13 +299,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Tester - a testing-enabling stand-in for Dist::Zilla
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -280,7 +315,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,25 +1,154 @@
 use strict;
 use warnings;
 package Dist::Zilla::Tutorial;
-{
-  $Dist::Zilla::Tutorial::VERSION = '4.300030';
-}
 # ABSTRACT: how to use this "Dist::Zilla" thing
+$Dist::Zilla::Tutorial::VERSION = '5.025';
 use Carp ();
 Carp::confess "you're not meant to use the tutorial, just read it!";
 1;
 
+#pod =head1 SYNOPSIS
+#pod
+#pod B<BEFORE YOU GET STARTED>:  Maybe you should be looking at the web-based
+#pod tutorial instead.  It's more complete.  L<http://dzil.org/tutorial/start.html>
+#pod
+#pod Dist::Zilla builds distributions to be uploaded to the CPAN.  That means that
+#pod the first thing you'll need is some code.
+#pod
+#pod Once you've got that, you'll need to configure Dist::Zilla.  Here's a simple
+#pod F<dist.ini>:
+#pod
+#pod   name    = Carbon-Dating
+#pod   version = 0.003
+#pod   author  = Alan Smithee <asmithee@example.org>
+#pod   license = Perl_5
+#pod   copyright_holder = Alan Smithee
+#pod
+#pod   [@Basic]
+#pod
+#pod   [Prereqs]
+#pod   App::Cmd          = 0.013
+#pod   Number::Nary      = 0
+#pod   Sub::Exporter     = 0.981
+#pod
+#pod The topmost section configures Dist::Zilla itself.  Here are some of the
+#pod entries it expects:
+#pod
+#pod   name     - (required) the name of the dist being built
+#pod   version  - (required) the version of the dist
+#pod   abstract - (required) a short description of the dist
+#pod   author   - (optional) the dist author (you may have multiple entries for this)
+#pod   license  - (required) the dist license; must be a Software::License::* name
+#pod
+#pod   copyright_holder - (required) the entity holding copyright on the dist
+#pod
+#pod Some of the required values above may actually be provided by means other than
+#pod the top-level section of the config.  For example,
+#pod L<VersionProvider|Dist::Zilla::Role::VersionProvider> plugins can
+#pod set the version, and a line like this in the "main module" of the dist will set
+#pod the abstract:
+#pod
+#pod   # ABSTRACT: a totally cool way to do totally great stuff
+#pod
+#pod The main modules is the module that shares the same name as the dist, in
+#pod general.
+#pod
+#pod Named sections load plugins, with the following rules:
+#pod
+#pod If a section name begins with an equals sign (C<=>), the rest of the section
+#pod name is left intact and not expanded.  If the section name begins with an at
+#pod sign (C<@>), it is prepended with C<Dist::Zilla::PluginBundle::>.  Otherwise,
+#pod it is prepended with C<Dist::Zilla::Plugin::>.
+#pod
+#pod The values inside a section are given as configuration to the plugin.  Consult
+#pod each plugin's documentation for more information.
+#pod
+#pod The "Basic" bundle, seen above, builds a fairly normal distribution.  It
+#pod rewrites tests from F<./xt>, adds some information to POD, and builds a
+#pod F<Makefile.PL>.  For more information, you can look at the docs for
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic> and see the plugins it includes.
+#pod
+#pod =head1 BUILDING YOUR DIST
+#pod
+#pod Maybe we're getting ahead of ourselves, here.  Configuring a bunch of plugins
+#pod won't do you a lot of good unless you know how to use them to build your dist.
+#pod
+#pod Dist::Zilla ships with a command called F<dzil> that will get installed by
+#pod default.  While it can be extended to offer more commands, there are two really
+#pod useful ones:
+#pod
+#pod   $ dzil build
+#pod
+#pod The C<build> command will build the distribution.  Say you're using the
+#pod configuration in the SYNOPSIS above.  You'll end up with a file called
+#pod F<Carbon-Dating-0.004.tar.gz>.  As long as you've done everything right, it
+#pod will be suitable for uploading to the CPAN.
+#pod
+#pod Of course, you should really test it out first.  You can test the dist you'd be
+#pod building by running another F<dzil> command:
+#pod
+#pod   $ dzil test
+#pod
+#pod This will build a new copy of your distribution and run its tests, so you'll
+#pod know whether the dist that C<build> would build is worth releasing!
+#pod
+#pod =head1 HOW BUILDS GET BUILT
+#pod
+#pod This is really more of a sketchy overview than a spec.
+#pod
+#pod First, all the plugins that perform the
+#pod L<BeforeBuild|Dist::Zilla::Role::BeforeBuild> perform their C<before_build>
+#pod tasks.
+#pod
+#pod The build root (where the dist is being built) is made.
+#pod
+#pod The L<FileGatherer|Dist::Zilla::Role::FileGatherer>s gather and inject files
+#pod into the distribution, then the L<FilePruner|Dist::Zilla::Role::FilePruner>s
+#pod remove some of them.
+#pod
+#pod All the L<FileMunger|Dist::Zilla::Role::FileMunger>s get a chance to muck about
+#pod with each file, possibly changing its name, content, or installability.
+#pod
+#pod Now that the distribution is basically set up, it needs an install tool, like a
+#pod F<Makefile.PL>.  All the
+#pod L<InstallTool|Dist::Zilla::Role::InstallTool>-performing plugins are used to
+#pod do whatever is needed to make the dist installable.
+#pod
+#pod Everything is just about done.  The files are all written out to disk and the
+#pod L<AfterBuild|Dist::Zilla::Role::AfterBuild> plugins do their thing.
+#pod
+#pod =head1 RELEASING YOUR DIST
+#pod
+#pod By running C<dzil release>, you'll test your
+#pod distribution, build a tarball of it, and upload it to the CPAN.  Plugins are
+#pod able to do things like check your version control system to make sure you're
+#pod releasing a new version and that you tag the version you've just uploaded.  It
+#pod can also update your Changelog file, too, making sure that you don't need to
+#pod know what your next version number will be before releasing.
+#pod
+#pod The final CPAN release process is implemented by the
+#pod L<UploadToCPAN|Dist::Zilla::Plugin::UploadToCPAN> plugin. However you can
+#pod replace it by your own to match your own (company?) process.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod L<dzil>
+#pod
+#pod =cut
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Tutorial - how to use this "Dist::Zilla" thing
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 SYNOPSIS
 
@@ -40,7 +169,7 @@ F<dist.ini>:
 
   [@Basic]
 
-  [Prereq]
+  [Prereqs]
   App::Cmd          = 0.013
   Number::Nary      = 0
   Sub::Exporter     = 0.981
@@ -133,7 +262,7 @@ L<AfterBuild|Dist::Zilla::Role::AfterBuild> plugins do their thing.
 
 =head1 RELEASING YOUR DIST
 
-By running C<dzil release>, you'll can test your
+By running C<dzil release>, you'll test your
 distribution, build a tarball of it, and upload it to the CPAN.  Plugins are
 able to do things like check your version control system to make sure you're
 releasing a new version and that you tag the version you've just uploaded.  It
@@ -154,7 +283,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,17 @@
 package Dist::Zilla::Types;
-{
-  $Dist::Zilla::Types::VERSION = '4.300030';
-}
 # ABSTRACT: dzil-specific type library
-
+$Dist::Zilla::Types::VERSION = '5.025';
 use namespace::autoclean;
 
+#pod =head1 OVERVIEW
+#pod
+#pod This library provides L<MooseX::Types> types for use by Dist::Zilla.  These
+#pod types are not (yet?) for public consumption, and you should not rely on them.
+#pod
+#pod Dist::Zilla uses a number of types found in L<MooseX::Types::Perl>.  Maybe
+#pod that's what you want.
+#pod
+#pod =cut
 
 use MooseX::Types -declare => [qw(License OneZero YesNoStr)];
 use MooseX::Types::Moose qw(Str Int);
@@ -24,13 +30,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Types - dzil-specific type library
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 OVERVIEW
 
@@ -46,7 +54,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,10 @@
 use strict;
 use warnings;
 package Dist::Zilla::Util::AuthorDeps;
-{
-  $Dist::Zilla::Util::AuthorDeps::VERSION = '4.300030';
-}
 # ABSTRACT: Utils for listing your distribution's author dependencies
-
+$Dist::Zilla::Util::AuthorDeps::VERSION = '5.025';
 use Dist::Zilla::Util;
-use Path::Class;
+use Path::Tiny;
 use List::MoreUtils ();
 
 
@@ -26,12 +23,12 @@ sub format_author_deps {
 sub extract_author_deps {
   my ($root, $missing) = @_;
 
-  my $ini = $root->file('dist.ini');
+  my $ini = path($root, 'dist.ini');
 
   die "dzil authordeps only works on dist.ini files, and you don't have one\n"
     unless -e $ini;
 
-  my $fh = $ini->openr;
+  my $fh = $ini->openr_utf8;
 
   require Config::INI::Reader;
   my $config = Config::INI::Reader->read_handle($fh);
@@ -39,17 +36,14 @@ sub extract_author_deps {
   require CPAN::Meta::Requirements;
   my $reqs = CPAN::Meta::Requirements->new;
 
-  my @packs =
-    map  { s/\s.*//; $_ }
-    grep { $_ ne '_' }
-    keys %$config;
-
-  foreach my $pack (@packs) {
+  for my $section ( sort keys %$config ) {
+    next if q[_] eq $section;
+    my $pack = $section;
+    $pack =~ s{\s*/.*$}{}; # trim optional space and slash-delimited suffix
 
     my $version = 0;
-    if(exists $config->{$pack} && exists $config->{$pack}->{':version'}) {
-      $version = $config->{$pack}->{':version'};
-    }
+    $version = $config->{$section}->{':version'} if exists $config->{$section}->{':version'};
+
     my $realname = Dist::Zilla::Util->expand_config_package_name($pack);
     $reqs->add_minimum($realname => $version);
   }
@@ -89,8 +83,8 @@ sub extract_author_deps {
 
   # Move inc:: first in list as they may impact the loading of other
   # plugins (in particular local ones).
-  # Also order inc:: so that thoses that want to hack @INC with inc:: plugins
-  # can have a consistant playground.
+  # Also order inc:: so that those that want to hack @INC with inc:: plugins
+  # can have a consistent playground.
   # We don't sort the others packages to preserve the same (random) ordering
   # for the common case (no inc::, no '; authordep') as in previous dzil
   # releases.
@@ -103,7 +97,13 @@ sub extract_author_deps {
 
   my @final =
     map { { $_ => $vermap->{$_} } }
-    grep { $missing ? (! Class::Load::try_load_class($_, ($vermap->{$_} ? {-version => $vermap->{$_}} : ()))) : 1 }
+    grep {
+      $missing
+        ? $_ eq 'perl'
+          ? ($vermap->{perl} ? !eval "use $vermap->{perl}; 1" : ())
+          : (! Class::Load::try_load_class($_, ($vermap->{$_} ? {-version => $vermap->{$_}} : ())))
+        : 1
+      }
     List::MoreUtils::uniq
     @packages;
 
@@ -116,13 +116,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Util::AuthorDeps - Utils for listing your distribution's author dependencies
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 AUTHOR
 
@@ -130,7 +132,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,10 @@
 use strict;
 use warnings;
 package Dist::Zilla::Util;
-{
-  $Dist::Zilla::Util::VERSION = '4.300030';
-}
 # ABSTRACT: random snippets of code that Dist::Zilla wants
-
+$Dist::Zilla::Util::VERSION = '5.025';
 use Carp ();
+use Encode ();
 use String::RewritePrefix 0.002; # better string context behavior
 
 {
@@ -26,7 +24,7 @@ use String::RewritePrefix 0.002; # better string context behavior
     my ($self, $event) = @_;
     return if $self->{abstract};
     return $self->{abstract} = $1
-      if $event->{content}=~ /^\s*#+\s*ABSTRACT:\s*(.+)$/m;
+      if $event->{content}=~ /^\s*#+\s*ABSTRACT:[ \t]*(\S.*)$/m;
     return;
   }
   sub handle_event {
@@ -49,18 +47,47 @@ use String::RewritePrefix 0.002; # better string context behavior
       and $event->{content} =~ /^(?:\S+\s+)+?-+\s+(.+)\n$/s
     ) {
       $self->{abstract} = $1;
+      $self->{abstract} =~ s/\s+/\x20/g;
     }
   }
 }
 
+#pod =method abstract_from_file
+#pod
+#pod This method, I<which is likely to change or go away>, tries to guess the
+#pod abstract of a given file, assuming that it's Perl code.  It looks for a POD
+#pod C<=head1> section called "NAME" or a comment beginning with C<ABSTRACT:>.
+#pod
+#pod =cut
 
 sub abstract_from_file {
   my ($self, $file) = @_;
   my $e = Dist::Zilla::Util::PEA->_new;
-  $e->read_string($file->content);
+
+  my $chars = $file->content;
+  my $bytes = Encode::encode('UTF-8', $chars, Encode::FB_CROAK);
+
+  $e->read_string($bytes);
+
   return $e->{abstract};
 }
 
+#pod =method expand_config_package_name
+#pod
+#pod   my $pkg_name = Util->expand_config_package_name($string);
+#pod
+#pod This method, I<which is likely to change or go away>, rewrites the given string
+#pod into a package name.
+#pod
+#pod Prefixes are rewritten as follows:
+#pod
+#pod =for :list
+#pod * C<=> becomes nothing
+#pod * C<@> becomes C<Dist::Zilla::PluginBundle::>
+#pod * C<%> becomes C<Dist::Zilla::Stash::>
+#pod * otherwise, C<Dist::Zilla::Plugin::> is prepended
+#pod
+#pod =cut
 
 sub expand_config_package_name {
   my ($self, $package) = @_;
@@ -99,8 +126,8 @@ sub _assert_loaded_class_version_ok {
 
   my $have_version = $pkg->VERSION;
   unless ($req->accepts_module($pkg => $have_version)) {
-    Carp::confess( sprintf
-      "%s version (%s) not match required version: %s",
+    die( sprintf
+      "%s version (%s) does not match required version: %s\n",
       $pkg,
       $have_version,
       $version,
@@ -114,13 +141,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla::Util - random snippets of code that Dist::Zilla wants
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 METHODS
 
@@ -135,8 +164,29 @@ C<=head1> section called "NAME" or a comment beginning with C<ABSTRACT:>.
   my $pkg_name = Util->expand_config_package_name($string);
 
 This method, I<which is likely to change or go away>, rewrites the given string
-into a package name.  Consult L<Dist::Zilla::Config|Dist::Zilla::Config> for
-more information.
+into a package name.
+
+Prefixes are rewritten as follows:
+
+=over 4
+
+=item *
+
+C<=> becomes nothing
+
+=item *
+
+C<@> becomes C<Dist::Zilla::PluginBundle::>
+
+=item *
+
+C<%> becomes C<Dist::Zilla::Stash::>
+
+=item *
+
+otherwise, C<Dist::Zilla::Plugin::> is prepended
+
+=back
 
 =head1 AUTHOR
 
@@ -144,7 +194,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,11 @@
 package Dist::Zilla;
-{
-  $Dist::Zilla::VERSION = '4.300030';
-}
 # ABSTRACT: distribution builder; installer not included!
+$Dist::Zilla::VERSION = '5.025';
 use Moose 0.92; # role composition fixes
 with 'Dist::Zilla::Role::ConfigDumper';
 
+# This comment has fün̈n̈ÿ characters.
+
 use Moose::Autobox 0.09; # ->flatten
 use MooseX::Types::Moose qw(ArrayRef Bool HashRef Object Str);
 use MooseX::Types::Perl qw(DistName LaxVersionStr);
@@ -14,9 +14,9 @@ use Moose::Util::TypeConstraints;
 
 use Dist::Zilla::Types qw(License);
 
-use Hash::Merge::Simple ();
 use Log::Dispatchouli 1.100712; # proxy_loggers, quiet_fatal
 use Path::Class;
+use Path::Tiny;
 use List::Util qw(first);
 use Software::License 0.101370; # meta2_name
 use String::RewritePrefix;
@@ -29,6 +29,21 @@ use Dist::Zilla::Util;
 
 use namespace::autoclean;
 
+#pod =head1 DESCRIPTION
+#pod
+#pod Dist::Zilla builds distributions of code to be uploaded to the CPAN.  In this
+#pod respect, it is like L<ExtUtils::MakeMaker>, L<Module::Build>, or
+#pod L<Module::Install>.  Unlike those tools, however, it is not also a system for
+#pod installing code that has been downloaded from the CPAN.  Since it's only run by
+#pod authors, and is meant to be run on a repository checkout rather than on
+#pod published, released code, it can do much more than those tools, and is free to
+#pod make much more ludicrous demands in terms of prerequisites.
+#pod
+#pod If you have access to the web, you can learn more and find an interactive
+#pod tutorial at B<L<dzil.org|http://dzil.org/>>.  If not, try
+#pod L<Dist::Zilla::Tutorial>.
+#pod
+#pod =cut
 
 has chrome => (
   is  => 'rw',
@@ -36,6 +51,13 @@ has chrome => (
   required => 1,
 );
 
+#pod =attr name
+#pod
+#pod The name attribute (which is required) gives the name of the distribution to be
+#pod built.  This is usually the name of the distribution's main module, with the
+#pod double colons (C<::>) replaced with dashes.  For example: C<Dist-Zilla>.
+#pod
+#pod =cut
 
 has name => (
   is   => 'ro',
@@ -44,6 +66,11 @@ has name => (
   builder => '_build_name',
 );
 
+#pod =attr version
+#pod
+#pod This is the version of the distribution to be created.
+#pod
+#pod =cut
 
 has _version_override => (
   isa => LaxVersionStr,
@@ -95,6 +122,12 @@ sub _build_version {
   $version;
 }
 
+#pod =attr abstract
+#pod
+#pod This is a one-line summary of the distribution.  If none is given, one will be
+#pod looked for in the L</main_module> of the dist.
+#pod
+#pod =cut
 
 has abstract => (
   is   => 'rw',
@@ -108,7 +141,7 @@ has abstract => (
     }
 
     my $file = $self->main_module;
-    $self->log("extracting distribution abstract from " . $file->name);
+    $self->log_debug("extracting distribution abstract from " . $file->name);
     my $abstract = Dist::Zilla::Util->abstract_from_file($file);
 
     if (!defined($abstract)) {
@@ -122,6 +155,20 @@ has abstract => (
   }
 );
 
+#pod =attr main_module
+#pod
+#pod This is the module where Dist::Zilla might look for various defaults, like
+#pod the distribution abstract.  By default, it's derived from the distribution
+#pod name.  If your distribution is Foo-Bar, and F<lib/Foo/Bar.pm> exists,
+#pod that's the main_module.  Otherwise, it's the shortest-named module in the
+#pod distribution.  This may change!
+#pod
+#pod You can override the default by specifying the file path explicitly,
+#pod ie:
+#pod
+#pod   main_module = lib/Foo/Bar.pm
+#pod
+#pod =cut
 
 has _main_module_override => (
   isa => 'Str',
@@ -140,14 +187,13 @@ has main_module => (
     my ($self) = @_;
 
     my $file;
-    my $guessing = q{};
     my $guess;
 
     if ( $self->_has_main_module_override ) {
        $file = first { $_->name eq $self->_main_module_override }
                $self->files->flatten;
     } else {
-       $guessing = 'guessing '; # We're having to guess
+       # We're having to guess
 
        ($guess = $self->name) =~ s{-}{/}g;
        $guess = "lib/$guess.pm";
@@ -157,6 +203,7 @@ has main_module => (
              ->grep(sub { $_->name =~ m{\.pm\z} and $_->name =~ m{\Alib/} })
              ->sort(sub { length $_[0]->name <=> length $_[1]->name })
              ->head;
+       $self->log("guessing dist's main_module is " . ($file ? $file->name : $guess));
     }
 
     if (not $file) {
@@ -176,12 +223,25 @@ has main_module => (
         push @errorlines,"Cannot continue without a main_module";
         $self->log_fatal( join qq{\n}, @errorlines );
     }
-    $self->log("${guessing}dist's main_module is " . $file->name);
+    $self->log_debug("dist's main_module is " . $file->name);
 
     return $file;
   },
 );
 
+#pod =attr license
+#pod
+#pod This is the L<Software::License|Software::License> object for this dist's
+#pod license and copyright.
+#pod
+#pod It will be created automatically, if possible, with the
+#pod C<copyright_holder> and C<copyright_year> attributes.  If necessary, it will
+#pod try to guess the license from the POD of the dist's main module.
+#pod
+#pod A better option is to set the C<license> name in the dist's config to something
+#pod understandable, like C<Perl_5>.
+#pod
+#pod =cut
 
 has license => (
   is   => 'ro',
@@ -238,7 +298,8 @@ sub _build_license {
     if (@guess != 1) {
       $self->log_fatal(
         "no license data in config, no %Rights stash,",
-        "couldn't make a good guess at license from Pod; giving up"
+        "couldn't make a good guess at license from Pod; giving up. ",
+        "Perhaps you need to set up a global config file (dzil setup)?"
       );
     }
 
@@ -247,7 +308,7 @@ sub _build_license {
     $self->log("based on POD in $filename, guessing license is $guess[0]");
   }
 
-  Class::MOP::load_class($license_class);
+  Class::Load::load_class($license_class);
 
   my $license = $license_class->new({
     holder => $self->_copyright_holder,
@@ -307,6 +368,18 @@ has _copyright_year => (
   }
 );
 
+#pod =attr authors
+#pod
+#pod This is an arrayref of author strings, like this:
+#pod
+#pod   [
+#pod     'Ricardo Signes <rjbs@cpan.org>',
+#pod     'X. Ample, Jr <example@example.biz>',
+#pod   ]
+#pod
+#pod This is likely to change at some point in the near future.
+#pod
+#pod =cut
 
 has authors => (
   is   => 'ro',
@@ -329,6 +402,16 @@ has authors => (
   },
 );
 
+#pod =attr files
+#pod
+#pod This is an arrayref of objects implementing L<Dist::Zilla::Role::File> that
+#pod will, if left in this arrayref, be built into the dist.
+#pod
+#pod Non-core code should avoid altering this arrayref, but sometimes there is not
+#pod other way to change the list of files.  In the future, the representation used
+#pod for storing files B<will be changed>.
+#pod
+#pod =cut
 
 has files => (
   is   => 'ro',
@@ -351,6 +434,12 @@ sub prune_file {
   return;
 }
 
+#pod =attr root
+#pod
+#pod This is the root directory of the dist, as a L<Path::Class::Dir>.  It will
+#pod nearly always be the current working directory in which C<dzil> was run.
+#pod
+#pod =cut
 
 has root => (
   is   => 'ro',
@@ -359,6 +448,11 @@ has root => (
   required => 1,
 );
 
+#pod =attr is_trial
+#pod
+#pod This attribute tells us whether or not the dist will be a trial release.
+#pod
+#pod =cut
 
 has is_trial => (
   is => 'rw', # XXX: make SetOnce -- rjbs, 2010-03-23
@@ -366,6 +460,15 @@ has is_trial => (
   default => sub { $ENV{TRIAL} ? 1 : 0 }
 );
 
+#pod =attr plugins
+#pod
+#pod This is an arrayref of plugins that have been plugged into this Dist::Zilla
+#pod object.
+#pod
+#pod Non-core code B<must not> alter this arrayref.  Public access to this attribute
+#pod B<may go away> in the future.
+#pod
+#pod =cut
 
 has plugins => (
   is   => 'ro',
@@ -374,6 +477,13 @@ has plugins => (
   default  => sub { [ ] },
 );
 
+#pod =attr distmeta
+#pod
+#pod This is a hashref containing the metadata about this distribution that will be
+#pod stored in META.yml or META.json.  You should not alter the metadata in this
+#pod hash; use a MetaProvider plugin instead.
+#pod
+#pod =cut
 
 has distmeta => (
   is   => 'ro',
@@ -386,16 +496,18 @@ has distmeta => (
 sub _build_distmeta {
   my ($self) = @_;
 
+  require CPAN::Meta::Merge;
+  my $meta_merge = CPAN::Meta::Merge->new(default_version => 2);
   my $meta = {
     'meta-spec' => {
       version => 2,
-      url     => 'http://github.com/dagolden/cpan-meta/',
+      url     => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
     },
     name     => $self->name,
     version  => $self->version,
     abstract => $self->abstract,
     author   => $self->authors,
-    license  => $self->license->meta2_name,
+    license  => [ $self->license->meta2_name ],
 
     # XXX: what about unstable?
     release_status => ($self->is_trial or $self->version =~ /_/)
@@ -408,23 +520,36 @@ sub _build_distmeta {
                     . (defined $self->VERSION ? $self->VERSION : '(undef)')
   };
 
-  $meta = Hash::Merge::Simple::merge($meta, $_->metadata)
-    for $self->plugins_with(-MetaProvider)->flatten;
+  for ($self->plugins_with(-MetaProvider)->flatten) {
+    $meta = $meta_merge->merge($meta, $_->metadata);
+  }
 
   return $meta;
 }
 
 sub _metadata_generator_id { 'Dist::Zilla' }
 
+#pod =attr prereqs
+#pod
+#pod This is a L<Dist::Zilla::Prereqs> object, which is a thin layer atop
+#pod L<CPAN::Meta::Prereqs>, and describes the distribution's prerequisites.
+#pod
+#pod =cut
 
 has prereqs => (
   is   => 'ro',
   isa  => 'Dist::Zilla::Prereqs',
   init_arg => undef,
+  lazy     => 1,
   default  => sub { Dist::Zilla::Prereqs->new },
   handles  => [ qw(register_prereqs) ],
 );
 
+#pod =method plugin_named
+#pod
+#pod   my $plugin = $zilla->plugin_named( $plugin_name );
+#pod
+#pod =cut
 
 sub plugin_named {
   my ($self, $name) = @_;
@@ -434,6 +559,15 @@ sub plugin_named {
   return;
 }
 
+#pod =method plugins_with
+#pod
+#pod   my $roles = $zilla->plugins_with( -SomeRole );
+#pod
+#pod This method returns an arrayref containing all the Dist::Zilla object's plugins
+#pod that perform a the named role.  If the given role name begins with a dash, the
+#pod dash is replaced with "Dist::Zilla::Role::"
+#pod
+#pod =cut
 
 sub plugins_with {
   my ($self, $role) = @_;
@@ -444,6 +578,16 @@ sub plugins_with {
   return $plugins;
 }
 
+#pod =method find_files
+#pod
+#pod   my $files = $zilla->find_files( $finder_name );
+#pod
+#pod This method will look for a
+#pod L<FileFinder|Dist::Zilla::Role::FileFinder>-performing plugin with the given
+#pod name and return the result of calling C<find_files> on it.  If no plugin can be
+#pod found, an exception will be raised.
+#pod
+#pod =cut
 
 sub find_files {
   my ($self, $finder_name) = @_;
@@ -492,18 +636,24 @@ sub _write_out_file {
 
   Carp::croak("attempted to write $to multiple times") if -e $to;
 
-  open my $out_fh, '>', "$to" or die "couldn't open $to to write: $!";
-
-  # This is needed, or \n is translated to \r\n on win32.
-  # Maybe :raw:utf8 is needed, but not sure.
-  #     -- Kentnl - 2010-06-10
-  binmode( $out_fh , ":raw" );
-
-  print { $out_fh } $file->content;
-  close $out_fh or die "error closing $to: $!";
+  path("$to")->spew_raw( $file->encoded_content );
   chmod $file->mode, "$to" or die "couldn't chmod $to: $!";
 }
 
+#pod =attr logger
+#pod
+#pod This attribute stores a L<Log::Dispatchouli::Proxy> object, used to log
+#pod messages.  By default, a proxy to the dist's L<Chrome|Dist::Zilla::Chrome> is
+#pod taken.
+#pod
+#pod The following methods are delegated from the Dist::Zilla object to the logger:
+#pod
+#pod =for :list
+#pod * log
+#pod * log_debug
+#pod * log_fatal
+#pod
+#pod =cut
 
 has logger => (
   is   => 'ro',
@@ -536,6 +686,15 @@ has _global_stashes => (
   default => sub { {} },
 );
 
+#pod =method stash_named
+#pod
+#pod   my $stash = $zilla->stash_named( $name );
+#pod
+#pod This method will return the stash with the given name, or undef if none exists.
+#pod It looks for a local stash (for this dist) first, then falls back to a global
+#pod stash (from the user's global configuration).
+#pod
+#pod =cut
 
 sub stash_named {
   my ($self, $name) = @_;
@@ -547,17 +706,77 @@ sub stash_named {
 __PACKAGE__->meta->make_immutable;
 1;
 
+#pod =head1 SUPPORT
+#pod
+#pod There are usually people on C<irc.perl.org> in C<#distzilla>, even if they're
+#pod idling.
+#pod
+#pod The L<Dist::Zilla website|http://dzil.org/> has several valuable resources for
+#pod learning to use Dist::Zilla.
+#pod
+#pod There is a mailing list to discuss Dist::Zilla.  You can L<join the
+#pod list|http://www.listbox.com/subscribe/?list_id=139292> or L<browse the
+#pod archives|http://listbox.com/member/archive/139292>.
+#pod
+#pod =head1 SEE ALSO
+#pod
+#pod =over 4
+#pod
+#pod =item *
+#pod
+#pod In the Dist::Zilla distribution:
+#pod
+#pod =over 4
+#pod
+#pod =item *
+#pod
+#pod Plugin bundles:
+#pod L<@Basic|Dist::Zilla::PluginBundle::Basic>,
+#pod L<@Filter|Dist::Zilla::PluginBundle::Filter>.
+#pod
+#pod =item *
+#pod
+#pod Major plugins:
+#pod L<GatherDir|Dist::Zilla::Plugin::GatherDir>,
+#pod L<Prereqs|Dist::Zilla::Plugin::Prereqs>,
+#pod L<AutoPrereqs|Dist::Zilla::Plugin::AutoPrereqs>,
+#pod L<MetaYAML|Dist::Zilla::Plugin::MetaYAML>,
+#pod L<MetaJSON|Dist::Zilla::Plugin::MetaJSON>,
+#pod ...
+#pod
+#pod =back
+#pod
+#pod =item *
+#pod
+#pod On the CPAN:
+#pod
+#pod =over 4
+#pod
+#pod =item *
+#pod
+#pod Search for plugins: L<https://metacpan.org/search?q=Dist::Zilla::Plugin::>
+#pod
+#pod =item *
+#pod
+#pod Search for plugin bundles: L<https://metacpan.org/search?q=Dist::Zilla::PluginBundle::>
+#pod
+#pod =back
+#pod
+#pod =back
+
 __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Dist::Zilla - distribution builder; installer not included!
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -782,7 +1001,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,8 @@
 use strict;
 use warnings;
 package Test::DZil;
-{
-  $Test::DZil::VERSION = '4.300030';
-}
 # ABSTRACT: tools for testing Dist::Zilla plugins
-
+$Test::DZil::VERSION = '5.025';
 use Dist::Zilla::Tester;
 use Params::Util qw(_HASH0);
 use JSON 2;
@@ -26,7 +23,31 @@ use Sub::Exporter -setup => {
   groups  => [ default => [ qw(-all) ] ],
 };
 
-
+#pod =head1 DESCRIPTION
+#pod
+#pod Test::DZil provides routines for writing tests for Dist::Zilla plugins.
+#pod
+#pod =cut
+
+#pod =func Builder
+#pod
+#pod =func Minter
+#pod
+#pod   my $tzil = Builder->from_config(...);
+#pod
+#pod These return class names that subclass L<Dist::Zilla::Dist::Builder> or
+#pod L<Dist::Zilla::Dist::Minter>, respectively, with the L<Dist::Zilla::Tester>
+#pod behavior added.
+#pod
+#pod =func is_filelist
+#pod
+#pod   is_filelist( \@files_we_have, \@files_we_want, $desc );
+#pod
+#pod This test assertion compares two arrayrefs of filenames, taking care of slash
+#pod normalization and sorting.  C<@files_we_have> may also contain objects that
+#pod do L<Dist::Zilla::Role::File>.
+#pod
+#pod =cut
 
 sub is_filelist {
   my ($have, $want, $comment) = @_;
@@ -42,6 +63,14 @@ sub is_filelist {
   Test::More::is_deeply(\@have, \@want, $comment);
 }
 
+#pod =func is_yaml
+#pod
+#pod   is_yaml( $yaml_string, $want_struct, $comment );
+#pod
+#pod This test assertion deserializes the given YAML string and does a
+#pod C<L<cmp_deeply|Test::Deep/cmp_deeply>>.
+#pod
+#pod =cut
 
 sub is_yaml {
   my ($yaml, $want, $comment) = @_;
@@ -53,6 +82,14 @@ sub is_yaml {
   Test::Deep::cmp_deeply($have->[0], $want, $comment);
 }
 
+#pod =func is_json
+#pod
+#pod   is_json( $json_string, $want_struct, $comment );
+#pod
+#pod This test assertion deserializes the given JSON string and does a
+#pod C<L<cmp_deeply|Test::Deep/cmp_deeply>>.
+#pod
+#pod =cut
 
 sub is_json {
   my ($json, $want, $comment) = @_;
@@ -113,11 +150,70 @@ sub _build_ini_builder {
   }
 }
 
+#pod =func dist_ini
+#pod
+#pod   my $ini_text = dist_ini(\%root_config, @plugins);
+#pod
+#pod This routine returns a string that could be used to populate a simple
+#pod F<dist.ini> file.  The C<%root_config> gives data for the "root" section of the
+#pod configuration.  To provide a line multiple times, provide an arrayref.  For
+#pod example, the root section could read:
+#pod
+#pod   {
+#pod     name   => 'Dist-Sample',
+#pod     author => [
+#pod       'J. Smith <jsmith@example.com>',
+#pod       'Q. Smith <qsmith@example.com>',
+#pod     ],
+#pod   }
+#pod
+#pod The root section is optional.
+#pod
+#pod Plugins can be given in a few ways:
+#pod
+#pod =begin :list
+#pod
+#pod = C<"PluginMoniker">
+#pod
+#pod = C<[ "PluginMoniker" ]>
+#pod
+#pod These become C<[PluginMoniker]>
+#pod
+#pod = C<[ "PluginMoniker", "PluginName" ]>
+#pod
+#pod This becomes C<[PluginMoniker / PluginName]>
+#pod
+#pod = C<[ "PluginMoniker", { ... } ]>
+#pod
+#pod = C<[ "PluginMoniker", "PluginName", { ... } ]>
+#pod
+#pod These use the given hashref as the parameters inside the section, with the same
+#pod semantics as the root section.
+#pod
+#pod =end :list
+#pod
+#pod =cut
 
 sub _dist_ini {
   _build_ini_builder;
 }
 
+#pod =func simple_ini
+#pod
+#pod This behaves exactly like C<dist_ini>, but it merges any given root config into
+#pod a starter config, which means that you can often skip any explicit root config.
+#pod The starter config may change slightly over time, but is something like this:
+#pod
+#pod   {
+#pod     name     => 'DZT-Sample',
+#pod     abstract => 'Sample DZ Dist',
+#pod     version  => '0.001',
+#pod     author   => 'E. Xavier Ample <example@example.org>',
+#pod     license  => 'Perl_5',
+#pod     copyright_holder => 'E. Xavier Ample',
+#pod   }
+#pod
+#pod =cut
 
 sub _simple_ini {
   _build_ini_builder({
@@ -136,13 +232,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Test::DZil - tools for testing Dist::Zilla plugins
 
 =head1 VERSION
 
-version 4.300030
+version 5.025
 
 =head1 DESCRIPTION
 
@@ -245,7 +343,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,73 +0,0 @@
-#!perl
-
-use strict;
-use warnings;
-
-use Test::More;
-
-
-
-use File::Find;
-use File::Temp qw{ tempdir };
-
-my @modules;
-find(
-  sub {
-    return if $File::Find::name !~ /\.pm\z/;
-    my $found = $File::Find::name;
-    $found =~ s{^lib/}{};
-    $found =~ s{[/\\]}{::}g;
-    $found =~ s/\.pm$//;
-    return if $found =~ /Dist::Zilla::Tutorial/;
-    push @modules, $found;
-  },
-  'lib',
-);
-
-sub _find_scripts {
-    my $dir = shift @_;
-
-    my @found_scripts = ();
-    find(
-      sub {
-        return unless -f;
-        my $found = $File::Find::name;
-        return if $found =~ /Dist::Zilla::Tutorial/;
-        open my $FH, '<', $_ or do {
-          note( "Unable to open $found in ( $! ), skipping" );
-          return;
-        };
-        my $shebang = <$FH>;
-        return unless $shebang =~ /^#!.*?\bperl\b\s*$/;
-        push @found_scripts, $found;
-      },
-      $dir,
-    );
-
-    return @found_scripts;
-}
-
-my @scripts;
-do { push @scripts, _find_scripts($_) if -d $_ }
-    for qw{ bin script scripts };
-
-my $plan = scalar(@modules) + scalar(@scripts);
-$plan ? (plan tests => $plan) : (plan skip_all => "no tests to run");
-
-{
-    # fake home for cpan-testers
-    # no fake requested ## local $ENV{HOME} = tempdir( CLEANUP => 1 );
-
-    like( qx{ $^X -Ilib -e "require $_; print '$_ ok'" }, qr/^\s*$_ ok/s, "$_ loaded ok" )
-        for sort @modules;
-
-    SKIP: {
-        eval "use Test::Script 1.05; 1;";
-        skip "Test::Script needed to test script compilation", scalar(@scripts) if $@;
-        foreach my $file ( @scripts ) {
-            my $script = $file;
-            $script =~ s!.*/!!;
-            script_compiles( $file, "$script script compiles" );
-        }
-    }
-}
@@ -0,0 +1,131 @@
+do { my $x = {
+       'configure' => {
+                        'requires' => {
+                                        'ExtUtils::MakeMaker' => '0',
+                                        'File::ShareDir::Install' => '0.06'
+                                      }
+                      },
+       'develop' => {
+                      'requires' => {
+                                      'Test::Pod' => '1.41'
+                                    }
+                    },
+       'runtime' => {
+                      'recommends' => {
+                                        'Archive::Tar::Wrapper' => '0.15',
+                                        'Term::ReadLine::Gnu' => '0'
+                                      },
+                      'requires' => {
+                                      'App::Cmd::Command::version' => '0',
+                                      'App::Cmd::Setup' => '0.309',
+                                      'App::Cmd::Tester' => '0.306',
+                                      'App::Cmd::Tester::CaptureExternal' => '0',
+                                      'Archive::Tar' => '0',
+                                      'CPAN::Meta::Converter' => '2.101550',
+                                      'CPAN::Meta::Merge' => '0',
+                                      'CPAN::Meta::Prereqs' => '2.120630',
+                                      'CPAN::Meta::Requirements' => '2.121',
+                                      'CPAN::Meta::Validator' => '2.101550',
+                                      'CPAN::Uploader' => '0.103004',
+                                      'Carp' => '0',
+                                      'Class::Load' => '0.17',
+                                      'Config::INI::Reader' => '0',
+                                      'Config::MVP::Assembler' => '0',
+                                      'Config::MVP::Assembler::WithBundles' => '0',
+                                      'Config::MVP::Reader' => '2.101540',
+                                      'Config::MVP::Reader::Findable::ByExtension' => '0',
+                                      'Config::MVP::Reader::Finder' => '0',
+                                      'Config::MVP::Reader::INI' => '2',
+                                      'Config::MVP::Section' => '2.200002',
+                                      'Data::Dumper' => '0',
+                                      'Data::Section' => '0.200002',
+                                      'DateTime' => '0.44',
+                                      'Digest::MD5' => '0',
+                                      'Encode' => '0',
+                                      'ExtUtils::Manifest' => '1.66',
+                                      'File::Copy::Recursive' => '0',
+                                      'File::Find::Rule' => '0',
+                                      'File::HomeDir' => '0',
+                                      'File::Path' => '0',
+                                      'File::ShareDir' => '0',
+                                      'File::ShareDir::Install' => '0.03',
+                                      'File::Spec' => '0',
+                                      'File::Temp' => '0',
+                                      'File::pushd' => '0',
+                                      'JSON' => '2',
+                                      'List::MoreUtils' => '0',
+                                      'List::Util' => '1.33',
+                                      'Log::Dispatchouli' => '1.102220',
+                                      'Mixin::Linewise::Readers' => '0.100',
+                                      'Module::CoreList' => '0',
+                                      'Moose' => '0.92',
+                                      'Moose::Autobox' => '0.09',
+                                      'Moose::Role' => '0',
+                                      'Moose::Util::TypeConstraints' => '0',
+                                      'MooseX::LazyRequire' => '0',
+                                      'MooseX::Role::Parameterized' => '0',
+                                      'MooseX::SetOnce' => '0',
+                                      'MooseX::Types' => '0',
+                                      'MooseX::Types::Moose' => '0',
+                                      'MooseX::Types::Path::Class' => '0',
+                                      'MooseX::Types::Perl' => '0',
+                                      'PPI::Document' => '0',
+                                      'Params::Util' => '0',
+                                      'Path::Class' => '0.22',
+                                      'Path::Tiny' => '0',
+                                      'Perl::PrereqScanner' => '1.016',
+                                      'Perl::Version' => '0',
+                                      'Pod::Eventual' => '0.091480',
+                                      'Scalar::Util' => '0',
+                                      'Software::License' => '0.101370',
+                                      'Software::LicenseUtils' => '0',
+                                      'Storable' => '0',
+                                      'String::Formatter' => '0.100680',
+                                      'String::RewritePrefix' => '0.005',
+                                      'Sub::Exporter' => '0',
+                                      'Sub::Exporter::ForMethods' => '0',
+                                      'Sub::Exporter::Util' => '0',
+                                      'Term::Encoding' => '0',
+                                      'Term::ReadKey' => '0',
+                                      'Term::ReadLine' => '0',
+                                      'Term::UI' => '0',
+                                      'Test::Deep' => '0',
+                                      'Text::Glob' => '0.08',
+                                      'Text::Template' => '0',
+                                      'Try::Tiny' => '0',
+                                      'YAML::Tiny' => '0',
+                                      'autobox' => '2.53',
+                                      'autodie' => '0',
+                                      'namespace::autoclean' => '0',
+                                      'parent' => '0',
+                                      'perl' => 'v5.8.5',
+                                      'strict' => '0',
+                                      'version' => '0',
+                                      'warnings' => '0'
+                                    },
+                      'suggests' => {
+                                      'PPI::XS' => '0'
+                                    }
+                    },
+       'test' => {
+                   'recommends' => {
+                                     'CPAN::Meta' => '2.120900'
+                                   },
+                   'requires' => {
+                                   'CPAN::Meta::Check' => '0.007',
+                                   'CPAN::Meta::Requirements' => '2.121',
+                                   'ExtUtils::MakeMaker' => '0',
+                                   'ExtUtils::Manifest' => '1.66',
+                                   'File::Spec' => '0',
+                                   'Software::License::None' => '0',
+                                   'Test::FailWarnings' => '0',
+                                   'Test::Fatal' => '0',
+                                   'Test::File::ShareDir' => '0',
+                                   'Test::More' => '0.96',
+                                   'lib' => '0',
+                                   'utf8' => '0'
+                                 }
+                 }
+     };
+  $x;
+ }
\ No newline at end of file
@@ -0,0 +1,176 @@
+#!perl
+
+use strict;
+use warnings;
+
+# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019
+
+use Test::More tests => 1;
+
+use ExtUtils::MakeMaker;
+use File::Spec;
+
+# from $version::LAX
+my $lax_version_re =
+    qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )?
+            |
+            (?:\.[0-9]+) (?:_[0-9]+)?
+        ) | (?:
+            v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )?
+            |
+            (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)?
+        )
+    )/x;
+
+# hide optional CPAN::Meta modules from prereq scanner
+# and check if they are available
+my $cpan_meta = "CPAN::Meta";
+my $cpan_meta_pre = "CPAN::Meta::Prereqs";
+my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic
+
+# Verify requirements?
+my $DO_VERIFY_PREREQS = 1;
+
+sub _max {
+    my $max = shift;
+    $max = ( $_ > $max ) ? $_ : $max for @_;
+    return $max;
+}
+
+sub _merge_prereqs {
+    my ($collector, $prereqs) = @_;
+
+    # CPAN::Meta::Prereqs object
+    if (ref $collector eq $cpan_meta_pre) {
+        return $collector->with_merged_prereqs(
+            CPAN::Meta::Prereqs->new( $prereqs )
+        );
+    }
+
+    # Raw hashrefs
+    for my $phase ( keys %$prereqs ) {
+        for my $type ( keys %{ $prereqs->{$phase} } ) {
+            for my $module ( keys %{ $prereqs->{$phase}{$type} } ) {
+                $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module};
+            }
+        }
+    }
+
+    return $collector;
+}
+
+my @include = qw(
+
+);
+
+my @exclude = qw(
+
+);
+
+# Add static prereqs to the included modules list
+my $static_prereqs = do 't/00-report-prereqs.dd';
+
+# Merge all prereqs (either with ::Prereqs or a hashref)
+my $full_prereqs = _merge_prereqs(
+    ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ),
+    $static_prereqs
+);
+
+# Add dynamic prereqs to the included modules list (if we can)
+my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml';
+if ( $source && $HAS_CPAN_META ) {
+    if ( my $meta = eval { CPAN::Meta->load_file($source) } ) {
+        $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs);
+    }
+}
+else {
+    $source = 'static metadata';
+}
+
+my @full_reports;
+my @dep_errors;
+my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs;
+
+# Add static includes into a fake section
+for my $mod (@include) {
+    $req_hash->{other}{modules}{$mod} = 0;
+}
+
+for my $phase ( qw(configure build test runtime develop other) ) {
+    next unless $req_hash->{$phase};
+    next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING});
+
+    for my $type ( qw(requires recommends suggests conflicts modules) ) {
+        next unless $req_hash->{$phase}{$type};
+
+        my $title = ucfirst($phase).' '.ucfirst($type);
+        my @reports = [qw/Module Want Have/];
+
+        for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) {
+            next if $mod eq 'perl';
+            next if grep { $_ eq $mod } @exclude;
+
+            my $file = $mod;
+            $file =~ s{::}{/}g;
+            $file .= ".pm";
+            my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC;
+
+            my $want = $req_hash->{$phase}{$type}{$mod};
+            $want = "undef" unless defined $want;
+            $want = "any" if !$want && $want == 0;
+
+            my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required";
+
+            if ($prefix) {
+                my $have = MM->parse_version( File::Spec->catfile($prefix, $file) );
+                $have = "undef" unless defined $have;
+                push @reports, [$mod, $want, $have];
+
+                if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) {
+                    if ( $have !~ /\A$lax_version_re\z/ ) {
+                        push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)";
+                    }
+                    elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) {
+                        push @dep_errors, "$mod version '$have' is not in required range '$want'";
+                    }
+                }
+            }
+            else {
+                push @reports, [$mod, $want, "missing"];
+
+                if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) {
+                    push @dep_errors, "$mod is not installed ($req_string)";
+                }
+            }
+        }
+
+        if ( @reports ) {
+            push @full_reports, "=== $title ===\n\n";
+
+            my $ml = _max( map { length $_->[0] } @reports );
+            my $wl = _max( map { length $_->[1] } @reports );
+            my $hl = _max( map { length $_->[2] } @reports );
+            splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl];
+
+            push @full_reports, map { sprintf("    %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports;
+            push @full_reports, "\n";
+        }
+    }
+}
+
+if ( @full_reports ) {
+    diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports;
+}
+
+if ( @dep_errors ) {
+    diag join("\n",
+        "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n",
+        "The following REQUIRED prerequisites were not satisfied:\n",
+        @dep_errors,
+        "\n"
+    );
+}
+
+pass;
+
+# vim: ts=4 sts=4 sw=4 et:
@@ -1,157 +0,0 @@
-use strict;
-use warnings;
-use Test::More 0.88;
-# This is a relatively nice way to avoid Test::NoWarnings breaking our
-# expectations by adding extra tests, without using no_plan.  It also helps
-# avoid any other test module that feels introducing random tests, or even
-# test plans, is a nice idea.
-our $success = 0;
-END { $success && done_testing; }
-
-# List our own version used to generate this
-my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.08\n";
-
-eval {                     # no excuses!
-    # report our Perl details
-    my $want = 'v5.8.5';
-    $v .= "perl: $] (wanted $want) on $^O from $^X\n\n";
-};
-defined($@) and diag("$@");
-
-# Now, our module version dependencies:
-sub pmver {
-    my ($module, $wanted) = @_;
-    $wanted = " (want $wanted)";
-    my $pmver;
-    eval "require $module;";
-    if ($@) {
-        if ($@ =~ m/Can't locate .* in \@INC/) {
-            $pmver = 'module not found.';
-        } else {
-            diag("${module}: $@");
-            $pmver = 'died during require.';
-        }
-    } else {
-        my $version;
-        eval { $version = $module->VERSION; };
-        if ($@) {
-            diag("${module}: $@");
-            $pmver = 'died during VERSION check.';
-        } elsif (defined $version) {
-            $pmver = "$version";
-        } else {
-            $pmver = '<undef>';
-        }
-    }
-
-    # So, we should be good, right?
-    return sprintf('%-45s => %-10s%-15s%s', $module, $pmver, $wanted, "\n");
-}
-
-eval { $v .= pmver('App::Cmd::Setup','0.309') };
-eval { $v .= pmver('App::Cmd::Tester','0.306') };
-eval { $v .= pmver('App::Cmd::Tester::CaptureExternal','any version') };
-eval { $v .= pmver('Archive::Tar','any version') };
-eval { $v .= pmver('CPAN::Meta::Converter','2.101550') };
-eval { $v .= pmver('CPAN::Meta::Prereqs','2.120630') };
-eval { $v .= pmver('CPAN::Meta::Requirements','2.121') };
-eval { $v .= pmver('CPAN::Meta::Validator','2.101550') };
-eval { $v .= pmver('CPAN::Uploader','0.101550') };
-eval { $v .= pmver('Carp','any version') };
-eval { $v .= pmver('Class::Load','0.17') };
-eval { $v .= pmver('Config::INI::Reader','any version') };
-eval { $v .= pmver('Config::MVP::Assembler','any version') };
-eval { $v .= pmver('Config::MVP::Assembler::WithBundles','any version') };
-eval { $v .= pmver('Config::MVP::Reader','2.101540') };
-eval { $v .= pmver('Config::MVP::Reader::Findable::ByExtension','any version') };
-eval { $v .= pmver('Config::MVP::Reader::Finder','any version') };
-eval { $v .= pmver('Config::MVP::Reader::INI','2') };
-eval { $v .= pmver('Config::MVP::Section','2.200002') };
-eval { $v .= pmver('Data::Dumper','any version') };
-eval { $v .= pmver('Data::Section','0.004') };
-eval { $v .= pmver('DateTime','0.44') };
-eval { $v .= pmver('Digest::MD5','any version') };
-eval { $v .= pmver('Encode','any version') };
-eval { $v .= pmver('ExtUtils::MakeMaker','6.30') };
-eval { $v .= pmver('ExtUtils::Manifest','1.54') };
-eval { $v .= pmver('File::Copy::Recursive','any version') };
-eval { $v .= pmver('File::Find','any version') };
-eval { $v .= pmver('File::Find::Rule','any version') };
-eval { $v .= pmver('File::HomeDir','any version') };
-eval { $v .= pmver('File::Path','any version') };
-eval { $v .= pmver('File::ShareDir','any version') };
-eval { $v .= pmver('File::ShareDir::Install','0.03') };
-eval { $v .= pmver('File::Spec','any version') };
-eval { $v .= pmver('File::Temp','any version') };
-eval { $v .= pmver('File::pushd','any version') };
-eval { $v .= pmver('Hash::Merge::Simple','any version') };
-eval { $v .= pmver('JSON','2') };
-eval { $v .= pmver('List::AllUtils','any version') };
-eval { $v .= pmver('List::MoreUtils','any version') };
-eval { $v .= pmver('List::Util','any version') };
-eval { $v .= pmver('Log::Dispatchouli','1.102220') };
-eval { $v .= pmver('Moose','0.92') };
-eval { $v .= pmver('Moose::Autobox','0.10') };
-eval { $v .= pmver('Moose::Role','any version') };
-eval { $v .= pmver('Moose::Util::TypeConstraints','any version') };
-eval { $v .= pmver('MooseX::LazyRequire','any version') };
-eval { $v .= pmver('MooseX::Role::Parameterized','any version') };
-eval { $v .= pmver('MooseX::SetOnce','any version') };
-eval { $v .= pmver('MooseX::Types','any version') };
-eval { $v .= pmver('MooseX::Types::Moose','any version') };
-eval { $v .= pmver('MooseX::Types::Path::Class','any version') };
-eval { $v .= pmver('MooseX::Types::Perl','any version') };
-eval { $v .= pmver('PPI','any version') };
-eval { $v .= pmver('Params::Util','any version') };
-eval { $v .= pmver('Path::Class','any version') };
-eval { $v .= pmver('Perl::PrereqScanner','1.005') };
-eval { $v .= pmver('Perl::Version','any version') };
-eval { $v .= pmver('Pod::Eventual','0.091480') };
-eval { $v .= pmver('Scalar::Util','any version') };
-eval { $v .= pmver('Software::License','0.101370') };
-eval { $v .= pmver('Software::License::None','any version') };
-eval { $v .= pmver('Software::LicenseUtils','any version') };
-eval { $v .= pmver('String::Formatter','0.100680') };
-eval { $v .= pmver('String::RewritePrefix','0.005') };
-eval { $v .= pmver('Sub::Exporter','any version') };
-eval { $v .= pmver('Sub::Exporter::ForMethods','any version') };
-eval { $v .= pmver('Sub::Exporter::Util','any version') };
-eval { $v .= pmver('Term::ReadKey','any version') };
-eval { $v .= pmver('Term::ReadLine','any version') };
-eval { $v .= pmver('Term::ReadLine::Gnu','any version') };
-eval { $v .= pmver('Term::UI','any version') };
-eval { $v .= pmver('Test::Deep','any version') };
-eval { $v .= pmver('Test::Fatal','any version') };
-eval { $v .= pmver('Test::File::ShareDir','any version') };
-eval { $v .= pmver('Test::More','0.96') };
-eval { $v .= pmver('Test::Pod','1.41') };
-eval { $v .= pmver('Text::Glob','0.08') };
-eval { $v .= pmver('Text::Template','any version') };
-eval { $v .= pmver('Try::Tiny','any version') };
-eval { $v .= pmver('YAML::Tiny','any version') };
-eval { $v .= pmver('autobox','2.53') };
-eval { $v .= pmver('autodie','any version') };
-eval { $v .= pmver('namespace::autoclean','any version') };
-eval { $v .= pmver('parent','any version') };
-eval { $v .= pmver('strict','any version') };
-eval { $v .= pmver('version','0.9901') };
-eval { $v .= pmver('warnings','any version') };
-
-
-# All done.
-$v .= <<'EOT';
-
-Thanks for using my code.  I hope it works for you.
-If not, please try and include this output in the bug report.
-That will help me reproduce the issue and solve your problem.
-
-EOT
-
-diag($v);
-ok(1, "we really didn't test anything, just reporting data");
-$success = 1;
-
-# Work around another nasty module on CPAN. :/
-no warnings 'once';
-$Template::Test::NO_FLUSH = 1;
-exit 0;
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88 tests => 1;
 
-use lib 't/lib';
-
 use autodie;
 
 use Dist::Zilla::Util::AuthorDeps;
@@ -11,14 +9,18 @@ use Path::Class;
 
 my $authordeps =
     Dist::Zilla::Util::AuthorDeps::extract_author_deps(
-	dir('corpus/dist/AutoPrereqs'),
+	dir('corpus/dist/AuthorDeps'),
 	0
     );
 
 is_deeply(
     $authordeps,
-    [ map { +{"Dist::Zilla::Plugin::$_" => 0} } qw<AutoPrereqs ExecDir GatherDir MetaYAML> ],
-    "authordeps in corpus/dist/AutoPrereqs"
+    [
+      +{ perl => '5.005' },
+      ( map { +{"Dist::Zilla::Plugin::$_" => '5.0'} } qw<AutoPrereqs Encoding ExecDir> ),
+      ( map { +{"Dist::Zilla::Plugin::$_" => 0} } qw<GatherDir MetaYAML> ),
+    ],
+    "authordeps in corpus/dist/AuthorDeps"
 ) or diag explain $authordeps;
 
 done_testing;
@@ -3,8 +3,6 @@ use warnings;
 
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Test::DZil;
 use YAML::Tiny;
 
@@ -1,4 +1,3 @@
-
 use strict;
 use warnings;
 
@@ -0,0 +1,53 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Test::More;
+use Test::DZil;
+use Test::Fatal;
+use Path::Tiny;
+use List::Util 'first';
+
+my $tzil = Builder->from_config(
+    { dist_root => 't/does_not_exist' },
+    {
+        add_files => {
+            path(qw(source dist.ini)) => simple_ini(
+                'GatherDir',
+            ),
+            path(qw(source lib DZT Sample.pm)) => <<MODULE,
+package DZT::Sample;
+
+# ABSTRACT:
+
+return 1;
+__END__
+
+=head1 NAME
+
+DZT::Sample - a sample module for testing handling of empty ABSTRACT comment
+
+=head1 HEY, MAINTAINER
+
+Note that we have C<< =head1 NAME >> here, and an empty ABSTRACT comment.
+
+The empty ABSTRACT comment should be skipped, and the NAME one used.
+
+=cut
+MODULE
+        },
+    },
+);
+
+is(
+    exception { $tzil->build },
+    undef,
+    'build proceeds normally',
+);
+
+is(
+    Dist::Zilla::Util->abstract_from_file(first { $_->name eq 'lib/DZT/Sample.pm' } @{$tzil->files}),
+    'a sample module for testing handling of empty ABSTRACT comment',
+    'We should see the abstract from the =head NAME section in pod',
+);
+
+done_testing;
@@ -0,0 +1,75 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Test::More;
+use Test::DZil;
+use Test::Deep;
+use Test::Fatal;
+use Path::Tiny;
+use List::Util 'first';
+
+my $tzil = Builder->from_config(
+  { dist_root => 't/does_not_exist' },
+  {
+    add_files => {
+      path(qw(source dist.ini)) => simple_ini(
+        'GatherDir',       # a file gatherer (adds OnDisk file)
+        'PodSyntaxTests',  # a file gatherer (adds InMemory file)
+        'Manifest',        # a file gatherer (adds FromCode file)
+
+        # a file munger that changes content
+        [ PkgVersion => { finder => ':AllFiles' } ],
+
+        'ExtraTests',      # a file munger that changes filename
+      ),
+      path(qw(source lib DZT Sample.pm)) => "package DZT::Sample;\n\n1",
+    },
+  },
+);
+
+$tzil->chrome->logger->set_debug(1);
+is(
+  exception { $tzil->build },
+  undef,
+  'build proceeds normally',
+) or diag 'saw log messages: ', explain $tzil->log_messages;
+
+my $module = first { $_->name eq path(qw(lib DZT Sample.pm)) }
+             @{ $tzil->files };
+
+cmp_deeply(
+  $module,
+  methods(
+    added_by => all(
+      re(qr/\bencoded_content added by GatherDir \(Dist::Zilla::Plugin::GatherDir line \d+\)(;|$)/),
+      re(qr/\bencoded_content set by PkgVersion \(Dist::Zilla::Role::PPI line \d+\)(;|$)/),
+    ),
+  ),
+  'OnDisk file added by GatherDir, set by PkgVersion has correct properties',
+);
+
+my $test = first { $_->name eq path(qw(t release-pod-syntax.t)) }
+           @{ $tzil->files };
+
+cmp_deeply(
+  $test,
+  methods(
+    added_by => all(
+      re(qr/^content added by PodSyntaxTests \(Dist::Zilla::Plugin::InlineFiles line \d+\)(;|$)/),
+      re(qr/\bcontent set by ExtraTests \(Dist::Zilla::Plugin::ExtraTests line \d+\)(;|$)/),
+      re(qr/\bfilename set by ExtraTests \(Dist::Zilla::Plugin::ExtraTests line \d+\)(;|$)/),
+    ),
+  ),
+  'InMemory file altered by all of PodSyntaxTests, PkgVersion and ExtraTests has correct properties',
+);
+
+my $manifest = first { $_->name eq path('MANIFEST') } @{ $tzil->files };
+cmp_deeply(
+  $manifest,
+  methods(
+    added_by => re(qr/^bytes from coderef added by Manifest \(Dist::Zilla::Plugin::Manifest line \d+\)$/),
+  ),
+  'FromCode file added by Manifest has correct properties',
+);
+
+done_testing;
@@ -0,0 +1,207 @@
+use strict;
+use warnings;
+use utf8;
+use Test::More;
+use Test::Fatal;
+use Test::FailWarnings -allow_deps => 1;
+binmode(Test::More->builder->$_, ":utf8") for qw/output failure_output todo_output/;
+
+use Encode;
+use Path::Tiny;
+use Test::DZil;
+use List::Util 'first';
+
+use Dist::Zilla::File::InMemory;
+use Dist::Zilla::File::OnDisk;
+use Dist::Zilla::File::FromCode;
+
+my %sample = (
+  dolmen  => "Olivier Mengué",
+  keedi   =>"김도형 - Keedi Kim",
+);
+
+my $sample              = join("\n", values %sample);
+my $encoded_sample      = encode("UTF-8", $sample);
+my $db_sample           = $sample x 2;
+my $db_encoded_sample   = $encoded_sample x 2;
+my $latin1_dolmen       = encode("latin1", $sample{dolmen});
+
+my $tzil = Builder->from_config(
+    { dist_root => 't/does_not_exist' },
+    {
+        add_files => {
+            path(qw(source dist.ini)) => simple_ini(
+                'GatherDir',
+            ),
+            path(qw(source lib DZT Sample.pm)) => "package DZT::Sample;\n\n1",
+        },
+    },
+);
+
+{
+    # this trickery is so the caller appears to be whatever called new_file()
+    my $gatherdir = first { $_->isa('Dist::Zilla::Plugin::GatherDir') } @{ $tzil->plugins };
+    my $add_file = $gatherdir->can('add_file');
+
+    my $i = 0;
+    sub new_file {
+      my ($objref, $class, @args) = @_;
+      my $obj = $class->new(
+          name => 'foo_' . $i++ . '.txt',
+          @args,
+      );
+      ok($obj, "created a $class");
+      $$objref = $obj;
+
+      # equivalent to: $gatherdir->add_file($obj);
+      @_ = ($gatherdir, $obj); goto &$add_file;
+    }
+}
+
+sub test_mutable_roundtrip {
+  my ($obj) = @_;
+
+  ok( $obj->DOES("Dist::Zilla::Role::MutableFile"), "does MutableFile role" );
+
+  # assumes object content starts as $sample
+  is( $obj->content, $sample, "get content" );
+  is( $obj->encoded_content, $encoded_sample, "get encoded_content" );
+
+  # set content, check content & encoded_content
+  ok( $obj->content($db_sample), "set content");
+  is( $obj->content, $db_sample, "get content");
+  is( $obj->encoded_content, $db_encoded_sample, "get encoded_content");
+
+  # set encoded_content, check encoded_content & content
+  ok( $obj->encoded_content($encoded_sample), "set encoded_content");
+  is( $obj->encoded_content, $encoded_sample, "get encoded_content");
+  is( $obj->content, $sample, "get content");
+}
+
+sub test_content_from_bytes {
+  my ($obj, $source_re) = @_;
+  # assumes object encoded_content is encoded sample
+  is( $obj->encoded_content, $encoded_sample, "get encoded_content" );
+  my $err = exception { $obj->content };
+  like(
+    $err,
+    qr/can't decode text from 'bytes'/i,
+    "get content from bytes should throw error"
+  );
+  # Match only the first line of the stack trace
+  like( $err, qr/^[^\n]+$source_re/s, "error shows encoded_content source" );
+}
+
+sub test_latin1 {
+  my ($obj) = @_;
+  # assumes encoded_content is $latin1_dolmen and encoding
+  # is already set to 'latin1"
+  is( $obj->encoded_content, $latin1_dolmen, "get encoded_content" );
+  is( $obj->content, $sample{dolmen}, "get content" );
+}
+
+subtest "OnDisk" => sub {
+  my $class = "Dist::Zilla::File::OnDisk";
+
+  subtest "UTF-8 file" => sub {
+    my $tempfile = Path::Tiny->tempfile;
+
+    ok( $tempfile->spew_utf8($sample), "create UTF-8 encoded tempfile" );
+    my $obj;
+    new_file(\$obj, $class, name => "$tempfile");
+    test_mutable_roundtrip($obj);
+  };
+
+  subtest "binary file" => sub {
+    my $tempfile = Path::Tiny->tempfile;
+
+    ok( $tempfile->spew_raw($encoded_sample), "create binary tempfile" );
+    my $obj;
+    new_file(\$obj, $class, name => "$tempfile");
+    ok( $obj->encoding("bytes"), "set encoding to 'bytes'");
+    test_content_from_bytes($obj, qr/encoded_content added by \S+ \(\S+ line \d+\)/);
+  };
+
+  subtest "latin1 file" => sub {
+    my $tempfile = Path::Tiny->tempfile;
+
+    ok(
+      $tempfile->spew( { binmode => ":encoding(latin1)"}, $sample{dolmen} ),
+      "create latin1 tempfile"
+    );
+    my $obj;
+    new_file(\$obj, $class, name => "$tempfile", encoding => 'latin1');
+    test_latin1($obj);
+  };
+
+};
+
+subtest "InMemory" => sub {
+  my $class = "Dist::Zilla::File::InMemory";
+
+  subtest "UTF-8 string" => sub {
+    my $obj;
+    new_file(\$obj, $class, content => $sample);
+    test_mutable_roundtrip($obj);
+  };
+
+  subtest "binary string" => sub {
+    my ($obj, $line);
+    new_file(\$obj, $class, encoded_content => $encoded_sample); $line = __LINE__;
+    ok( $obj->encoding("bytes"), "set encoding to 'bytes'");
+    test_content_from_bytes($obj, qr/encoded_content added by \S+ \(\S+ line $line\)/);
+  };
+
+  subtest "latin1 string" => sub {
+    my $obj;
+    new_file(\$obj, $class, encoded_content => $latin1_dolmen, encoding => "latin1");
+    test_latin1($obj);
+  };
+
+};
+
+subtest "FromCode" => sub {
+  my $class = "Dist::Zilla::File::FromCode";
+
+  subtest "UTF-8 string" => sub {
+    my $obj;
+    new_file(\$obj, $class, code => sub { $sample });
+    is( $obj->content, $sample, "content" );
+    is( $obj->encoded_content, $encoded_sample, "encoded_content" );
+  };
+
+  subtest "content immutable" => sub {
+    my $obj;
+    new_file(\$obj, $class, code => sub { $sample });
+    like(
+      exception { $obj->content($sample) },
+      qr/cannot set content/,
+      "changing content should throw error"
+    );
+    like(
+      exception { $obj->encoded_content($encoded_sample) },
+      qr/cannot set encoded_content/,
+      "changing encoded_content should throw error"
+    );
+  };
+
+  subtest "binary string" => sub {
+    my ($obj, $line);
+    new_file(\$obj, $class, code_return_type => 'bytes', code => sub { $encoded_sample }); $line = __LINE__;
+    test_content_from_bytes($obj, qr/bytes from coderef added by \S+ \(main line $line\)/);
+  };
+
+  subtest "latin1 string" => sub {
+    my $obj;
+    new_file(\$obj, $class, (
+        code_return_type => 'bytes',
+        code => sub { $latin1_dolmen },
+        encoding => 'latin1',
+      )
+    );
+    test_latin1($obj);
+  };
+
+};
+
+done_testing;
@@ -1,11 +1,8 @@
-#!perl
 use strict;
 use warnings;
 
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use File::pushd qw/pushd/;
 use Path::Class;
 use Test::DZil;
@@ -1,11 +1,8 @@
-#!perl
 use strict;
 use warnings;
 
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Test::DZil;
 use YAML::Tiny;
 
@@ -44,6 +41,7 @@ my %wanted = (
   'DZPA::Role'            => 0,
   'DZPA::ScriptUse'       => 0,
   'base'                  => 0,
+  'lib'                   => 0,
   'parent'                => 0,
   'perl'                  => 5.008,
   'strict'                => 0,
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Test::DZil;
 use YAML::Tiny;
 
@@ -28,4 +26,24 @@ use YAML::Tiny;
   is($tzil->version, $want_version, "dist version is set (in DZ obj)");
 }
 
+{
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZT' },
+    {
+      add_files => {
+        'source/dist.ini' => simple_ini(
+          { version => undef },
+          'GatherDir',
+          [ AutoVersion => {
+            major => 7,
+            format => q<{{$major}}.{{ cldr('y') }}> } ],
+        ),
+      },
+    },
+  );
+
+  $tzil->build;
+
+  like($tzil->version, qr/^7\.20[1-9][0-9]$/, "dist version is set using CLDR");
+}
 done_testing;
@@ -2,9 +2,7 @@ use strict;
 use warnings;
 use Test::More 0.88;
 use Test::Fatal;
-
-use lib 't/lib';
-
+use Test::Deep;
 use Test::DZil;
 
 sub new_tzil {
@@ -71,8 +69,8 @@ for my $yes (qw(y yes)) {
   );
 }
 
-my $prompt = "*** Preparing to release DZT-Sample-0.001.tar.gz with FakeRelease ***\n"
-           . "Do you want to continue the release process?";
+
+my $prompt = "Do you want to continue the release process?";
 
 for my $no (qw(n no)) {
   my $tzil = new_tzil;
@@ -85,6 +83,12 @@ for my $no (qw(n no)) {
     "ConfirmRelease aborts when answering '$no'",
   );
 
+  cmp_deeply(
+    $tzil->log_messages,
+    supersetof("[ConfirmRelease] *** Preparing to release DZT-Sample-0.001.tar.gz with FakeRelease ***"),
+    'supplementary information was also displayed',
+  ) or diag explain $tzil->log_messages;
+
   ok(!release_happened($tzil), "release did not happen when answering '$no'");
 }
 
@@ -99,6 +103,12 @@ for my $yes (qw(y yes)) {
     "ConfirmRelease no exception when answering '$yes'",
   );
 
+  cmp_deeply(
+    $tzil->log_messages,
+    supersetof("[ConfirmRelease] *** Preparing to release DZT-Sample-0.001.tar.gz with FakeRelease ***"),
+    'supplementary information was also displayed',
+  ) or diag explain $tzil->log_messages;
+
   ok(release_happened($tzil), "answering '$yes' allows release");
 }
 
@@ -0,0 +1,64 @@
+use strict;
+use warnings;
+use Test::More 0.88;
+
+use Test::DZil;
+use Test::Deep;
+
+{
+  package Keywords; # see also Dist::Zilla::Plugin::Keywords ;)
+  use Moose;
+  with 'Dist::Zilla::Role::MetaProvider';
+
+  sub mvp_multivalue_args { qw(keywords) }
+
+  has keywords => (
+    is => 'ro', isa => 'ArrayRef[Str]',
+    lazy => 1,
+    default => sub { [] },
+  );
+
+  sub metadata
+  {
+    my $self = shift;
+    my $keywords = $self->keywords;
+    return { @$keywords ? ( keywords => $keywords ) : () };
+  }
+}
+
+{
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZT' },
+    {
+      add_files => {
+        'source/dist.ini' => simple_ini(
+          [ '=Keywords' => 'plugin 1' => { keywords => [ qw(foo bar) ] } ],
+          [ '=Keywords' => 'plugin 2' => { keywords => [ qw(dog cat) ] } ],
+        ),
+      },
+    },
+  );
+
+
+  cmp_deeply(
+    $tzil->distmeta,
+    {
+      abstract       => 'Sample DZ Dist',
+      author         => ['E. Xavier Ample <example@example.org>'],
+      dynamic_config => 0,
+      generated_by   => ignore,
+      license        => [ 'perl_5' ],
+      'meta-spec'    => {
+        url     => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
+        version => 2
+      },
+      name      => 'DZT-Sample',
+      release_status => 'stable',
+      version => '0.001',
+      keywords => [ qw(foo bar dog cat) ],
+    },
+    'metadata is correctly merged together',
+  );
+}
+
+done_testing;
@@ -1,8 +1,8 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use Test::Deep;
+use utf8;
 
 use Test::DZil;
 
@@ -70,13 +70,11 @@ use YAML::Tiny;
       version   => '0.001',
     );
 
-    for my $key (sort keys %want) {
-      is_deeply(
-        $meta->{ $key },
-        $want{ $key },
-        "$key is what we want in 2.0 $type",
-      );
-    }
+    cmp_deeply(
+      $meta,
+      superhashof(\%want),
+      "2.0 $type data",
+    );
   }
 }
 
@@ -137,13 +135,40 @@ use YAML::Tiny;
       version   => '0.001',
     );
 
-    for my $key (sort keys %want) {
-      is_deeply(
-        $meta->{ $key },
-        $want{ $key },
-        "$key is what we want in 1.4 $type",
-      );
-    }
+    cmp_deeply(
+      $meta,
+      superhashof(\%want),
+      "1.4 $type data",
+    );
+  }
+}
+
+{ # non-ASCII
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZ-NonAscii' },
+  );
+
+  $tzil->build;
+
+  my @files = map {; $_->name } @{ $tzil->files };
+
+  my %meta;
+
+  my $json = $tzil->slurp_file('build/META.json');
+  $meta{json} = JSON->new->decode($json);
+
+  my $yaml = $tzil->slurp_file('build/META.yml');
+  $meta{yaml} = YAML::Tiny->new->read_string($yaml)->[0];
+
+  for my $type (qw(json yaml)) {
+    is_deeply(
+      $meta{$type}{author},
+      [
+        'Olivier Mengué <dolmen@example.org>',
+        '김도형 <keedi@example.com>'
+      ],
+      "authors ($type) are set as expected, decode properly",
+    );
   }
 }
 
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use autodie;
 use Test::DZil;
 use Test::Deep;
@@ -40,16 +38,16 @@ $tzil->build;
 
 my @files = map {; $_->name } @{ $tzil->files };
 
-is_deeply(
-  [ sort @files ],
-  [ sort qw(
+cmp_deeply(
+  \@files,
+  bag(qw(
     META.json
     dist.ini lib/DZT/Sample.pm t/basic.t
     t/smoke-huffer.t
     t/author-huffer.t
     t/release-huffer.t
     xt/blort/huffer.t
-  ) ],
+  )),
   "filenames rewritten by ExtraTests",
 );
 
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Test::DZil qw(Builder simple_ini);
 use Test::Fatal qw(exception);
 
@@ -1,4 +1,3 @@
-#!perl
 # Test the FileFinder::ByName and FileFinder::Filter plugins
 use strict;
 use warnings;
@@ -2,8 +2,7 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
+use ExtUtils::Manifest 'maniread';
 use Test::DZil;
 
 my $tzil = Builder->from_config(
@@ -20,12 +19,18 @@ my $tzil = Builder->from_config(
           root   => '../corpus/dist/DZT_Bin',
           prefix => 'bin',
         } ],
+        [ GatherDir => MySHARE => {
+          root   => '../corpus/dist/DZT_Share',
+          prefix => 'share',
+        } ],
         [ ExecDir => ],
+        [ ShareDir => ],
         'Manifest',
       ),
     },
     also_copy => { 'corpus/dist/DZT_Inc' => 'corpus/dist/DZT_Inc',
-                   'corpus/dist/DZT_Bin' => 'corpus/dist/DZT_Bin'
+                   'corpus/dist/DZT_Bin' => 'corpus/dist/DZT_Bin',
+                   'corpus/dist/DZT_Share' => 'corpus/dist/DZT_Share'
     },
   },
 );
@@ -37,7 +42,9 @@ my @files = map {; $_->name } @{ $tzil->files };
 is_filelist(
   [ @files ],
   [ qw(
-    dist.ini lib/DZT/Sample.pm t/basic.t
+    dist.ini lib/DZT/Sample.pm
+    share/my_data.dat
+    t/basic.t
     MANIFEST
     inc/Foo.pm inc/Foo/Bar.pm
     bin/test.pl
@@ -45,12 +52,11 @@ is_filelist(
   "GatherDir gathers all files in the source dir",
 );
 
-my $manifest = $tzil->slurp_file('build/MANIFEST');
-my %in_manifest = map {; chomp; $_ => 1 } grep {length} split /\n/, $manifest;
+my $manifest = maniread($tzil->tempdir->file('build/MANIFEST')->stringify);
 
-my $count = grep { $in_manifest{$_} } @files;
+my $count = grep { exists $manifest->{$_} } @files;
 ok($count == @files, "all files found were in manifest");
-ok(keys(%in_manifest) == @files, "all files in manifest were on disk");
+ok(keys(%$manifest) == @files, "all files in manifest were on disk");
 
 # Test our finders
 my $files = $tzil->find_files(':InstallModules');
@@ -89,15 +95,27 @@ is_filelist(
   "ExecFiles finds all files",
 );
 
-# XXX I don't use sharedir, how do I configure it? --apocal
-# disabled for now because DZ::Tester doesn't allow sharedir finder to work...
-# Can't locate object method "zilla" via package "Dist::Zilla::Tester::_Builder" at blib/lib/Dist/Zilla/Dist/Builder.pm line 114.
-#$files = $tzil->find_files(':ShareFiles');
-#is_filelist(
-#  [ map {; $_->name } @$files ],
-#  [  ],
-#  "ShareFiles finds all files",
-#);
+$files = $tzil->find_files(':ShareFiles');
+is_filelist(
+  [ map {; $_->name } @$files ],
+  [ qw(
+    share/my_data.dat
+  ) ],
+  "ShareFiles finds all files",
+);
 
-done_testing;
+$files = $tzil->find_files(':AllFiles');
+is_filelist(
+  [ map {; $_->name } @$files ],
+  [ @files ],
+  ":AllFiles finds all files",
+);
 
+$files = $tzil->find_files(':NoFiles');
+is_filelist(
+  [ map {; $_->name } @$files ],
+  [ ],
+  ":NoFiles finds no files",
+);
+
+done_testing;
@@ -2,9 +2,9 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
+use ExtUtils::Manifest 'maniread';
 use Test::DZil;
+use Path::Tiny;
 
 my $tzil = Builder->from_config(
   { dist_root => 'corpus/dist/DZT' },
@@ -24,23 +24,41 @@ my $tzil = Builder->from_config(
         [ GatherDir => Selective => {
           root   => '../corpus/extra',
           prefix => 'some',
-          exclude_filename => 'notme.txt',
+          exclude_filename => [ 'notme.txt', 'subdir/index.html' ],
         } ],
         [ GatherDir => SelectiveMatch => {
           root   => '../corpus/extra',
           prefix => 'xmatch',
-          exclude_match => 'notme\.*',
+          exclude_match => [ 'notme\.*', '^subdir/index\.html$' ],
+        } ],
+        [ GatherDir => Symlinks => {
+          root   => '../corpus/extra',
+          follow_symlinks => 1,
+          prefix => 'links',
+        } ],
+        [ GatherDir => PruneDirectory => {
+          root   => '../corpus/extra',
+          prefix => 'pruned',
+          prune_directory => '^subdir$',
         } ],
         'Manifest',
+        'MetaConfig',
       ),
       'source/.profile' => "Bogus dotfile.\n",
       'corpus/extra/.dotfile' => "Bogus dotfile.\n",
       'corpus/extra/notme.txt' => "A file to exclude.\n",
+      'source/.dotdir/extra/notme.txt' => "Another file to exclude.\n",
+      'source/extra/.dotdir/notme.txt' => "Another file to exclude.\n",
     },
     also_copy => { 'corpus/extra' => 'corpus/extra' },
   },
 );
 
+my $corpus_dir = path($tzil->tempdir)->child('corpus');
+symlink $corpus_dir->child('extra', 'vader.txt'), $corpus_dir->child('extra', 'vader_link.txt')
+    or note "could not create link: $!"
+  if $^O ne 'MSWin32';
+
 $tzil->build;
 
 my @files = map {; $_->name } @{ $tzil->files };
@@ -50,20 +68,23 @@ is_filelist(
   [ qw(
     bonus/subdir/index.html bonus/vader.txt bonus/notme.txt
     dotty/subdir/index.html dotty/vader.txt dotty/.dotfile dotty/notme.txt
-    some/subdir/index.html some/vader.txt
-    xmatch/subdir/index.html xmatch/vader.txt
+    some/vader.txt
+    xmatch/vader.txt
+    links/vader.txt links/subdir/index.html links/notme.txt
+    pruned/notme.txt pruned/vader.txt
     dist.ini lib/DZT/Sample.pm t/basic.t
     MANIFEST
-  ) ],
+  ),
+    ($^O ne 'MSWin32' ? (map { $_ . '/vader_link.txt' } qw(bonus dotty some xmatch links pruned)) : ()),
+  ],
   "GatherDir gathers all files in the source dir",
 );
 
-my $manifest = $tzil->slurp_file('build/MANIFEST');
-my %in_manifest = map {; chomp; $_ => 1 } grep {length} split /\n/, $manifest;
+my $manifest = maniread($tzil->tempdir->file('build/MANIFEST')->stringify);
 
-my $count = grep { $in_manifest{$_} } @files;
+my $count = grep { exists $manifest->{$_} } @files;
 ok($count == @files, "all files found were in manifest");
-ok(keys(%in_manifest) == @files, "all files in manifest were on disk");
+ok(keys(%$manifest) == @files, "all files in manifest were on disk");
 
 done_testing;
 
@@ -1,8 +1,7 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use utf8;
 
 use autodie;
 use Test::DZil;
@@ -17,7 +16,7 @@ my $tzil = Builder->from_config(
             filename    => 'txt/dingo.txt',
             is_template => 1,
             content     => [
-              'Welcome to Dingo Kidneys {{ $dist->version }}',
+              'Welcome to Dingo Kidneys ⽝ {{ $dist->version }}',
               'Generated by {{ $plugin->VERSION || 0 }}',
             ],
           }
@@ -26,7 +25,7 @@ my $tzil = Builder->from_config(
           GenerateFile => Kidneys => {
             filename    => 'txt/dingo.tmpl',
             content     => [
-              'Welcome to Dingo Kidneys {{ $dist->version }}',
+              'Welcome to Dingo Kidneys ⽝ {{ $dist->version }}',
               'Generated by {{ $plugin->VERSION || 0 }}',
             ],
           }
@@ -43,7 +42,7 @@ $tzil->build;
 
   like(
     $contents,
-    qr{Kidneys 0.001\n}sm,
+    qr{Kidneys ⽝ 0.001\n}sm,
     'we render $dist stuff into dingo.txt',
   );
 
@@ -60,7 +59,7 @@ $tzil->build;
   is(
     $contents,
     <<'END_TMPL',
-Welcome to Dingo Kidneys {{ $dist->version }}
+Welcome to Dingo Kidneys ⽝ {{ $dist->version }}
 Generated by {{ $plugin->VERSION || 0 }}
 END_TMPL
     'we include template literals into dingo.tmpl',
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Test::DZil;
 
 sub test_this {
@@ -1,36 +1,52 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use utf8;
 
 use autodie;
 use Test::DZil;
 
-my $tzil = Builder->from_config(
-  { dist_root => 'corpus/dist/DZT' },
-  {
-    add_files => {
-      'source/dist.ini' => simple_ini('License'),
+subtest "ASCII-only author" => sub {
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZT' },
+    {
+      add_files => {
+        'source/dist.ini' => simple_ini('License'),
+      },
     },
-  },
-);
+  );
 
-$tzil->build;
+  $tzil->build;
 
-my $contents = $tzil->slurp_file('build/LICENSE');
+  my $contents = $tzil->slurp_file('build/LICENSE');
 
-like(
-  $contents,
-  qr{This software is copyright .c. [0-9]+ by E\. Xavier Ample}i,
-  "copyright appears in LICENSE file",
-);
+  like(
+    $contents,
+    qr{This software is copyright .c. [0-9]+ by E\. Xavier Ample}i,
+    "copyright appears in LICENSE file",
+  );
 
-like(
-  $contents,
-  qr{same terms as (the )?perl.*itself}i,
-  "'same terms as perl'-ish text appears in LICENSE",
-);
+  like(
+    $contents,
+    qr{same terms as (the )?perl.*itself}i,
+    "'same terms as perl'-ish text appears in LICENSE",
+  );
+};
 
-done_testing;
+subtest "non-ASCII author" => sub {
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZ-NonAscii' },
+  );
+
+  $tzil->build;
 
+  my $contents = $tzil->slurp_file('build/LICENSE');
+
+  like(
+    $contents,
+    qr{This software is copyright .c. [0-9]+ by ภูมิพลอดุลยเดช},
+    "copyright appears in LICENSE file",
+  );
+};
+
+done_testing;
@@ -1,8 +1,7 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use Test::Deep;
 
 use Test::DZil;
 
@@ -14,10 +13,14 @@ use Test::DZil;
         'source/dist.ini' => simple_ini(
           'GatherDir',
           'MakeMaker',
-          [ Prereqs => { 'Foo::Bar' => '1.20',      perl => '5.008' } ],
+          [ Prereqs => { 'Foo::Bar' => '1.20',
+                          perl      => '5.008',
+                          Baz       => '1.2.3',
+                          Buzz      => 'v1.2' } ],
           [ Prereqs => BuildRequires => { 'Builder::Bob' => '9.901' } ],
           [ Prereqs => TestRequires  => { 'Test::Deet'   => '7',
                                           perl           => '5.008' } ],
+          [ Prereqs => ConfigureRequires => { perl => '5.010' } ],
         ),
       },
     },
@@ -34,26 +37,33 @@ use Test::DZil;
     VERSION  => '0.001',
     AUTHOR   => 'E. Xavier Ample <example@example.org>',
     LICENSE  => 'perl',
+    MIN_PERL_VERSION => '5.010',
+    EXE_FILES => [],
+    test => { TESTS => 't/*.t' },
 
     PREREQ_PM          => {
-      'Foo::Bar' => '1.20'
+      'Foo::Bar' => '1.20',
+      'Baz'      => '1.2.3',
+      'Buzz'     => '1.2.0',
     },
     BUILD_REQUIRES     => {
       'Builder::Bob' => '9.901',
+    },
+    TEST_REQUIRES      => {
       'Test::Deet'   => '7',
     },
     CONFIGURE_REQUIRES => {
-      'ExtUtils::MakeMaker' => '6.30'
+      'ExtUtils::MakeMaker' => '0'
     },
+    EXE_FILES => [],
+    test => { TESTS => 't/*.t' },
   );
 
-  for my $key (sort keys %want) {
-    is_deeply(
-      $makemaker->__write_makefile_args->{ $key },
-      $want{ $key },
-      "correct value set for $key",
-    );
-  }
+  cmp_deeply(
+    $makemaker->__write_makefile_args,
+    \%want,
+    'correct makemaker args generated',
+  );
 }
 
 {
@@ -65,6 +75,7 @@ use Test::DZil;
           'GatherDir',
           'MakeMaker',
           [ Prereqs => { perl => '5.8.1' } ],
+          [ Prereqs => ConfigureRequires => { 'Builder::Bob' => 0 } ],
         ),
       },
     },
@@ -75,6 +86,9 @@ use Test::DZil;
   my $content = $tzil->slurp_file('build/Makefile.PL');
 
   like($content, qr/^use 5\.008001;\s*$/m, "normalized the perl version needed");
+
+  $content =~ m'^my %FallbackPrereqs = \(\n([^;]+)^\);$'mg;
+  like($1, qr'"Builder::Bob" => ', 'configure-requires prereqs made it into %FallbackPrereqs');
 }
 
 done_testing;
@@ -1,10 +1,9 @@
 use strict;
 use warnings;
 use Test::More 0.88;
+use Test::Deep;
 
-use ExtUtils::Manifest;
-
-use lib 't/lib';
+use ExtUtils::Manifest 1.66; # or maniread can't cope with quoting properly
 
 use Test::DZil;
 
@@ -13,13 +12,15 @@ my $tzil = Builder->from_config(
   {
     add_files => {
       q{source/file with spaces.txt}        => "foo\n",
-      # q{source/file\\with some\\whacks.txt} => "bar\n",
-      # q{source/'file-with-ticks.txt'}       => "baz\n",
-      # q{source/file'with'quotes\\or\\backslash.txt} => "quux\n",
+      q{source/'file-with-ticks.txt'}       => "baz\n",
       'source/dist.ini' => simple_ini(
         'GatherDir',
         'Manifest',
       ),
+      $^O eq "MSWin32" ? () : (
+        q{source/file\\with some\\whacks.txt} => "bar\n",
+        q{source/file'with'quotes\\or\\backslash.txt} => "quux\n",
+      ),
     },
   },
 );
@@ -28,36 +29,40 @@ $tzil->build;
 
 my $manihash = ExtUtils::Manifest::maniread($tzil->built_in->file('MANIFEST'));
 
-is_deeply(
-  [ sort keys %$manihash ],
-  [ sort(
+cmp_deeply(
+  [ keys %$manihash ],
+  bag(
     'MANIFEST',
     q{file with spaces.txt},
-    # q{file\\with some\\whacks.txt},
-    # q{file'with'quotes\\or\\backslash.txt},
-    # q{'file-with-ticks.txt'},
+    q{'file-with-ticks.txt'},
     'dist.ini',
     'lib/DZT/Sample.pm',
     't/basic.t',
-  ) ],
+    $^O eq "MSWin32" ? () : (
+      q{file\\with some\\whacks.txt},
+      q{file'with'quotes\\or\\backslash.txt},
+    ),
+  ),
   'manifest quotes files with spaces'
 );
 
-my @manilines = split /\n/, $tzil->slurp_file('build/MANIFEST');
+my @manilines = grep { ! /^#/ } split /\n/, $tzil->slurp_file('build/MANIFEST');
 chomp @manilines;
 
-is_deeply(
-  [ sort @manilines ],
-  [ sort(
+cmp_deeply(
+  \@manilines,
+  bag(
     'MANIFEST',
     q{'file with spaces.txt'},
-    # q{'file\\\\with some\\\\whacks.txt'},
-    # q{'\\'file-with-ticks.txt\\''},
-    # q{'file\\'with\\'quotes\\\\or\\\\backslash.txt'},
+    q{'\\'file-with-ticks.txt\\''},
     'dist.ini',
     'lib/DZT/Sample.pm',
     't/basic.t',
-  ) ],
+    $^O eq "MSWin32" ? () : (
+      q{'file\\\\with some\\\\whacks.txt'},
+      q{'file\\'with\\'quotes\\\\or\\\\backslash.txt'},
+    ),
+  ),
   'manifest quotes files with spaces'
 );
 
@@ -1,4 +1,3 @@
-#!perl
 use strict;
 use warnings;
 
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Test::DZil;
 use Test::Deep;
 use CPAN::Meta::Converter;
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use autodie;
 use JSON 2;
 use Test::DZil;
@@ -1,8 +1,7 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use Test::Deep;
 
 use Test::DZil;
 
@@ -43,21 +42,24 @@ use Test::DZil;
     },
     build_requires => {
       'Builder::Bob'  => '9.901',
-      'Module::Build' => '0.3601',
+      'Module::Build' => '0.28',
+    },
+    test_requires => {
       'Test::Deet'    => '7',
     },
     'configure_requires' => {
-      'Module::Build' => '0.3601',
+      'Module::Build' => '0.28',
     },
+    'recommends' => {},
+    'recursive_test_files' => ignore,
+    'script_files' => [],
   );
 
-  for my $key (sort keys %want) {
-    is_deeply(
-      $have->{ $key },
-      $want{ $key },
-      "correct value set for $key",
-    );
-  }
+  cmp_deeply(
+    $have,
+    \%want,
+    'module_build_args',
+  );
 
   is($modulebuild->_use_custom_class, q{}, 'no custom class by default');
 }
@@ -1,8 +1,7 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use utf8;
 
 use Test::DZil;
 use Test::Fatal;
@@ -169,6 +168,31 @@ END_CHANGES
       add_files => {
         'source/Changes' => $changes,
         'source/dist.ini' => simple_ini(
+          qw(GatherDir NextRelease FakeRelease)
+        ),
+      },
+    },
+  );
+
+  $tzil_trial->build;
+
+  like(
+    $tzil_trial->slurp_file('build/Changes'),
+    # not using /m here because it stinks on 5.8.8
+    qr{0\.001 .+ \(TRIAL RELEASE\)},
+    "adding -TRIAL works",
+  );
+}
+
+{
+  local $ENV{TRIAL} = 1;
+
+  my $tzil_trial = Builder->from_config(
+    { dist_root => 'corpus/dist/DZT' },
+    {
+      add_files => {
+        'source/Changes' => $changes,
+        'source/dist.ini' => simple_ini(
                 'GatherDir',
                 [ NextRelease => { format => "%v%T", } ],
                 'FakeRelease',
@@ -295,4 +319,18 @@ END_CHANGES
   );
 }
 
+{
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZ-NonAscii' },
+  );
+
+  $tzil->build;
+
+  like(
+    $tzil->slurp_file('build/Changes'),
+    qr{Olivier Mengué},
+    "dolmen's name is unmangled",
+  );
+}
+
 done_testing;
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use autodie;
 use Test::DZil;
 
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use autodie;
 use Test::DZil;
 
@@ -26,6 +24,36 @@ print "\$VERSION = 1.234;"
 1;
 ';
 
+my $in_comment = '
+package DZT::WInComment;
+# our $VERSION = 1.234;
+1;
+';
+
+my $in_comment_in_sub = '
+package DZT::WInCommentInSub;
+sub foo {
+    # our $VERSION = 1.234;
+}
+1;
+';
+
+my $in_pod_stm = '
+package DZT::WInPODStm;
+
+1;
+
+END
+our $VERSION = 1.234;
+=for bug
+
+  # Because we have an END up there PPI considers this a statement
+
+  our $VERSION = 1.234;
+
+=cut
+';  $in_pod_stm =~ s/END/__END__/g;
+
 my $two_packages = '
 package DZT::TP1;
 
@@ -74,6 +102,19 @@ my $script_pkg = '
 package DZT::Script;
 ';
 
+my $pod_with_pkg = '
+package DZT::PodWithPackage;
+=pod
+
+=cut
+';
+
+my $pod_no_pkg = '
+=pod
+
+=cut
+';
+
 my $tzil = Builder->from_config(
   { dist_root => 'corpus/dist/DZT' },
   {
@@ -82,9 +123,14 @@ my $tzil = Builder->from_config(
       'source/lib/DZT/WVer.pm'   => $with_version,
       'source/lib/DZT/WVerTwoLines.pm' => $with_version_two_lines,
       'source/lib/DZT/WStrEscaped.pm'  => $in_a_string_escaped,
+      'source/lib/DZT/WInComment.pm' => $in_comment,
+      'source/lib/DZT/WInCommentInSub.pm' => $in_comment_in_sub,
+      'source/lib/DZT/WInPODStm.pm' => $in_pod_stm,
       'source/lib/DZT/R1.pm'     => $repeated_packages,
       'source/lib/DZT/Monkey.pm' => $monkey_patched,
       'source/lib/DZT/HideMe.pm' => $hide_me_comment,
+      'source/lib/DZT/PodWithPackage.pm' => $pod_with_pkg,
+      'source/lib/DZT/PodNoPackage.pm' => $pod_no_pkg,
       'source/bin/script_pkg.pl' => $script_pkg,
       'source/bin/script_ver.pl' => $script_pkg . "our \$VERSION = 1.234;\n",
       'source/bin/script.pl'     => $script,
@@ -129,6 +175,27 @@ unlike(
   "*not* added to DZT::WVerTwoLines; we have one already",
 );
 
+my $dzt_wver_in_comment = $tzil->slurp_file('build/lib/DZT/WInComment.pm');
+like(
+  $dzt_wver_in_comment,
+  qr{^\s*\$\QDZT::WInComment::VERSION = '0.001';\E\s*$}m,
+  "added to DZT::WInComment; the one we have is in a comment",
+);
+
+my $dzt_wver_in_comment_in_sub = $tzil->slurp_file('build/lib/DZT/WInCommentInSub.pm');
+like(
+  $dzt_wver_in_comment_in_sub,
+  qr{^\s*\$\QDZT::WInCommentInSub::VERSION = '0.001';\E\s*$}m,
+  "added to DZT::WInCommentInSub; the one we have is in a comment",
+);
+
+my $dzt_wver_in_pod_stm = $tzil->slurp_file('build/lib/DZT/WInPODStm.pm');
+like(
+  $dzt_wver_in_pod_stm,
+  qr{^\s*\$\QDZT::WInPODStm::VERSION = '0.001';\E\s*$}m,
+  "added to DZT::WInPODStm; the one we have is in some POD",
+);
+
 my $dzt_wver_str_escaped = $tzil->slurp_file('build/lib/DZT/WStrEscaped.pm');
 like(
   $dzt_wver_str_escaped,
@@ -189,6 +256,20 @@ unlike(
   "no version for DZT::TP2 when it was hidden with a comment"
 );
 
+my $dzt_podwithpackage = $tzil->slurp_file('build/lib/DZT/PodWithPackage.pm');
+like(
+  $dzt_podwithpackage,
+  qr{^\s*\$\QDZT::PodWithPackage::VERSION = '0.001';\E\s*$}m,
+  "added version to DZT::PodWithPackage",
+);
+
+my $dzt_podnopackage = $tzil->slurp_file('build/lib/DZT/PodNoPackage.pm');
+unlike(
+  $dzt_podnopackage,
+  qr{VERSION},
+  "no version for pod files with no package declaration"
+);
+
 {
   local $ENV{TRIAL} = 1;
 
@@ -204,6 +285,10 @@ unlike(
   $tzil_trial->build;
 
   my $dzt_sample_trial = $tzil_trial->slurp_file('build/lib/DZT/Sample.pm');
+  my $assignments = () = $dzt_sample_trial =~ /(DZT::Sample::VERSION =)/g;
+
+  is($assignments, 1, "we only add 1 VERSION assignment");
+
   like(
     $dzt_sample_trial,
     qr{^\s*\$\QDZT::Sample::VERSION = '0.001'; # TRIAL\E\s*$}m,
@@ -211,5 +296,38 @@ unlike(
   );
 }
 
+my $two_packages_weird = <<'END';
+package DZT::TPW1;
+
+{package DZT::TPW2;
+
+sub tmp}
+END
+
+my $tzil2 = Builder->from_config(
+  { dist_root => 'corpus/dist/DZT' },
+  {
+    add_files => {
+      'source/lib/DZT/TPW.pm'    => $two_packages_weird,
+      'source/dist.ini' => simple_ini('GatherDir', 'PkgVersion', 'ExecDir'),
+    },
+  },
+);
+$tzil2->plugins->[1]->{die_on_line_insertion} = 1;
+$tzil2->build;
+
+my $dzt_tpw = $tzil2->slurp_file('build/lib/DZT/TPW.pm');
+like(
+  $dzt_tpw,
+  qr{^\s*\$\QDZT::TPW1::VERSION = '0.001';\E\s*$}m,
+  "added version to DZT::TPW1",
+);
+
+like(
+  $dzt_tpw,
+  qr{^\s*\$\QDZT::TPW2::VERSION = '0.001';\E\s*$}m,
+  "added version to DZT::TPW2",
+);
+
 done_testing;
 
@@ -3,8 +3,6 @@ use warnings;
 use Test::More 0.88;
 use Test::Fatal qw(exception);
 
-use lib 't/lib';
-
 use JSON 2;
 use Test::DZil;
 
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use autodie;
 use Test::DZil;
 
@@ -41,6 +39,22 @@ sub foo { }
 1;
 ';
 
+my $with_multi_line_abstract = '
+
+package DZT::MLA;
+
+=head1 NAME
+
+DZT::MLA - This abstract spans
+multiple lines.
+
+=cut
+
+sub foo { }
+
+1;
+';
+
 my $script = '
 #!/usr/bin/perl
 
@@ -59,6 +73,7 @@ my $tzil = Builder->from_config(
     add_files => {
       'source/lib/DZT/WPFP.pm' => $with_place_for_pod,
       'source/lib/DZT/WVer.pm' => $with_version,
+      'source/lib/DZT/MLA.pm' => $with_multi_line_abstract,
       'source/bin/script.pl'   => $script,
       'source/dist.ini' => simple_ini('GatherDir', 'PodVersion', 'ExecDir'),
     },
@@ -75,6 +90,19 @@ version 0.001
 =cut
 END_POD
 
+my $want_mla = <<'END_POD';
+=head1 NAME
+
+DZT::MLA - This abstract spans
+multiple lines.
+
+=head1 VERSION
+
+version 0.001
+
+=cut
+END_POD
+
 my $dzt_sample = $tzil->slurp_file('build/lib/DZT/Sample.pm');
 ok(
   index($dzt_sample, $want) == -1,
@@ -93,6 +121,12 @@ ok(
   "we didn't add version pod to WVer; it has one already",
 );
 
+my $dzt_mla = $tzil->slurp_file('build/lib/DZT/MLA.pm');
+ok(
+  index($dzt_mla, $want_mla) > 0,
+  "we properly skipped over multi-line abstract",
+);
+
 my $dzt_script = $tzil->slurp_file('build/bin/script.pl');
 ok(
   index($dzt_script, $want) > 0,
@@ -3,8 +3,6 @@ use warnings;
 use Test::More 0.88;
 use Test::Fatal qw(exception);
 
-use lib 't/lib';
-
 use JSON 2;
 use Test::DZil;
 
@@ -46,6 +44,47 @@ use Test::DZil;
   );
 }
 
+# test that we avoid a CPAN.pm bug by synchronizing Runtime|Build|Test requires
+{
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZT' },
+    {
+      add_files => {
+        'source/dist.ini' => simple_ini(
+          [ GatherDir => ],
+          [ MetaJSON  => ],
+          [ Prereqs => RuntimeRequires  => { A => 2, B => 0, C => 2 } ],
+          [ RemovePrereqs => { remove => [ qw(C) ] } ],
+          [ Prereqs => TestRequires     => { A => 1, B => 1, C => 1 } ],
+          [ Prereqs => BuildRequires    => { A => 0, B => 2, C => 0 } ],
+        ),
+      },
+    },
+  );
+
+  $tzil->build;
+
+  my $json = $tzil->slurp_file('build/META.json');
+
+  my $meta = JSON->new->decode($json);
+
+  is_deeply(
+    $meta->{prereqs},
+    {
+      runtime => {
+        requires   => { A => 2, B => 2 },
+      },
+      test => {
+        requires   => { A => 2, B => 2, C => 1 },
+      },
+      build => {
+        requires   => { A => 2, B => 2, C => 1 },
+      },
+    },
+    "prereqs synchronized across runtime, build & test phases",
+  );
+}
+
 {
   my $tzil = Builder->from_config(
     { dist_root => 'corpus/dist/DZT' },
@@ -1,8 +1,7 @@
 use strict;
 use warnings;
 use Test::More 0.88;
-
-use lib 't/lib';
+use utf8;
 
 use autodie;
 use Test::DZil;
@@ -39,5 +38,21 @@ like(
   "dist name appears in README",
 );
 
+{
+  my $tzil = Builder->from_config(
+    { dist_root => 'corpus/dist/DZ-NonAscii' },
+  );
+
+  $tzil->build;
+
+  my $contents = $tzil->slurp_file('build/README');
+
+  like(
+    $contents,
+    qr{ภูมิพลอดุลยเดช},
+    "HRH unmangled in README",
+  );
+}
+
 done_testing;
 
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88 tests => 16;
 
-use lib 't/lib';
-
 use File::Spec ();
 use Test::DZil qw(Builder simple_ini);
 use Test::Fatal qw(exception);
@@ -2,8 +2,6 @@ use strict;
 use warnings;
 use Test::More 0.88;
 
-use lib 't/lib';
-
 use Dist::Zilla::App::Tester;
 use Test::DZil;
 
@@ -13,6 +11,7 @@ $ENV{DZIL_GLOBAL_CONFIG_ROOT} = 't';
 
 my $result = test_dzil('corpus/dist/DZ1', [ qw(build) ]);
 
+is($result->error, undef, 'No errors');
 is($result->exit_code, 0, "dzil would have exited 0");
 
 ok(
@@ -18,6 +18,8 @@ my $tzil = Builder->from_config(
 
 $tzil->release;
 
+is($tzil->VERSION, Dist::Zilla->VERSION, "zilla tester VERSION");
+
 my $basename = $tzil->dist_basename;
 my $tarball  = $tzil->archive_filename;
 
@@ -22,8 +22,7 @@ If no real package is found, substitutes stubs instead of basic functions.
 =head1 SYNOPSIS
 EOP
 
-    is abstract_from_string($pod), 'Perl interface to various C<readline> packages.
-If no real package is found, substitutes stubs instead of basic functions.';
+    is abstract_from_string($pod), 'Perl interface to various C<readline> packages. If no real package is found, substitutes stubs instead of basic functions.';
 }
 
 {
@@ -0,0 +1,34 @@
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::Test::CheckBreaks 0.011
+
+use Test::More 0.88;
+
+SKIP: {
+    eval 'require Moose::Conflicts; Moose::Conflicts->check_conflicts';
+    skip('no Moose::Conflicts module found', 1) if not $INC{'Moose/Conflicts.pm'};
+
+    diag $@ if $@;
+    pass 'conflicts checked via Moose::Conflicts';
+}
+
+my $breaks = {
+  "Dist::Zilla::Plugin::MakeMaker::Awesome" => "< 0.22"
+};
+
+use CPAN::Meta::Requirements;
+my $reqs = CPAN::Meta::Requirements->new;
+$reqs->add_string_requirement($_, $breaks->{$_}) foreach keys %$breaks;
+
+use CPAN::Meta::Check 0.007 'check_requirements';
+our $result = check_requirements($reqs, 'conflicts');
+
+if (my @breaks = grep { defined $result->{$_} } keys %$result)
+{
+    diag 'Breakages found with Dist-Zilla:';
+    diag "$result->{$_}" for sort @breaks;
+    diag "\n", 'You should now update these modules!';
+}
+
+done_testing;
@@ -4,7 +4,7 @@ use Test::More tests => 2;
 
 note 'Checking Changes';
 my $changes_file = 'Changes';
-my $newver = '4.300030';
+my $newver = '5.025';
 my $trial_token = '-TRIAL';
 
 SKIP: {
@@ -1,7 +1,6 @@
 #!perl
+# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests.
 use Test::More;
-
-eval "use Test::Pod 1.41";
-plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
+use Test::Pod 1.41;
 
 all_pod_files_ok();