The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Build.PL 4141
CONTRIBUTING 526
Changes 09
MANIFEST 63
META.json 183421
META.yml 160289
Makefile.PL 1310
README 22
README.md 2570
TODO 90
dist.ini 315
lib/MooseX/Storage/Base/WithChecksum.pm 112
lib/MooseX/Storage/Basic.pm 112
lib/MooseX/Storage/Deferred.pm 114
lib/MooseX/Storage/Engine/IO/AtomicFile.pm 112
lib/MooseX/Storage/Engine/IO/File.pm 82
lib/MooseX/Storage/Engine/Trait/DisableCycleDetection.pm 112
lib/MooseX/Storage/Engine/Trait/OnlyWhenBuilt.pm 112
lib/MooseX/Storage/Engine.pm 136
lib/MooseX/Storage/Format/JSON.pm 112
lib/MooseX/Storage/Format/Storable.pm 86
lib/MooseX/Storage/Format/YAML.pm 82
lib/MooseX/Storage/IO/AtomicFile.pm 112
lib/MooseX/Storage/IO/File.pm 112
lib/MooseX/Storage/IO/StorableFile.pm 112
lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm 155
lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm 155
lib/MooseX/Storage/Traits/DisableCycleDetection.pm 114
lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm 114
lib/MooseX/Storage/Util.pm 114
lib/MooseX/Storage.pm 3542
t/00-report-prereqs.dd 0166
t/00-report-prereqs.t 187136
t/001_basic.t 10
t/002_basic_io.t 11
t/002_basic_w_subtypes.t 10
t/003_basic_w_embedded_objects.t 10
t/004_w_cycles.t 30
t/006_w_custom_type_handlers.t 50
t/007_false.t 10
t/008_do_not_serialize.t 50
t/010_basic_json.t 21
t/011_basic_json_w_utf8.t 05
t/012_param_json.t 10
t/020_basic_yaml.t 21
t/020_basic_yaml_syck.t 11
t/020_basic_yaml_xs.t 11
t/030_with_checksum.t 01
t/040_basic_utils.t 20
t/050_basic_storable.t 512
t/060_basic_deferred.t 617
t/061_basic_deferred_w_io.t 310
t/070_basic_maybe.t 319
t/100_io.t 29
t/101_io_atomic.t 29
t/102_io_storable_file.t 28
t/103_io_storable_file_custom.t 29
t/104_io_w_utf8.t 04
t/105_io_atomic_w_utf8.t 05
t/300_overloaded.t 01
t/zzz-check-breaks.t 11
weaver.ini 20
xt/author/00-compile.t 22
xt/author/no-tabs.t 082
xt/author/pod-spell.t 4144
xt/release/changes_has_content.t 11
xt/release/clean-namespaces.t 22
xt/release/kwalitee.t 27
xt/release/no-tabs.t 330
xt/release/test-version.t 220
xt/release/unused-vars.t 80
71 files changed (This is a version diff) 12401573
@@ -1,4 +1,141 @@
-# This Build.PL for MooseX-Storage was generated by Dist::Zilla::Plugin::ModuleBuildTiny 0.006.
-use 5.008;
-use Module::Build::Tiny 0.035;
-Build_PL();
+# This Build.PL for MooseX-Storage was generated by
+# Dist::Zilla::Plugin::ModuleBuildTiny::Fallback 0.005
+if (eval 'use Module::Build::Tiny 0.037; 1')
+{
+    print "Congratulations, your toolchain understands 'configure_requires'!\n\n";
+
+    # This section for MooseX-Storage was generated by Dist::Zilla::Plugin::ModuleBuildTiny 0.006.
+    use 5.008;
+    # use Module::Build::Tiny 0.037;
+    Build_PL();
+}
+else
+{
+    $ENV{PERL_MB_FALLBACK_SILENCE_WARNING} or warn <<'EOW';
+*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***
+
+If you're seeing this warning, your toolchain is really, really old* and you'll
+almost certainly have problems installing CPAN modules from this century. But
+never fear, dear user, for we have the technology to fix this!
+
+If you're using CPAN.pm to install things, then you can upgrade it using:
+
+    cpan CPAN
+
+If you're using CPANPLUS to install things, then you can upgrade it using:
+
+    cpanp CPANPLUS
+
+If you're using cpanminus, you shouldn't be seeing this message in the first
+place, so please file an issue on github.
+
+This public service announcement was brought to you by the Perl Toolchain
+Gang, the irc.perl.org #toolchain IRC channel, and the number 42.
+
+----
+
+* Alternatively, you are running this file manually, in which case you need
+to learn to first fulfill all configure requires prerequisites listed in
+META.yml or META.json -- or use a cpan client to install this distribution.
+
+You can also silence this warning for future installations by setting the
+PERL_MB_FALLBACK_SILENCE_WARNING environment variable, but please don't do
+that until you fix your toolchain as described above.
+
+EOW
+    sleep 10 if -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT));
+
+
+    # This section was automatically generated by Dist::Zilla::Plugin::ModuleBuild v5.020.
+    use strict;
+    use warnings;
+
+    require Module::Build; Module::Build->VERSION(0.28);
+
+
+    my %module_build_args = (
+      "build_requires" => {},
+      "configure_requires" => {
+        "ExtUtils::MakeMaker" => 0,
+        "Module::Build::Tiny" => "0.037"
+      },
+      "dist_abstract" => "A serialization framework for Moose classes",
+      "dist_author" => [
+        "Chris Prather <chris.prather\@iinteractive.com>",
+        "Stevan Little <stevan.little\@iinteractive.com>",
+        "\x{5d9}\x{5d5}\x{5d1}\x{5dc} \x{5e7}\x{5d5}\x{5d2}'\x{5de}\x{5df} (Yuval Kogman) <nothingmuch\@woobling.org>"
+      ],
+      "dist_name" => "MooseX-Storage",
+      "dist_version" => "0.47",
+      "license" => "perl",
+      "module_name" => "MooseX::Storage",
+      "recommends" => {
+        "IO::AtomicFile" => 0,
+        "IO::File" => 0,
+        "JSON::Any" => "1.15",
+        "MooseX::Storage::Format::JSONpm" => 0,
+        "Storable" => 0,
+        "YAML" => 0,
+        "YAML::Any" => 0,
+        "YAML::Syck" => 0,
+        "YAML::XS" => 0
+      },
+      "recursive_test_files" => 1,
+      "requires" => {
+        "Carp" => 0,
+        "Data::Dumper" => 0,
+        "Digest" => 0,
+        "Module::Runtime" => 0,
+        "Moose" => "0.99",
+        "Moose::Meta::Attribute" => 0,
+        "Moose::Role" => 0,
+        "Scalar::Util" => 0,
+        "String::RewritePrefix" => 0,
+        "namespace::autoclean" => 0,
+        "perl" => "5.008"
+      },
+      "script_files" => [],
+      "test_requires" => {
+        "ExtUtils::MakeMaker" => 0,
+        "File::Spec" => 0,
+        "File::Spec::Functions" => 0,
+        "File::Temp" => 0,
+        "Moose::Util::TypeConstraints" => 0,
+        "Test::Deep" => 0,
+        "Test::Fatal" => 0,
+        "Test::More" => 0,
+        "Test::Requires" => 0,
+        "overload" => 0,
+        "strict" => 0,
+        "utf8" => 0,
+        "warnings" => 0
+      }
+    );
+
+
+    my %fallback_build_requires = (
+      "ExtUtils::MakeMaker" => 0,
+      "File::Spec" => 0,
+      "File::Spec::Functions" => 0,
+      "File::Temp" => 0,
+      "Moose::Util::TypeConstraints" => 0,
+      "Test::Deep" => 0,
+      "Test::Fatal" => 0,
+      "Test::More" => 0,
+      "Test::Requires" => 0,
+      "overload" => 0,
+      "strict" => 0,
+      "utf8" => 0,
+      "warnings" => 0
+    );
+
+
+    unless ( eval { Module::Build->VERSION(0.4004) } ) {
+      delete $module_build_args{test_requires};
+      $module_build_args{build_requires} = \%fallback_build_requires;
+    }
+
+    my $build = Module::Build->new(%module_build_args);
+
+    $build->create_build_script;
+}
@@ -4,9 +4,14 @@ CONTRIBUTING
 Thank you for considering contributing to this distribution.  This file
 contains instructions that will help you work with the source code.
 
-The distribution is managed with Dist::Zilla.  This means than many of the
-usual files you might expect are not in the repository, but are generated
-at release time (e.g. Makefile.PL).
+PLEASE NOTE that if you have any questions or difficulties, you can reach me
+through the bug queue described later in this document, or by emailing me
+directly. You are not required to follow any of the steps in this document to
+submit a patch or bug report; these are just guidelines, intended to help you.
+
+The distribution is managed with Dist::Zilla (https://metacpan.org/release/Dist-Zilla).
+This means than many of the usual files you might expect are not in the
+repository, but are generated at release time (e.g. Makefile.PL).
 
 However, you can run tests directly using the 'prove' tool:
 
@@ -31,14 +36,24 @@ install it from CPAN, then run one of the following commands, depending on
 your CPAN client:
 
   $ cpan `dzil authordeps --missing`
+or
   $ dzil authordeps --missing | cpanm
 
 You should then also install any additional requirements not needed by the
 dzil build but may be needed by tests or other development:
 
-  # cpan `dzil listdeps --author --missing`
+  $ cpan `dzil listdeps --author --missing`
+or
   $ dzil listdeps --author --missing | cpanm
 
+Or, you can use the 'dzil stale' command to install all requirements at once:
+
+  $ cpan Dist::Zilla::App::Command::stale
+  $ cpan `dzil stale --all`
+or
+  $ cpanm Dist::Zilla::App::Command::stale
+  $ dzil stale --all | cpanm
+
 You can also do this via cpanm directly:
 
   $ cpanm --reinstall --installdeps --with-develop --with-recommends MooseX::Storage
@@ -73,6 +88,12 @@ http://lists.perl.org/list/moose.html.
 There is also an irc channel available for users of this distribution, at
 irc://irc.perl.org/#moose.
 
+If you send me a patch or pull request, your name and email address will be
+included in the documentation as a contributor, unless you specifically
+request for it not to be (using the attribution on the commit or patch).
+If you wish to be listed under a different name, you should submit a pull
+request to the .mailmap file to contain the correct mapping.
+
 
 This file was generated via Dist::Zilla::Plugin::GenerateFile::ShareDir 0.005 from a
-template file originating in Dist-Zilla-PluginBundle-Author-ETHER-0.054.
+template file originating in Dist-Zilla-PluginBundle-Author-ETHER-0.072.
@@ -1,5 +1,14 @@
 Revision history for MooseX-Storage
 
+0.47      2014-08-23 22:34:21Z
+  - report the versions of all JSON and YAML backends during tests, in an
+    attempt to track down an elusive bug
+  - now properly serializing attributes that are set to the undefined value
+    (github #6, thanks, Jason Pope!)
+  - fix compatibility problem with MooseX::Role::Parameterized 1.03+ and
+    MooseX::Storage::Format::JSONpm (some internal details changed that we
+    were relying on)
+
 0.46      2014-03-23 18:26:44Z
   - numerous small documentation clarifications and fixes
 
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.014.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.020.
 Build.PL
 CONTRIBUTING
 Changes
@@ -9,8 +9,6 @@ META.json
 META.yml
 Makefile.PL
 README
-README.md
-TODO
 dist.ini
 lib/MooseX/Storage.pm
 lib/MooseX/Storage/Base/WithChecksum.pm
@@ -32,6 +30,7 @@ lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm
 lib/MooseX/Storage/Traits/DisableCycleDetection.pm
 lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm
 lib/MooseX/Storage/Util.pm
+t/00-report-prereqs.dd
 t/00-report-prereqs.t
 t/000_load.t
 t/001_basic.t
@@ -67,6 +66,7 @@ t/300_overloaded.t
 t/zzz-check-breaks.t
 weaver.ini
 xt/author/00-compile.t
+xt/author/no-tabs.t
 xt/author/pod-spell.t
 xt/release/changes_has_content.t
 xt/release/clean-namespaces.t
@@ -76,10 +76,7 @@ xt/release/eol.t
 xt/release/kwalitee.t
 xt/release/minimum-version.t
 xt/release/mojibake.t
-xt/release/no-tabs.t
 xt/release/pod-coverage.t
 xt/release/pod-no404s.t
 xt/release/pod-syntax.t
 xt/release/portability.t
-xt/release/test-version.t
-xt/release/unused-vars.t
@@ -6,7 +6,19 @@
       "יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 5.014, CPAN::Meta::Converter version 2.140640",
+   "generated_by" : "Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060",
+   "keywords" : [
+      "moose",
+      "extension",
+      "serial",
+      "serialization",
+      "class",
+      "object",
+      "store",
+      "storage",
+      "types",
+      "strings"
+   ],
    "license" : [
       "perl_5"
    ],
@@ -89,28 +101,89 @@
    "prereqs" : {
       "configure" : {
          "requires" : {
-            "ExtUtils::MakeMaker" : "6.30",
-            "Module::Build::Tiny" : "0.035"
+            "ExtUtils::MakeMaker" : "0",
+            "Module::Build::Tiny" : "0.037"
          }
       },
       "develop" : {
          "recommends" : {
-            "Dist::Zilla::PluginBundle::Author::ETHER" : "0.054"
+            "Dist::Zilla::PluginBundle::Author::ETHER" : "0.072"
          },
          "requires" : {
             "Digest::HMAC_SHA1" : "0",
-            "Dist::Zilla" : "5.014",
-            "Dist::Zilla::Plugin::ContributorsFromGit" : "0",
+            "Dist::Zilla" : "5",
+            "Dist::Zilla::Plugin::Authority" : "0",
+            "Dist::Zilla::Plugin::AutoMetaResources" : "0",
+            "Dist::Zilla::Plugin::AutoPrereqs" : "0",
+            "Dist::Zilla::Plugin::CheckIssues" : "0",
+            "Dist::Zilla::Plugin::CheckPrereqsIndexed" : "0",
+            "Dist::Zilla::Plugin::CheckSelfDependency" : "0",
+            "Dist::Zilla::Plugin::CheckStrictVersion" : "0",
+            "Dist::Zilla::Plugin::ConfirmRelease" : "0",
+            "Dist::Zilla::Plugin::CopyFilesFromRelease" : "0",
+            "Dist::Zilla::Plugin::EOLTests" : "0",
+            "Dist::Zilla::Plugin::ExecDir" : "0",
+            "Dist::Zilla::Plugin::FileFinder::ByName" : "0",
+            "Dist::Zilla::Plugin::GenerateFile::ShareDir" : "0",
+            "Dist::Zilla::Plugin::Git::Check" : "0",
+            "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch" : "0.004",
+            "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts" : "0",
+            "Dist::Zilla::Plugin::Git::Commit" : "2.020",
+            "Dist::Zilla::Plugin::Git::Contributors" : "0.004",
+            "Dist::Zilla::Plugin::Git::Describe" : "0",
+            "Dist::Zilla::Plugin::Git::GatherDir" : "2.016",
+            "Dist::Zilla::Plugin::Git::NextVersion" : "0",
+            "Dist::Zilla::Plugin::Git::Push" : "0",
+            "Dist::Zilla::Plugin::Git::Remote::Check" : "0",
+            "Dist::Zilla::Plugin::Git::Tag" : "0",
             "Dist::Zilla::Plugin::GitHub::Update" : "0",
             "Dist::Zilla::Plugin::GithubMeta" : "0",
-            "Dist::Zilla::Plugin::MakeMaker::Fallback" : "0.008",
+            "Dist::Zilla::Plugin::InstallGuide" : "0",
+            "Dist::Zilla::Plugin::Keywords" : "0.004",
+            "Dist::Zilla::Plugin::License" : "0",
+            "Dist::Zilla::Plugin::MakeMaker::Fallback" : "0.012",
+            "Dist::Zilla::Plugin::Manifest" : "0",
+            "Dist::Zilla::Plugin::MetaConfig" : "0",
+            "Dist::Zilla::Plugin::MetaJSON" : "0",
+            "Dist::Zilla::Plugin::MetaNoIndex" : "0",
+            "Dist::Zilla::Plugin::MetaProvides::Package" : "1.15000002",
             "Dist::Zilla::Plugin::MetaResources" : "0",
-            "Dist::Zilla::Plugin::ModuleBuildTiny" : "0.004",
+            "Dist::Zilla::Plugin::MetaTests" : "0",
+            "Dist::Zilla::Plugin::MetaYAML" : "0",
+            "Dist::Zilla::Plugin::MinimumPerl" : "0",
+            "Dist::Zilla::Plugin::ModuleBuildTiny::Fallback" : "0.005",
+            "Dist::Zilla::Plugin::MojibakeTests" : "0",
+            "Dist::Zilla::Plugin::NextRelease" : "4.300018",
             "Dist::Zilla::Plugin::OptionalFeature" : "0",
+            "Dist::Zilla::Plugin::PkgVersion" : "5.010",
+            "Dist::Zilla::Plugin::PodCoverageTests" : "0",
+            "Dist::Zilla::Plugin::PodSyntaxTests" : "0",
+            "Dist::Zilla::Plugin::PodWeaver" : "0",
+            "Dist::Zilla::Plugin::Prereqs" : "0",
+            "Dist::Zilla::Plugin::Prereqs::AuthorDeps" : "0",
             "Dist::Zilla::Plugin::Prereqs::Soften" : "0.004000",
+            "Dist::Zilla::Plugin::PromptIfStale" : "0",
+            "Dist::Zilla::Plugin::Readme" : "0",
+            "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.142180",
+            "Dist::Zilla::Plugin::Run::AfterBuild" : "0",
+            "Dist::Zilla::Plugin::Run::AfterRelease" : "0",
+            "Dist::Zilla::Plugin::RunExtraTests" : "0.019",
+            "Dist::Zilla::Plugin::ShareDir" : "0",
+            "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0.008",
+            "Dist::Zilla::Plugin::Test::ChangesHasContent" : "0",
             "Dist::Zilla::Plugin::Test::CheckBreaks" : "0",
             "Dist::Zilla::Plugin::Test::CleanNamespaces" : "0",
-            "Dist::Zilla::PluginBundle::Author::ETHER" : "0.019",
+            "Dist::Zilla::Plugin::Test::Compile" : "2.039",
+            "Dist::Zilla::Plugin::Test::Kwalitee" : "0",
+            "Dist::Zilla::Plugin::Test::MinimumVersion" : "2.000003",
+            "Dist::Zilla::Plugin::Test::NoTabs" : "0",
+            "Dist::Zilla::Plugin::Test::Pod::No404s" : "0",
+            "Dist::Zilla::Plugin::Test::PodSpelling" : "0",
+            "Dist::Zilla::Plugin::Test::Portability" : "0",
+            "Dist::Zilla::Plugin::Test::ReportPrereqs" : "0",
+            "Dist::Zilla::Plugin::TestRelease" : "0",
+            "Dist::Zilla::Plugin::UploadToCPAN" : "0",
+            "Dist::Zilla::PluginBundle::Author::ETHER" : "0.068",
             "File::Spec" : "0",
             "IO::AtomicFile" : "0",
             "IO::File" : "0",
@@ -124,13 +197,14 @@
             "Storable" : "0",
             "Test::CPAN::Changes" : "0.19",
             "Test::CPAN::Meta" : "0",
-            "Test::CleanNamespaces" : ">= 0.04, != 0.06",
+            "Test::CleanNamespaces" : "0.15",
             "Test::Deep::JSON" : "0",
-            "Test::Kwalitee" : "1.12",
+            "Test::Kwalitee" : "1.21",
             "Test::More" : "0.94",
             "Test::NoTabs" : "0",
             "Test::Pod" : "1.41",
             "Test::Pod::Coverage" : "1.08",
+            "Test::Spelling" : "0.12",
             "Test::Without::Module" : "0",
             "YAML" : "0",
             "YAML::Any" : "0",
@@ -166,17 +240,16 @@
       },
       "test" : {
          "recommends" : {
-            "CPAN::Meta" : "0",
-            "CPAN::Meta::Requirements" : "2.120900",
+            "CPAN::Meta" : "2.120900",
             "Digest::HMAC_SHA1" : "0",
             "Test::Deep::JSON" : "0",
             "Test::Without::Module" : "0"
          },
          "requires" : {
             "ExtUtils::MakeMaker" : "0",
+            "File::Spec" : "0",
             "File::Spec::Functions" : "0",
             "File::Temp" : "0",
-            "List::Util" : "0",
             "Moose::Util::TypeConstraints" : "0",
             "Test::Deep" : "0",
             "Test::Fatal" : "0",
@@ -185,7 +258,6 @@
             "overload" : "0",
             "strict" : "0",
             "utf8" : "0",
-            "version" : "0",
             "warnings" : "0"
          }
       }
@@ -193,91 +265,91 @@
    "provides" : {
       "Moose::Meta::Attribute::Custom::DoNotSerialize" : {
          "file" : "lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "Moose::Meta::Attribute::Custom::Trait::DoNotSerialize" : {
          "file" : "lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage" : {
          "file" : "lib/MooseX/Storage.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Base::WithChecksum" : {
          "file" : "lib/MooseX/Storage/Base/WithChecksum.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Basic" : {
          "file" : "lib/MooseX/Storage/Basic.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Deferred" : {
          "file" : "lib/MooseX/Storage/Deferred.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Engine" : {
          "file" : "lib/MooseX/Storage/Engine.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Engine::IO::AtomicFile" : {
          "file" : "lib/MooseX/Storage/Engine/IO/AtomicFile.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Engine::IO::File" : {
          "file" : "lib/MooseX/Storage/Engine/IO/File.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Engine::Trait::DisableCycleDetection" : {
          "file" : "lib/MooseX/Storage/Engine/Trait/DisableCycleDetection.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Engine::Trait::OnlyWhenBuilt" : {
          "file" : "lib/MooseX/Storage/Engine/Trait/OnlyWhenBuilt.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Format::JSON" : {
          "file" : "lib/MooseX/Storage/Format/JSON.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Format::Storable" : {
          "file" : "lib/MooseX/Storage/Format/Storable.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Format::YAML" : {
          "file" : "lib/MooseX/Storage/Format/YAML.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::IO::AtomicFile" : {
          "file" : "lib/MooseX/Storage/IO/AtomicFile.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::IO::File" : {
          "file" : "lib/MooseX/Storage/IO/File.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::IO::StorableFile" : {
          "file" : "lib/MooseX/Storage/IO/StorableFile.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Meta::Attribute::DoNotSerialize" : {
          "file" : "lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize" : {
          "file" : "lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Traits::DisableCycleDetection" : {
          "file" : "lib/MooseX/Storage/Traits/DisableCycleDetection.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Traits::OnlyWhenBuilt" : {
          "file" : "lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       },
       "MooseX::Storage::Util" : {
          "file" : "lib/MooseX/Storage/Util.pm",
-         "version" : "0.46"
+         "version" : "0.47"
       }
    },
    "release_status" : "stable",
@@ -295,16 +367,37 @@
       "x_IRC" : "irc://irc.perl.org/#moose",
       "x_MailingList" : "http://lists.perl.org/list/moose.html"
    },
-   "version" : "0.46",
+   "version" : "0.47",
    "x_Dist_Zilla" : {
       "perl" : {
-         "version" : "5.019009"
+         "version" : "5.021003"
       },
       "plugins" : [
          {
+            "class" : "Dist::Zilla::Plugin::Prereqs",
+            "config" : {
+               "Dist::Zilla::Plugin::Prereqs" : {
+                  "phase" : "develop",
+                  "type" : "requires"
+               }
+            },
+            "name" : "@Author::ETHER/bundle_plugins",
+            "version" : "5.020"
+         },
+         {
             "class" : "Dist::Zilla::Plugin::Git::NextVersion",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::NextVersion" : {
+                  "first_version" : "0.001",
+                  "version_by_branch" : "0",
+                  "version_regexp" : "(?^:^v([\\d._]+)(-TRIAL)?$)"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::NextVersion",
-            "version" : "2.020"
+            "version" : "2.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::PromptIfStale",
@@ -319,8 +412,8 @@
                   "skip" : []
                }
             },
-            "name" : "@Author::ETHER/build",
-            "version" : "0.021"
+            "name" : "@Author::ETHER/stale modules, build",
+            "version" : "0.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::PromptIfStale",
@@ -333,53 +426,66 @@
                   "skip" : []
                }
             },
-            "name" : "@Author::ETHER/release",
-            "version" : "0.021"
+            "name" : "@Author::ETHER/stale modules, release",
+            "version" : "0.024"
          },
          {
             "class" : "Dist::Zilla::Plugin::ExecDir",
             "name" : "@Author::ETHER/ExecDir",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::ShareDir",
             "name" : "@Author::ETHER/ShareDir",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FileFinder::ByName",
             "name" : "@Author::ETHER/Examples",
-            "version" : "5.014"
+            "version" : "5.020"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::FileFinder::ByName",
+            "name" : "@Author::ETHER/ExtraTestFiles",
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::GatherDir",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::GatherDir" : {
+                  "include_untracked" : "0"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::GatherDir",
-            "version" : "2.020"
+            "version" : "2.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaYAML",
             "name" : "@Author::ETHER/MetaYAML",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaJSON",
             "name" : "@Author::ETHER/MetaJSON",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::License",
             "name" : "@Author::ETHER/License",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Readme",
             "name" : "@Author::ETHER/Readme",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Manifest",
             "name" : "@Author::ETHER/Manifest",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::GenerateFile::ShareDir",
@@ -388,6 +494,7 @@
                   "destination_filename" : "CONTRIBUTING",
                   "dist" : "Dist-Zilla-PluginBundle-Author-ETHER",
                   "encoding" : "UTF-8",
+                  "has_xs" : 0,
                   "source_filename" : "CONTRIBUTING"
                }
             },
@@ -398,34 +505,43 @@
             "class" : "Dist::Zilla::Plugin::Test::Compile",
             "config" : {
                "Dist::Zilla::Plugin::Test::Compile" : {
+                  "bail_out_on_fail" : "1",
+                  "fail_on_warning" : "author",
+                  "fake_home" : "0",
                   "filename" : "xt/author/00-compile.t",
                   "module_finder" : [
                      ":InstallModules"
                   ],
+                  "needs_display" : "0",
+                  "phase" : "develop",
                   "script_finder" : [
                      ":ExecFiles",
                      "@Author::ETHER/Examples"
+                  ],
+                  "skips" : [
+                     "^MooseX::Storage::((Engine::)?IO::|Format::)"
                   ]
                }
             },
             "name" : "@Author::ETHER/Test::Compile",
-            "version" : "2.039"
+            "version" : "2.046"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::NoTabs",
             "config" : {
                "Dist::Zilla::Plugin::Test::NoTabs" : {
-                  "module_finder" : [
-                     ":InstallModules"
-                  ],
-                  "script_finder" : [
+                  "filename" : "xt/author/no-tabs.t",
+                  "finder" : [
+                     ":InstallModules",
                      ":ExecFiles",
-                     "@Author::ETHER/Examples"
+                     "@Author::ETHER/Examples",
+                     ":TestFiles",
+                     "@Author::ETHER/ExtraTestFiles"
                   ]
                }
             },
             "name" : "@Author::ETHER/Test::NoTabs",
-            "version" : "0.06"
+            "version" : "0.09"
          },
          {
             "class" : "Dist::Zilla::Plugin::EOLTests",
@@ -435,12 +551,7 @@
          {
             "class" : "Dist::Zilla::Plugin::MetaTests",
             "name" : "@Author::ETHER/MetaTests",
-            "version" : "5.014"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::Test::Version",
-            "name" : "@Author::ETHER/Test::Version",
-            "version" : "0.002004"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes",
@@ -453,11 +564,6 @@
             "version" : "0.006"
          },
          {
-            "class" : "Dist::Zilla::Plugin::Test::UnusedVars",
-            "name" : "@Author::ETHER/Test::UnusedVars",
-            "version" : "2.000005"
-         },
-         {
             "class" : "Dist::Zilla::Plugin::Test::MinimumVersion",
             "name" : "@Author::ETHER/Test::MinimumVersion",
             "version" : "2.000005"
@@ -465,17 +571,17 @@
          {
             "class" : "Dist::Zilla::Plugin::PodSyntaxTests",
             "name" : "@Author::ETHER/PodSyntaxTests",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodCoverageTests",
             "name" : "@Author::ETHER/PodCoverageTests",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::PodSpelling",
             "name" : "@Author::ETHER/Test::PodSpelling",
-            "version" : "2.006007"
+            "version" : "2.006008"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::Pod::No404s",
@@ -484,18 +590,24 @@
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::Kwalitee",
+            "config" : {
+               "Dist::Zilla::Plugin::Test::Kwalitee" : {
+                  "filename" : "xt/release/kwalitee.t",
+                  "skiptest" : []
+               }
+            },
             "name" : "@Author::ETHER/Test::Kwalitee",
-            "version" : "2.07"
+            "version" : "2.10"
          },
          {
             "class" : "Dist::Zilla::Plugin::MojibakeTests",
             "name" : "@Author::ETHER/MojibakeTests",
-            "version" : "0.5"
+            "version" : "0.7"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs",
             "name" : "@Author::ETHER/Test::ReportPrereqs",
-            "version" : "0.013"
+            "version" : "0.019"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::Portability",
@@ -510,7 +622,7 @@
          {
             "class" : "Dist::Zilla::Plugin::PkgVersion",
             "name" : "@Author::ETHER/PkgVersion",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Authority",
@@ -612,35 +724,30 @@
                         "version" : "4.006"
                      },
                      {
-                        "class" : "Pod::Weaver::Plugin::StopWords",
-                        "name" : "-StopWords",
-                        "version" : "1.008"
-                     },
-                     {
                         "class" : "Pod::Weaver::Section::Contributors",
                         "name" : "Contributors",
-                        "version" : "0.007"
+                        "version" : "0.008"
                      }
                   ]
                }
             },
             "name" : "@Author::ETHER/PodWeaver",
-            "version" : "4.005"
+            "version" : "4.006"
          },
          {
             "class" : "Dist::Zilla::Plugin::NextRelease",
             "name" : "@Author::ETHER/NextRelease",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod",
             "name" : "@Author::ETHER/ReadmeAnyFromPod",
-            "version" : "0.133360"
+            "version" : "0.142250"
          },
          {
             "class" : "Dist::Zilla::Plugin::GithubMeta",
             "name" : "@Author::ETHER/GithubMeta",
-            "version" : "0.42"
+            "version" : "0.46"
          },
          {
             "class" : "Dist::Zilla::Plugin::AutoMetaResources",
@@ -650,7 +757,7 @@
          {
             "class" : "Dist::Zilla::Plugin::MetaNoIndex",
             "name" : "@Author::ETHER/MetaNoIndex",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaProvides::Package",
@@ -663,7 +770,7 @@
                      {
                         "class" : "Dist::Zilla::Plugin::FinderCode",
                         "name" : ":InstallModules",
-                        "version" : "5.014"
+                        "version" : "5.020"
                      }
                   ]
                },
@@ -674,22 +781,56 @@
                }
             },
             "name" : "@Author::ETHER/MetaProvides::Package",
-            "version" : "2.000001"
+            "version" : "2.000004"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaConfig",
             "name" : "@Author::ETHER/MetaConfig",
-            "version" : "5.014"
+            "version" : "5.020"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Keywords",
+            "config" : {
+               "Dist::Zilla::Plugin::Keywords" : {
+                  "keywords" : [
+                     "moose",
+                     "extension",
+                     "serial",
+                     "serialization",
+                     "class",
+                     "object",
+                     "store",
+                     "storage",
+                     "types",
+                     "strings"
+                  ]
+               }
+            },
+            "name" : "@Author::ETHER/Keywords",
+            "version" : "0.006"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Git::Contributors",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Contributors" : {
+                  "include_authors" : "0",
+                  "include_releaser" : "1",
+                  "order_by" : "commits",
+                  "paths" : []
+               }
+            },
+            "name" : "@Author::ETHER/Git::Contributors",
+            "version" : "0.007"
          },
          {
             "class" : "Dist::Zilla::Plugin::AutoPrereqs",
             "name" : "@Author::ETHER/AutoPrereqs",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs::AuthorDeps",
             "name" : "@Author::ETHER/Prereqs::AuthorDeps",
-            "version" : "0.002"
+            "version" : "0.003"
          },
          {
             "class" : "Dist::Zilla::Plugin::MinimumPerl",
@@ -701,57 +842,46 @@
             "config" : {
                "Dist::Zilla::Plugin::Prereqs" : {
                   "phase" : "develop",
-                  "type" : "requires"
-               }
-            },
-            "name" : "@Author::ETHER/installer_requirements",
-            "version" : "5.014"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::Prereqs",
-            "config" : {
-               "Dist::Zilla::Plugin::Prereqs" : {
-                  "phase" : "develop",
                   "type" : "recommends"
                }
             },
             "name" : "@Author::ETHER/pluginbundle_version",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
-            "class" : "Dist::Zilla::Plugin::RunExtraTests",
+            "class" : "Dist::Zilla::Plugin::MakeMaker::Fallback",
             "config" : {
                "Dist::Zilla::Role::TestRunner" : {
                   "default_jobs" : 9
                }
             },
-            "name" : "@Author::ETHER/RunExtraTests",
-            "version" : "0.020"
+            "name" : "@Author::ETHER/MakeMaker::Fallback",
+            "version" : "0.013"
          },
          {
-            "class" : "Dist::Zilla::Plugin::MakeMaker::Fallback",
+            "class" : "Dist::Zilla::Plugin::ModuleBuildTiny::Fallback",
             "config" : {
                "Dist::Zilla::Role::TestRunner" : {
                   "default_jobs" : 9
                }
             },
-            "name" : "@Author::ETHER/MakeMaker::Fallback",
-            "version" : "0.008"
+            "name" : "@Author::ETHER/ModuleBuildTiny::Fallback",
+            "version" : "0.005"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::InstallGuide",
+            "name" : "@Author::ETHER/InstallGuide",
+            "version" : "1.200003"
          },
          {
-            "class" : "Dist::Zilla::Plugin::ModuleBuildTiny",
+            "class" : "Dist::Zilla::Plugin::RunExtraTests",
             "config" : {
                "Dist::Zilla::Role::TestRunner" : {
                   "default_jobs" : 9
                }
             },
-            "name" : "@Author::ETHER/ModuleBuildTiny",
-            "version" : "0.006"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::InstallGuide",
-            "name" : "@Author::ETHER/InstallGuide",
-            "version" : "1.200002"
+            "name" : "@Author::ETHER/RunExtraTests",
+            "version" : "0.022"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckSelfDependency",
@@ -767,23 +897,58 @@
          },
          {
             "class" : "Dist::Zilla::Plugin::Run::AfterBuild",
+            "config" : {
+               "Dist::Zilla::Plugin::Run::Role::Runner" : {
+                  "run" : [
+                     "bash -c \"if [[ `dirname %d` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi; if [[ %d =~ ^%n-[.[:xdigit:]]+$ ]]; then rm -f .latest; ln -s %d .latest; fi\""
+                  ]
+               }
+            },
             "name" : "@Author::ETHER/Run::AfterBuild",
-            "version" : "0.021"
+            "version" : "0.023"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::CheckStrictVersion",
+            "name" : "@Author::ETHER/CheckStrictVersion",
+            "version" : "0.001"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Check",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Check" : {
+                  "untracked_files" : "die"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/initial check",
-            "version" : "2.020"
+            "version" : "2.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts",
+            "config" : {
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::CheckFor::MergeConflicts",
-            "version" : "0.009"
+            "version" : "0.011"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch",
+            "config" : {
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::CheckFor::CorrectBranch",
-            "version" : "0.009"
+            "version" : "0.011"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Remote::Check",
@@ -793,83 +958,155 @@
          {
             "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed",
             "name" : "@Author::ETHER/CheckPrereqsIndexed",
-            "version" : "0.010"
+            "version" : "0.012"
          },
          {
             "class" : "Dist::Zilla::Plugin::TestRelease",
             "name" : "@Author::ETHER/TestRelease",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Check",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Check" : {
+                  "untracked_files" : "die"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/after tests",
-            "version" : "2.020"
+            "version" : "2.023"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::CheckIssues",
+            "name" : "@Author::ETHER/CheckIssues",
+            "version" : "0.002"
          },
          {
             "class" : "Dist::Zilla::Plugin::UploadToCPAN",
             "name" : "@Author::ETHER/UploadToCPAN",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease",
             "name" : "@Author::ETHER/CopyFilesFromRelease",
-            "version" : "0.001"
+            "version" : "0.002"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::Run::AfterRelease",
+            "config" : {
+               "Dist::Zilla::Plugin::Run::Role::Runner" : {
+                  "run" : [
+                     "rm -f README.md"
+                  ]
+               }
+            },
+            "name" : "@Author::ETHER/remove old READMEs",
+            "version" : "0.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Commit",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Commit" : {
+                  "add_files_in" : [
+                     "."
+                  ],
+                  "commit_msg" : "%N-%v%t%n%n%c",
+                  "time_zone" : "local"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [
+                     "Changes",
+                     "README.md",
+                     "README.pod",
+                     "LICENSE",
+                     "CONTRIBUTING"
+                  ],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::Commit",
-            "version" : "2.020"
+            "version" : "2.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Tag",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Tag" : {
+                  "branch" : null,
+                  "signed" : 0,
+                  "tag" : "v0.47",
+                  "tag_format" : "v%v%t",
+                  "tag_message" : "v%v%t",
+                  "time_zone" : "local"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::Tag",
-            "version" : "2.020"
+            "version" : "2.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::GitHub::Update",
             "name" : "@Author::ETHER/GitHub::Update",
-            "version" : "0.36"
+            "version" : "0.38"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Push",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Push" : {
+                  "push_to" : [
+                     "origin"
+                  ],
+                  "remotes_must_exist" : 1
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@Author::ETHER/Git::Push",
-            "version" : "2.020"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::InstallRelease",
-            "name" : "@Author::ETHER/InstallRelease",
-            "version" : "0.008"
+            "version" : "2.023"
          },
          {
-            "class" : "Dist::Zilla::Plugin::Prereqs",
+            "class" : "Dist::Zilla::Plugin::Run::AfterRelease",
             "config" : {
-               "Dist::Zilla::Plugin::Prereqs" : {
-                  "phase" : "develop",
-                  "type" : "requires"
+               "Dist::Zilla::Plugin::Run::Role::Runner" : {
+                  "run" : "REDACTED"
                }
             },
-            "name" : "@Author::ETHER/via_options",
-            "version" : "5.014"
+            "name" : "@Author::ETHER/install release",
+            "version" : "0.023"
          },
          {
             "class" : "Dist::Zilla::Plugin::ConfirmRelease",
             "name" : "@Author::ETHER/ConfirmRelease",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaResources",
             "name" : "MetaResources",
-            "version" : "5.014"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::ContributorsFromGit",
-            "name" : "ContributorsFromGit",
-            "version" : "0.006"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::CleanNamespaces",
+            "config" : {
+               "Dist::Zilla::Plugin::Test::CleanNamespaces" : {
+                  "filename" : "xt/release/clean-namespaces.t",
+                  "skips" : []
+               }
+            },
             "name" : "Test::CleanNamespaces",
-            "version" : "0.003"
+            "version" : "0.005"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs::Soften",
@@ -886,7 +1123,7 @@
                }
             },
             "name" : "Prereqs::Soften",
-            "version" : "0.004000"
+            "version" : "0.004002"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -905,7 +1142,7 @@
                }
             },
             "name" : "JSON-Runtime",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -924,7 +1161,7 @@
                }
             },
             "name" : "JSON-RuntimeRecommends",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -943,7 +1180,7 @@
                }
             },
             "name" : "JSON-Test",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -962,7 +1199,7 @@
                }
             },
             "name" : "YAML-Runtime",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -983,7 +1220,7 @@
                }
             },
             "name" : "YAML-RuntimeRecommends",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -1002,7 +1239,7 @@
                }
             },
             "name" : "YAML-Test",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -1021,7 +1258,7 @@
                }
             },
             "name" : "Storable",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::OptionalFeature",
@@ -1041,57 +1278,57 @@
                }
             },
             "name" : "File",
-            "version" : "0.013"
+            "version" : "0.014"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::CheckBreaks",
             "name" : "Test::CheckBreaks",
-            "version" : "0.007"
+            "version" : "0.009"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":InstallModules",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":IncModules",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":TestFiles",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ExecFiles",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ShareFiles",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":MainModule",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":AllFiles",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":NoFiles",
-            "version" : "5.014"
+            "version" : "5.020"
          },
          {
             "class" : "Dist::Zilla::Plugin::VerifyPhases",
             "name" : "@Author::ETHER/PHASE VERIFICATION",
-            "version" : "0.002"
+            "version" : "0.003"
          }
       ],
       "zilla" : {
@@ -1099,28 +1336,29 @@
          "config" : {
             "is_trial" : "0"
          },
-         "version" : "5.014"
+         "version" : "5.020"
       }
    },
    "x_authority" : "cpan:STEVAN",
    "x_contributors" : [
+      "Karen Etheridge <ether@cpan.org>",
+      "Tomas Doran <bobtfish@bobtfish.net>",
+      "Ricardo Signes <rjbs@cpan.org>",
       "Chris Prather <chris@prather.org>",
-      "Cory Watson <gphat@Crankwizzah.local>",
+      "Yuval Kogman <nothingmuch@woobling.org>",
+      "Jos Boumans <jos@dwim.org>",
+      "Shawn M Moore <sartak@gmail.com>",
+      "Jonathan Yu <frequency@cpan.org>",
+      "Robert Boone <robo4288@gmail.com>",
       "Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>",
+      "Cory Watson <gphat@Crankwizzah.local>",
       "Dan Brook <dan@broquaint.com>",
-      "David Golden <dagolden@cpan.org>",
       "David Steinbrunner <dsteinbrunner@pobox.com>",
-      "Florian Ragwitz <rafl@debian.org>",
+      "Jason Pope <cowholio4@gmail.com>",
       "Johannes Plunien <plu@pqpq.de>",
       "Jonathan Rockway <jon@jrock.us>",
-      "Jonathan Yu <frequency@cpan.org>",
-      "Jos Boumans <jos@dwim.org>",
-      "Karen Etheridge <ether@cpan.org>",
-      "Ricardo Signes <rjbs@cpan.org>",
-      "Robert Boone <robo4288@gmail.com>",
-      "Shawn M Moore <sartak@gmail.com>",
-      "Tomas Doran <bobtfish@bobtfish.net>",
-      "Yuval Kogman <nothingmuch@woobling.org>"
+      "Florian Ragwitz <rafl@debian.org>",
+      "David Golden <dagolden@cpan.org>"
    ]
 }
 
@@ -6,9 +6,9 @@ author:
   - "יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>"
 build_requires:
   ExtUtils::MakeMaker: '0'
+  File::Spec: '0'
   File::Spec::Functions: '0'
   File::Temp: '0'
-  List::Util: '0'
   Moose::Util::TypeConstraints: '0'
   Test::Deep: '0'
   Test::Fatal: '0'
@@ -17,13 +17,23 @@ build_requires:
   overload: '0'
   strict: '0'
   utf8: '0'
-  version: '0'
   warnings: '0'
 configure_requires:
-  ExtUtils::MakeMaker: '6.30'
-  Module::Build::Tiny: '0.035'
+  ExtUtils::MakeMaker: '0'
+  Module::Build::Tiny: '0.037'
 dynamic_config: 0
-generated_by: 'Dist::Zilla version 5.014, CPAN::Meta::Converter version 2.140640'
+generated_by: 'Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060'
+keywords:
+  - moose
+  - extension
+  - serial
+  - serialization
+  - class
+  - object
+  - store
+  - storage
+  - types
+  - strings
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -60,70 +70,70 @@ optional_features:
 provides:
   Moose::Meta::Attribute::Custom::DoNotSerialize:
     file: lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm
-    version: '0.46'
+    version: '0.47'
   Moose::Meta::Attribute::Custom::Trait::DoNotSerialize:
     file: lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage:
     file: lib/MooseX/Storage.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Base::WithChecksum:
     file: lib/MooseX/Storage/Base/WithChecksum.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Basic:
     file: lib/MooseX/Storage/Basic.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Deferred:
     file: lib/MooseX/Storage/Deferred.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Engine:
     file: lib/MooseX/Storage/Engine.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Engine::IO::AtomicFile:
     file: lib/MooseX/Storage/Engine/IO/AtomicFile.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Engine::IO::File:
     file: lib/MooseX/Storage/Engine/IO/File.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Engine::Trait::DisableCycleDetection:
     file: lib/MooseX/Storage/Engine/Trait/DisableCycleDetection.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Engine::Trait::OnlyWhenBuilt:
     file: lib/MooseX/Storage/Engine/Trait/OnlyWhenBuilt.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Format::JSON:
     file: lib/MooseX/Storage/Format/JSON.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Format::Storable:
     file: lib/MooseX/Storage/Format/Storable.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Format::YAML:
     file: lib/MooseX/Storage/Format/YAML.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::IO::AtomicFile:
     file: lib/MooseX/Storage/IO/AtomicFile.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::IO::File:
     file: lib/MooseX/Storage/IO/File.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::IO::StorableFile:
     file: lib/MooseX/Storage/IO/StorableFile.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Meta::Attribute::DoNotSerialize:
     file: lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize:
     file: lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Traits::DisableCycleDetection:
     file: lib/MooseX/Storage/Traits/DisableCycleDetection.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Traits::OnlyWhenBuilt:
     file: lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm
-    version: '0.46'
+    version: '0.47'
   MooseX::Storage::Util:
     file: lib/MooseX/Storage/Util.pm
-    version: '0.46'
+    version: '0.47'
 recommends:
   IO::AtomicFile: '0'
   IO::File: '0'
@@ -152,15 +162,30 @@ resources:
   bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=MooseX-Storage
   homepage: https://github.com/moose/MooseX-Storage
   repository: https://github.com/moose/MooseX-Storage.git
-version: '0.46'
+version: '0.47'
 x_Dist_Zilla:
   perl:
-    version: '5.019009'
+    version: '5.021003'
   plugins:
     -
+      class: Dist::Zilla::Plugin::Prereqs
+      config:
+        Dist::Zilla::Plugin::Prereqs:
+          phase: develop
+          type: requires
+      name: '@Author::ETHER/bundle_plugins'
+      version: '5.020'
+    -
       class: Dist::Zilla::Plugin::Git::NextVersion
+      config:
+        Dist::Zilla::Plugin::Git::NextVersion:
+          first_version: '0.001'
+          version_by_branch: '0'
+          version_regexp: (?^:^v([\d._]+)(-TRIAL)?$)
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::NextVersion'
-      version: '2.020'
+      version: '2.023'
     -
       class: Dist::Zilla::Plugin::PromptIfStale
       config:
@@ -171,8 +196,8 @@ x_Dist_Zilla:
             - Dist::Zilla::PluginBundle::Author::ETHER
           phase: build
           skip: []
-      name: '@Author::ETHER/build'
-      version: '0.021'
+      name: '@Author::ETHER/stale modules, build'
+      version: '0.024'
     -
       class: Dist::Zilla::Plugin::PromptIfStale
       config:
@@ -182,44 +207,53 @@ x_Dist_Zilla:
           modules: []
           phase: release
           skip: []
-      name: '@Author::ETHER/release'
-      version: '0.021'
+      name: '@Author::ETHER/stale modules, release'
+      version: '0.024'
     -
       class: Dist::Zilla::Plugin::ExecDir
       name: '@Author::ETHER/ExecDir'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::ShareDir
       name: '@Author::ETHER/ShareDir'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FileFinder::ByName
       name: '@Author::ETHER/Examples'
-      version: '5.014'
+      version: '5.020'
+    -
+      class: Dist::Zilla::Plugin::FileFinder::ByName
+      name: '@Author::ETHER/ExtraTestFiles'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Git::GatherDir
+      config:
+        Dist::Zilla::Plugin::Git::GatherDir:
+          include_untracked: '0'
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::GatherDir'
-      version: '2.020'
+      version: '2.023'
     -
       class: Dist::Zilla::Plugin::MetaYAML
       name: '@Author::ETHER/MetaYAML'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::MetaJSON
       name: '@Author::ETHER/MetaJSON'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::License
       name: '@Author::ETHER/License'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Readme
       name: '@Author::ETHER/Readme'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Manifest
       name: '@Author::ETHER/Manifest'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::GenerateFile::ShareDir
       config:
@@ -227,6 +261,7 @@ x_Dist_Zilla:
           destination_filename: CONTRIBUTING
           dist: Dist-Zilla-PluginBundle-Author-ETHER
           encoding: UTF-8
+          has_xs: 0
           source_filename: CONTRIBUTING
       name: '@Author::ETHER/generate CONTRIBUTING'
       version: '0.005'
@@ -234,25 +269,34 @@ x_Dist_Zilla:
       class: Dist::Zilla::Plugin::Test::Compile
       config:
         Dist::Zilla::Plugin::Test::Compile:
+          bail_out_on_fail: '1'
+          fail_on_warning: author
+          fake_home: '0'
           filename: xt/author/00-compile.t
           module_finder:
             - ':InstallModules'
+          needs_display: '0'
+          phase: develop
           script_finder:
             - ':ExecFiles'
             - '@Author::ETHER/Examples'
+          skips:
+            - ^MooseX::Storage::((Engine::)?IO::|Format::)
       name: '@Author::ETHER/Test::Compile'
-      version: '2.039'
+      version: '2.046'
     -
       class: Dist::Zilla::Plugin::Test::NoTabs
       config:
         Dist::Zilla::Plugin::Test::NoTabs:
-          module_finder:
+          filename: xt/author/no-tabs.t
+          finder:
             - ':InstallModules'
-          script_finder:
             - ':ExecFiles'
             - '@Author::ETHER/Examples'
+            - ':TestFiles'
+            - '@Author::ETHER/ExtraTestFiles'
       name: '@Author::ETHER/Test::NoTabs'
-      version: '0.06'
+      version: '0.09'
     -
       class: Dist::Zilla::Plugin::EOLTests
       name: '@Author::ETHER/EOLTests'
@@ -260,11 +304,7 @@ x_Dist_Zilla:
     -
       class: Dist::Zilla::Plugin::MetaTests
       name: '@Author::ETHER/MetaTests'
-      version: '5.014'
-    -
-      class: Dist::Zilla::Plugin::Test::Version
-      name: '@Author::ETHER/Test::Version'
-      version: '0.002004'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Test::CPAN::Changes
       name: '@Author::ETHER/Test::CPAN::Changes'
@@ -274,41 +314,41 @@ x_Dist_Zilla:
       name: '@Author::ETHER/Test::ChangesHasContent'
       version: '0.006'
     -
-      class: Dist::Zilla::Plugin::Test::UnusedVars
-      name: '@Author::ETHER/Test::UnusedVars'
-      version: '2.000005'
-    -
       class: Dist::Zilla::Plugin::Test::MinimumVersion
       name: '@Author::ETHER/Test::MinimumVersion'
       version: '2.000005'
     -
       class: Dist::Zilla::Plugin::PodSyntaxTests
       name: '@Author::ETHER/PodSyntaxTests'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::PodCoverageTests
       name: '@Author::ETHER/PodCoverageTests'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Test::PodSpelling
       name: '@Author::ETHER/Test::PodSpelling'
-      version: '2.006007'
+      version: '2.006008'
     -
       class: Dist::Zilla::Plugin::Test::Pod::No404s
       name: '@Author::ETHER/Test::Pod::No404s'
       version: '1.001'
     -
       class: Dist::Zilla::Plugin::Test::Kwalitee
+      config:
+        Dist::Zilla::Plugin::Test::Kwalitee:
+          filename: xt/release/kwalitee.t
+          skiptest: []
       name: '@Author::ETHER/Test::Kwalitee'
-      version: '2.07'
+      version: '2.10'
     -
       class: Dist::Zilla::Plugin::MojibakeTests
       name: '@Author::ETHER/MojibakeTests'
-      version: '0.5'
+      version: '0.7'
     -
       class: Dist::Zilla::Plugin::Test::ReportPrereqs
       name: '@Author::ETHER/Test::ReportPrereqs'
-      version: '0.013'
+      version: '0.019'
     -
       class: Dist::Zilla::Plugin::Test::Portability
       name: '@Author::ETHER/Test::Portability'
@@ -320,7 +360,7 @@ x_Dist_Zilla:
     -
       class: Dist::Zilla::Plugin::PkgVersion
       name: '@Author::ETHER/PkgVersion'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Authority
       name: '@Author::ETHER/Authority'
@@ -402,27 +442,23 @@ x_Dist_Zilla:
               name: -Transformer
               version: '4.006'
             -
-              class: Pod::Weaver::Plugin::StopWords
-              name: -StopWords
-              version: '1.008'
-            -
               class: Pod::Weaver::Section::Contributors
               name: Contributors
-              version: '0.007'
+              version: '0.008'
       name: '@Author::ETHER/PodWeaver'
-      version: '4.005'
+      version: '4.006'
     -
       class: Dist::Zilla::Plugin::NextRelease
       name: '@Author::ETHER/NextRelease'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::ReadmeAnyFromPod
       name: '@Author::ETHER/ReadmeAnyFromPod'
-      version: '0.133360'
+      version: '0.142250'
     -
       class: Dist::Zilla::Plugin::GithubMeta
       name: '@Author::ETHER/GithubMeta'
-      version: '0.42'
+      version: '0.46'
     -
       class: Dist::Zilla::Plugin::AutoMetaResources
       name: '@Author::ETHER/AutoMetaResources'
@@ -430,7 +466,7 @@ x_Dist_Zilla:
     -
       class: Dist::Zilla::Plugin::MetaNoIndex
       name: '@Author::ETHER/MetaNoIndex'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::MetaProvides::Package
       config:
@@ -441,25 +477,52 @@ x_Dist_Zilla:
             -
               class: Dist::Zilla::Plugin::FinderCode
               name: ':InstallModules'
-              version: '5.014'
+              version: '5.020'
         Dist::Zilla::Role::MetaProvider::Provider:
           inherit_missing: '1'
           inherit_version: '1'
           meta_noindex: '1'
       name: '@Author::ETHER/MetaProvides::Package'
-      version: '2.000001'
+      version: '2.000004'
     -
       class: Dist::Zilla::Plugin::MetaConfig
       name: '@Author::ETHER/MetaConfig'
-      version: '5.014'
+      version: '5.020'
+    -
+      class: Dist::Zilla::Plugin::Keywords
+      config:
+        Dist::Zilla::Plugin::Keywords:
+          keywords:
+            - moose
+            - extension
+            - serial
+            - serialization
+            - class
+            - object
+            - store
+            - storage
+            - types
+            - strings
+      name: '@Author::ETHER/Keywords'
+      version: '0.006'
+    -
+      class: Dist::Zilla::Plugin::Git::Contributors
+      config:
+        Dist::Zilla::Plugin::Git::Contributors:
+          include_authors: '0'
+          include_releaser: '1'
+          order_by: commits
+          paths: []
+      name: '@Author::ETHER/Git::Contributors'
+      version: '0.007'
     -
       class: Dist::Zilla::Plugin::AutoPrereqs
       name: '@Author::ETHER/AutoPrereqs'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Prereqs::AuthorDeps
       name: '@Author::ETHER/Prereqs::AuthorDeps'
-      version: '0.002'
+      version: '0.003'
     -
       class: Dist::Zilla::Plugin::MinimumPerl
       name: '@Author::ETHER/MinimumPerl'
@@ -469,42 +532,34 @@ x_Dist_Zilla:
       config:
         Dist::Zilla::Plugin::Prereqs:
           phase: develop
-          type: requires
-      name: '@Author::ETHER/installer_requirements'
-      version: '5.014'
-    -
-      class: Dist::Zilla::Plugin::Prereqs
-      config:
-        Dist::Zilla::Plugin::Prereqs:
-          phase: develop
           type: recommends
       name: '@Author::ETHER/pluginbundle_version'
-      version: '5.014'
-    -
-      class: Dist::Zilla::Plugin::RunExtraTests
-      config:
-        Dist::Zilla::Role::TestRunner:
-          default_jobs: 9
-      name: '@Author::ETHER/RunExtraTests'
-      version: '0.020'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::MakeMaker::Fallback
       config:
         Dist::Zilla::Role::TestRunner:
           default_jobs: 9
       name: '@Author::ETHER/MakeMaker::Fallback'
-      version: '0.008'
+      version: '0.013'
     -
-      class: Dist::Zilla::Plugin::ModuleBuildTiny
+      class: Dist::Zilla::Plugin::ModuleBuildTiny::Fallback
       config:
         Dist::Zilla::Role::TestRunner:
           default_jobs: 9
-      name: '@Author::ETHER/ModuleBuildTiny'
-      version: '0.006'
+      name: '@Author::ETHER/ModuleBuildTiny::Fallback'
+      version: '0.005'
     -
       class: Dist::Zilla::Plugin::InstallGuide
       name: '@Author::ETHER/InstallGuide'
-      version: '1.200002'
+      version: '1.200003'
+    -
+      class: Dist::Zilla::Plugin::RunExtraTests
+      config:
+        Dist::Zilla::Role::TestRunner:
+          default_jobs: 9
+      name: '@Author::ETHER/RunExtraTests'
+      version: '0.022'
     -
       class: Dist::Zilla::Plugin::CheckSelfDependency
       config:
@@ -515,20 +570,43 @@ x_Dist_Zilla:
       version: '0.007'
     -
       class: Dist::Zilla::Plugin::Run::AfterBuild
+      config:
+        Dist::Zilla::Plugin::Run::Role::Runner:
+          run:
+            - "bash -c \"if [[ `dirname %d` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi; if [[ %d =~ ^%n-[.[:xdigit:]]+$ ]]; then rm -f .latest; ln -s %d .latest; fi\""
       name: '@Author::ETHER/Run::AfterBuild'
-      version: '0.021'
+      version: '0.023'
+    -
+      class: Dist::Zilla::Plugin::CheckStrictVersion
+      name: '@Author::ETHER/CheckStrictVersion'
+      version: '0.001'
     -
       class: Dist::Zilla::Plugin::Git::Check
+      config:
+        Dist::Zilla::Plugin::Git::Check:
+          untracked_files: die
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty: []
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/initial check'
-      version: '2.020'
+      version: '2.023'
     -
       class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts
+      config:
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::CheckFor::MergeConflicts'
-      version: '0.009'
+      version: '0.011'
     -
       class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch
+      config:
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::CheckFor::CorrectBranch'
-      version: '0.009'
+      version: '0.011'
     -
       class: Dist::Zilla::Plugin::Git::Remote::Check
       name: '@Author::ETHER/Git::Remote::Check'
@@ -536,67 +614,117 @@ x_Dist_Zilla:
     -
       class: Dist::Zilla::Plugin::CheckPrereqsIndexed
       name: '@Author::ETHER/CheckPrereqsIndexed'
-      version: '0.010'
+      version: '0.012'
     -
       class: Dist::Zilla::Plugin::TestRelease
       name: '@Author::ETHER/TestRelease'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Git::Check
+      config:
+        Dist::Zilla::Plugin::Git::Check:
+          untracked_files: die
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty: []
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/after tests'
-      version: '2.020'
+      version: '2.023'
+    -
+      class: Dist::Zilla::Plugin::CheckIssues
+      name: '@Author::ETHER/CheckIssues'
+      version: '0.002'
     -
       class: Dist::Zilla::Plugin::UploadToCPAN
       name: '@Author::ETHER/UploadToCPAN'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::CopyFilesFromRelease
       name: '@Author::ETHER/CopyFilesFromRelease'
-      version: '0.001'
+      version: '0.002'
+    -
+      class: Dist::Zilla::Plugin::Run::AfterRelease
+      config:
+        Dist::Zilla::Plugin::Run::Role::Runner:
+          run:
+            - 'rm -f README.md'
+      name: '@Author::ETHER/remove old READMEs'
+      version: '0.023'
     -
       class: Dist::Zilla::Plugin::Git::Commit
+      config:
+        Dist::Zilla::Plugin::Git::Commit:
+          add_files_in:
+            - .
+          commit_msg: '%N-%v%t%n%n%c'
+          time_zone: local
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty:
+            - Changes
+            - README.md
+            - README.pod
+            - LICENSE
+            - CONTRIBUTING
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::Commit'
-      version: '2.020'
+      version: '2.023'
     -
       class: Dist::Zilla::Plugin::Git::Tag
+      config:
+        Dist::Zilla::Plugin::Git::Tag:
+          branch: ~
+          signed: 0
+          tag: v0.47
+          tag_format: v%v%t
+          tag_message: v%v%t
+          time_zone: local
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::Tag'
-      version: '2.020'
+      version: '2.023'
     -
       class: Dist::Zilla::Plugin::GitHub::Update
       name: '@Author::ETHER/GitHub::Update'
-      version: '0.36'
+      version: '0.38'
     -
       class: Dist::Zilla::Plugin::Git::Push
+      config:
+        Dist::Zilla::Plugin::Git::Push:
+          push_to:
+            - origin
+          remotes_must_exist: 1
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@Author::ETHER/Git::Push'
-      version: '2.020'
+      version: '2.023'
     -
-      class: Dist::Zilla::Plugin::InstallRelease
-      name: '@Author::ETHER/InstallRelease'
-      version: '0.008'
-    -
-      class: Dist::Zilla::Plugin::Prereqs
+      class: Dist::Zilla::Plugin::Run::AfterRelease
       config:
-        Dist::Zilla::Plugin::Prereqs:
-          phase: develop
-          type: requires
-      name: '@Author::ETHER/via_options'
-      version: '5.014'
+        Dist::Zilla::Plugin::Run::Role::Runner:
+          run: REDACTED
+      name: '@Author::ETHER/install release'
+      version: '0.023'
     -
       class: Dist::Zilla::Plugin::ConfirmRelease
       name: '@Author::ETHER/ConfirmRelease'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::MetaResources
       name: MetaResources
-      version: '5.014'
-    -
-      class: Dist::Zilla::Plugin::ContributorsFromGit
-      name: ContributorsFromGit
-      version: '0.006'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::Test::CleanNamespaces
+      config:
+        Dist::Zilla::Plugin::Test::CleanNamespaces:
+          filename: xt/release/clean-namespaces.t
+          skips: []
       name: Test::CleanNamespaces
-      version: '0.003'
+      version: '0.005'
     -
       class: Dist::Zilla::Plugin::Prereqs::Soften
       config:
@@ -608,7 +736,7 @@ x_Dist_Zilla:
           modules_from_features: '1'
           to_relationship: recommends
       name: Prereqs::Soften
-      version: '0.004000'
+      version: '0.004002'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -623,7 +751,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: requires
       name: JSON-Runtime
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -638,7 +766,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: recommends
       name: JSON-RuntimeRecommends
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -653,7 +781,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: requires
       name: JSON-Test
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -668,7 +796,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: requires
       name: YAML-Runtime
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -685,7 +813,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: recommends
       name: YAML-RuntimeRecommends
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -700,7 +828,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: requires
       name: YAML-Test
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -715,7 +843,7 @@ x_Dist_Zilla:
           require_develop: '1'
           type: requires
       name: Storable
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::OptionalFeature
       config:
@@ -731,68 +859,69 @@ x_Dist_Zilla:
           require_develop: '1'
           type: requires
       name: File
-      version: '0.013'
+      version: '0.014'
     -
       class: Dist::Zilla::Plugin::Test::CheckBreaks
       name: Test::CheckBreaks
-      version: '0.007'
+      version: '0.009'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':InstallModules'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':IncModules'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':TestFiles'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ExecFiles'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ShareFiles'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':MainModule'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':AllFiles'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':NoFiles'
-      version: '5.014'
+      version: '5.020'
     -
       class: Dist::Zilla::Plugin::VerifyPhases
       name: '@Author::ETHER/PHASE VERIFICATION'
-      version: '0.002'
+      version: '0.003'
   zilla:
     class: Dist::Zilla::Dist::Builder
     config:
       is_trial: '0'
-    version: '5.014'
+    version: '5.020'
 x_authority: cpan:STEVAN
 x_contributors:
+  - 'Karen Etheridge <ether@cpan.org>'
+  - 'Tomas Doran <bobtfish@bobtfish.net>'
+  - 'Ricardo Signes <rjbs@cpan.org>'
   - 'Chris Prather <chris@prather.org>'
-  - 'Cory Watson <gphat@Crankwizzah.local>'
+  - 'Yuval Kogman <nothingmuch@woobling.org>'
+  - 'Jos Boumans <jos@dwim.org>'
+  - 'Shawn M Moore <sartak@gmail.com>'
+  - 'Jonathan Yu <frequency@cpan.org>'
+  - 'Robert Boone <robo4288@gmail.com>'
   - 'Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>'
+  - 'Cory Watson <gphat@Crankwizzah.local>'
   - 'Dan Brook <dan@broquaint.com>'
-  - 'David Golden <dagolden@cpan.org>'
   - 'David Steinbrunner <dsteinbrunner@pobox.com>'
-  - 'Florian Ragwitz <rafl@debian.org>'
+  - 'Jason Pope <cowholio4@gmail.com>'
   - 'Johannes Plunien <plu@pqpq.de>'
   - 'Jonathan Rockway <jon@jrock.us>'
-  - 'Jonathan Yu <frequency@cpan.org>'
-  - 'Jos Boumans <jos@dwim.org>'
-  - 'Karen Etheridge <ether@cpan.org>'
-  - 'Ricardo Signes <rjbs@cpan.org>'
-  - 'Robert Boone <robo4288@gmail.com>'
-  - 'Shawn M Moore <sartak@gmail.com>'
-  - 'Tomas Doran <bobtfish@bobtfish.net>'
-  - 'Yuval Kogman <nothingmuch@woobling.org>'
+  - 'Florian Ragwitz <rafl@debian.org>'
+  - 'David Golden <dagolden@cpan.org>'
@@ -1,6 +1,6 @@
 # This Makefile.PL for MooseX-Storage was generated by
-# Dist::Zilla::Plugin::MakeMaker::Fallback 0.008
-# and Dist::Zilla::Plugin::MakeMaker::Awesome 0.20.
+# Dist::Zilla::Plugin::MakeMaker::Fallback 0.013
+# and Dist::Zilla::Plugin::MakeMaker::Awesome 0.24.
 # Don't edit it but the dist.ini and plugins used to construct it.
 
 use strict;
@@ -8,8 +8,8 @@ use warnings;
 
 BEGIN {
 my %configure_requires = (
-    'ExtUtils::MakeMaker' => '6.30',
-    'Module::Build::Tiny' => '0.035',
+    'ExtUtils::MakeMaker' => '0',
+    'Module::Build::Tiny' => '0.037',
 );
 
 my @missing = grep {
@@ -63,17 +63,16 @@ EOW
 
 use 5.008;
 
-use ExtUtils::MakeMaker 6.30;
+use ExtUtils::MakeMaker;
 
 
 
 my %WriteMakefileArgs = (
   "ABSTRACT" => "A serialization framework for Moose classes",
   "AUTHOR" => "Chris Prather <chris.prather\@iinteractive.com>, Stevan Little <stevan.little\@iinteractive.com>, \x{5d9}\x{5d5}\x{5d1}\x{5dc} \x{5e7}\x{5d5}\x{5d2}'\x{5de}\x{5df} (Yuval Kogman) <nothingmuch\@woobling.org>",
-  "BUILD_REQUIRES" => {},
   "CONFIGURE_REQUIRES" => {
-    "ExtUtils::MakeMaker" => "6.30",
-    "Module::Build::Tiny" => "0.035"
+    "ExtUtils::MakeMaker" => 0,
+    "Module::Build::Tiny" => "0.037"
   },
   "DISTNAME" => "MooseX-Storage",
   "EXE_FILES" => [],
@@ -93,9 +92,9 @@ my %WriteMakefileArgs = (
   },
   "TEST_REQUIRES" => {
     "ExtUtils::MakeMaker" => 0,
+    "File::Spec" => 0,
     "File::Spec::Functions" => 0,
     "File::Temp" => 0,
-    "List::Util" => 0,
     "Moose::Util::TypeConstraints" => 0,
     "Test::Deep" => 0,
     "Test::Fatal" => 0,
@@ -104,10 +103,9 @@ my %WriteMakefileArgs = (
     "overload" => 0,
     "strict" => 0,
     "utf8" => 0,
-    "version" => 0,
     "warnings" => 0
   },
-  "VERSION" => "0.46",
+  "VERSION" => "0.47",
   "test" => {
     "TESTS" => "t/*.t"
   }
@@ -119,9 +117,9 @@ my %FallbackPrereqs = (
   "Data::Dumper" => 0,
   "Digest" => 0,
   "ExtUtils::MakeMaker" => 0,
+  "File::Spec" => 0,
   "File::Spec::Functions" => 0,
   "File::Temp" => 0,
-  "List::Util" => 0,
   "Module::Runtime" => 0,
   "Moose" => "0.99",
   "Moose::Meta::Attribute" => 0,
@@ -137,7 +135,6 @@ my %FallbackPrereqs = (
   "overload" => 0,
   "strict" => 0,
   "utf8" => 0,
-  "version" => 0,
   "warnings" => 0
 );
 
@@ -1,7 +1,7 @@
 
 
 This archive contains the distribution MooseX-Storage,
-version 0.46:
+version 0.47:
 
   A serialization framework for Moose classes
 
@@ -11,5 +11,5 @@ 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.014.
+This README file was generated by Dist::Zilla::Plugin::Readme v5.020.
 
@@ -1,257 +0,0 @@
-# NAME
-
-MooseX::Storage - A serialization framework for Moose classes
-
-# VERSION
-
-version 0.46
-
-# SYNOPSIS
-
-    package Point;
-    use Moose;
-    use MooseX::Storage;
-
-    with Storage('format' => 'JSON', 'io' => 'File');
-
-    has 'x' => (is => 'rw', isa => 'Int');
-    has 'y' => (is => 'rw', isa => 'Int');
-
-    1;
-
-    my $p = Point->new(x => 10, y => 10);
-
-    ## methods to pack/unpack an
-    ## object in perl data structures
-
-    # pack the class into a hash
-    $p->pack(); # { __CLASS__ => 'Point-0.01', x => 10, y => 10 }
-
-    # unpack the hash into a class
-    my $p2 = Point->unpack({ __CLASS__ => 'Point-0.01', x => 10, y => 10 });
-
-    ## methods to freeze/thaw into
-    ## a specified serialization format
-    ## (in this case JSON)
-
-    # pack the class into a JSON string
-    $p->freeze(); # { "__CLASS__" : "Point-0.01", "x" : 10, "y" : 10 }
-
-    # unpack the JSON string into a class
-    my $p2 = Point->thaw('{ "__CLASS__" : "Point-0.01", "x" : 10, "y" : 10 }');
-
-    ## methods to load/store a class
-    ## on the file system
-
-    $p->store('my_point.json');
-
-    my $p2 = Point->load('my_point.json');
-
-# DESCRIPTION
-
-MooseX::Storage is a serialization framework for Moose, it provides
-a very flexible and highly pluggable way to serialize Moose classes
-to a number of different formats and styles.
-
-## Levels of Serialization
-
-There are 3 levels to the serialization, each of which builds upon
-the other and each of which can be customized to the specific needs
-of your class.
-
-- __base__
-
-    The first (base) level is `pack` and `unpack`. In this level the
-    class is serialized into a Perl HASH reference, it is tagged with the
-    class name and each instance attribute is stored. Very simple.
-
-    This level is not optional, it is the bare minimum that
-    MooseX::Storage provides and all other levels build on top of this.
-
-    See [MooseX::Storage::Basic](https://metacpan.org/pod/MooseX::Storage::Basic) for the fundamental implementation and
-    options to `pack` and `unpack`
-
-- __format__
-
-    The second (format) level is `freeze` and `thaw`. In this level the
-    output of `pack` is sent to `freeze` or the output of `thaw` is sent
-    to `unpack`. This levels primary role is to convert to and from the
-    specific serialization format and Perl land.
-
-    This level is optional, if you don't want/need it, you don't have to
-    have it. You can just use `pack`/`unpack` instead.
-
-- __io__
-
-    The third (io) level is `load` and `store`. In this level we are reading
-    and writing data to file/network/database/etc.
-
-    This level is also optional, in most cases it does require a `format` role
-    to also be used, the exception being the `StorableFile` role.
-
-## Behaviour modifiers
-
-The serialization behaviour can be changed by supplying `traits` to either
-the class or an individual attribute.
-
-This can be done as follows:
-
-    use MooseX::Storage;
-
-    # adjust behaviour for the entire class
-    with Storage( traits => [Trait1, Trait2,...] );
-
-    # adjust behaviour for an attribute
-    has my_attr => (
-      traits => [Trait1, Trait2, ...],
-      ...
-    );
-
-The following __class traits__ are currently bundled with [MooseX::Storage](https://metacpan.org/pod/MooseX::Storage):
-
-- OnlyWhenBuilt
-
-    Only attributes that have been built (i.e., where the predicate returns
-    'true') will be serialized. This avoids any potentially expensive computations.
-
-    See [MooseX::Storage::Traits::OnlyWhenBuilt](https://metacpan.org/pod/MooseX::Storage::Traits::OnlyWhenBuilt) for details.
-
-- DisableCycleDetection
-
-    Disables the default checks for circular references, which is necessary if you
-    use such references in your serialisable objects.
-
-    See [MooseX::Storage::Traits::DisableCycleDetection](https://metacpan.org/pod/MooseX::Storage::Traits::DisableCycleDetection) for details.
-
-The following __attribute traits__ are currently bundled with [MooseX::Storage](https://metacpan.org/pod/MooseX::Storage):
-
-- DoNotSerialize
-
-    Skip serialization entirely for this attribute.
-
-    See [MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize](https://metacpan.org/pod/MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize) for details.
-
-## How we serialize
-
-There are always limits to any serialization framework, there are just
-some things which are really difficult to serialize properly and some
-things which cannot be serialized at all.
-
-## What can be serialized?
-
-Currently only numbers, string, ARRAY refs, HASH refs and other
-MooseX::Storage enabled objects are supported.
-
-With Array and Hash references the first level down is inspected and
-any objects found are serialized/deserialized for you. We do not do
-this recursively by default, however this feature may become an
-option eventually.
-
-The specific serialize/deserialize routine is determined by the
-Moose type constraint a specific attribute has. In most cases subtypes
-of the supported types are handled correctly, and there is a facility
-for adding handlers for custom types as well. This will get documented
-eventually, but it is currently still in development.
-
-## What can not be serialized?
-
-We do not support CODE references yet, but this support might be added
-in using B::Deparse or some other deep magic.
-
-Scalar refs are not supported, mostly because there is no way to know
-if the value being referenced will be there when the object is inflated.
-I highly doubt will be ever support this in a general sense, but it
-would be possible to add this yourself for a small specific case.
-
-Circular references are specifically disallowed, however if you break
-the cycles yourself then re-assemble them later you can get around this.
-The reason we disallow circular refs is because they are not always supported
-in all formats we use, and they tend to be very tricky to do for all
-possible cases. It is almost always something you want to have tight control
-over anyway.
-
-# CAVEAT
-
-This is __not__ a persistence framework; changes to your object after
-you load or store it will not be reflected in the stored class.
-
-# EXPORTS
-
-- __Storage (%options)__
-
-    This module will export the `Storage` method and can be used to
-    load a specific set of MooseX::Storage roles to implement a specific
-    combination of features. It is meant to make things easier, but it
-    is by no means the only way. You can still compose your roles by
-    hand if you like.
-
-    By default, options are assumed to be short forms.  For example, this:
-
-        Storage(format => 'JSON');
-
-    ...will result in looking for MooseX::Storage::Format::JSON.  To use a role
-    that is not under the default namespace prefix, start with an equal sign:
-
-        Storage(format => '=My::Private::JSONFormat');
-
-    To use a parameterized role (for which, see [MooseX::Role::Parameterized](https://metacpan.org/pod/MooseX::Role::Parameterized)) you
-    can pass an arrayref of the role name (in short or long form, as above) and its
-    parameters:
-
-        Storage(format => [ JSONpm => { json_opts => { pretty => 1 } } ]);
-
-# METHODS
-
-- __import__
-
-## Introspection
-
-- __meta__
-
-# TODO
-
-This module needs docs and probably a Cookbook of some kind as well.
-This is an early release, so that is my excuse for now :)
-
-For the time being, please read the tests and feel free to email me
-if you have any questions. This module can also be discussed on IRC
-in the #moose channel on irc.perl.org.
-
-# BUGS
-
-All complex software has bugs lurking in it, and this module is no
-exception. If you find a bug please either email me, or add the bug
-to cpan-RT.
-
-# AUTHORS
-
-- Chris Prather <chris.prather@iinteractive.com>
-- Stevan Little <stevan.little@iinteractive.com>
-- יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
-
-# COPYRIGHT AND LICENSE
-
-This software is copyright (c) 2007 by Infinity Interactive, Inc..
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-# CONTRIBUTORS
-
-- Chris Prather <chris@prather.org>
-- Cory Watson <gphat@Crankwizzah.local>
-- Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
-- Dan Brook <dan@broquaint.com>
-- David Golden <dagolden@cpan.org>
-- David Steinbrunner <dsteinbrunner@pobox.com>
-- Florian Ragwitz <rafl@debian.org>
-- Johannes Plunien <plu@pqpq.de>
-- Jonathan Rockway <jon@jrock.us>
-- Jonathan Yu <frequency@cpan.org>
-- Jos Boumans <jos@dwim.org>
-- Karen Etheridge <ether@cpan.org>
-- Ricardo Signes <rjbs@cpan.org>
-- Robert Boone <robo4288@gmail.com>
-- Shawn M Moore <sartak@gmail.com>
-- Tomas Doran <bobtfish@bobtfish.net>
-- Yuval Kogman <nothingmuch@woobling.org>
@@ -1,9 +0,0 @@
----------------------------------------------------------------------
-:NOTES:
----------------------------------------------------------------------
- 
-
-
-
-
-
@@ -9,7 +9,7 @@ license             = Perl_5
 :version = 5
 
 [@Author::ETHER]
-:version = 0.019
+:version = 0.068
 server = github
 Authority.authority = cpan:STEVAN
 Test::MinimumVersion.max_target_perl = 5.008003
@@ -19,6 +19,20 @@ Test::PodSpelling.stopwords = cpan
 ; cpantesters to barf in the compile tests
 Test::Compile.skip[] = ^MooseX::Storage::((Engine::)?IO::|Format::)
 AutoPrereqs.skip[0] = ^Class(One|Two)$
+Test::ReportPrereqs.include[0] = Dist::CheckConflicts
+Test::ReportPrereqs.include[1] = JSON
+Test::ReportPrereqs.include[2] = JSON::PP
+Test::ReportPrereqs.include[3] = JSON::DWIW
+Test::ReportPrereqs.include[4] = JSON::Syck
+Test::ReportPrereqs.include[5] = JSON::XS
+Test::ReportPrereqs.include[6] = Cpanel::JSON::XS
+Test::ReportPrereqs.include[7] = JSON::MaybeXS
+Test::ReportPrereqs.include[8] = YAML::XS
+Test::ReportPrereqs.include[9] = YAML::Syck
+Test::ReportPrereqs.include[10] = YAML::Old
+Test::ReportPrereqs.include[11] = YAML
+Test::ReportPrereqs.include[12] = YAML::Tiny
+Test::ReportPrereqs.include[13] = MooseX::Role::Parameterized
 
 [MetaResources]
 x_IRC = irc://irc.perl.org/#moose
@@ -27,8 +41,6 @@ x_MailingList = http://lists.perl.org/list/moose.html
 ; authordep Pod::Weaver = 4
 ; authordep Pod::Weaver::Section::Contributors
 
-[ContributorsFromGit]
-
 [Test::CleanNamespaces]
 
 [Prereqs::Soften]
@@ -1,9 +1,6 @@
 package MooseX::Storage::Base::WithChecksum;
-BEGIN {
-  $MooseX::Storage::Base::WithChecksum::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A more secure serialization role
-$MooseX::Storage::Base::WithChecksum::VERSION = '0.46';
+$MooseX::Storage::Base::WithChecksum::VERSION = '0.47';
 use Moose::Role;
 with 'MooseX::Storage::Basic';
 
@@ -102,19 +99,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Base::WithChecksum - A more secure serialization role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 DESCRIPTION
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Basic;
-BEGIN {
-  $MooseX::Storage::Basic::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: The simplest level of serialization
-$MooseX::Storage::Basic::VERSION = '0.46';
+$MooseX::Storage::Basic::VERSION = '0.47';
 use Moose::Role;
 use MooseX::Storage::Engine;
 use String::RewritePrefix;
@@ -67,19 +64,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Basic - The simplest level of serialization
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Deferred;
-BEGIN {
-  $MooseX::Storage::Deferred::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A role for indecisive programmers
-$MooseX::Storage::Deferred::VERSION = '0.46';
+$MooseX::Storage::Deferred::VERSION = '0.47';
 use Moose::Role;
 with 'MooseX::Storage::Basic';
 use Carp 'confess';
@@ -70,19 +67,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David JSONpm
-
 =head1 NAME
 
 MooseX::Storage::Deferred - A role for indecisive programmers
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -130,6 +121,8 @@ SYNOPSIS for more info)
 
 =item I<JSON>
 
+=for stopwords JSONpm
+
 =item I<JSONpm>
 
 =item I<YAML>
@@ -1,9 +1,6 @@
 package MooseX::Storage::Engine::IO::AtomicFile;
-BEGIN {
-  $MooseX::Storage::Engine::IO::AtomicFile::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: The actual atomic file storage mechanism.
-$MooseX::Storage::Engine::IO::AtomicFile::VERSION = '0.46';
+$MooseX::Storage::Engine::IO::AtomicFile::VERSION = '0.47';
 use Moose;
 use IO::AtomicFile;
 use Carp 'confess';
@@ -29,19 +26,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Engine::IO::AtomicFile - The actual atomic file storage mechanism.
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 DESCRIPTION
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Engine::IO::File;
-BEGIN {
-  $MooseX::Storage::Engine::IO::File::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: The actual file storage mechanism.
-$MooseX::Storage::Engine::IO::File::VERSION = '0.46';
+$MooseX::Storage::Engine::IO::File::VERSION = '0.47';
 use Moose;
 use IO::File;
 use Carp 'confess';
@@ -38,16 +35,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc.
-
 =head1 NAME
 
 MooseX::Storage::Engine::IO::File - The actual file storage mechanism.
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 DESCRIPTION
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Engine::Trait::DisableCycleDetection;
-BEGIN {
-  $MooseX::Storage::Engine::Trait::DisableCycleDetection::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A custom trait to bypass cycle detection
-$MooseX::Storage::Engine::Trait::DisableCycleDetection::VERSION = '0.46';
+$MooseX::Storage::Engine::Trait::DisableCycleDetection::VERSION = '0.47';
 use Moose::Role;
 use namespace::autoclean;
 
@@ -21,19 +18,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Engine::Trait::DisableCycleDetection - A custom trait to bypass cycle detection
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Engine::Trait::OnlyWhenBuilt;
-BEGIN {
-  $MooseX::Storage::Engine::Trait::OnlyWhenBuilt::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: An engine trait to bypass serialization
-$MooseX::Storage::Engine::Trait::OnlyWhenBuilt::VERSION = '0.46';
+$MooseX::Storage::Engine::Trait::OnlyWhenBuilt::VERSION = '0.47';
 use Moose::Role;
 use namespace::autoclean;
 
@@ -30,19 +27,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Engine::Trait::OnlyWhenBuilt - An engine trait to bypass serialization
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Engine;
-BEGIN {
-  $MooseX::Storage::Engine::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: The meta-engine to handle collapsing and expanding objects
-$MooseX::Storage::Engine::VERSION = '0.46';
+$MooseX::Storage::Engine::VERSION = '0.47';
 use Moose;
 use Scalar::Util qw(refaddr blessed);
 use Carp 'confess';
@@ -61,14 +58,16 @@ sub expand_object {
 sub collapse_attribute {
     my ($self, $attr, $options)  = @_;
     my $value = $self->collapse_attribute_value($attr, $options);
-    return if !defined($value);
+
+    return unless $attr->has_value($self->object);
     $self->storage->{$attr->name} = $value;
 }
 
 sub expand_attribute {
     my ($self, $attr, $data, $options)  = @_;
+    return unless exists $data->{$attr->name};
     my $value = $self->expand_attribute_value($attr, $data->{$attr->name}, $options);
-    $self->storage->{$attr->name} = defined $value ? $value : return;
+    $self->storage->{$attr->name} = $value;
 }
 
 sub collapse_attribute_value {
@@ -377,19 +376,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Engine - The meta-engine to handle collapsing and expanding objects
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 DESCRIPTION
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Format::JSON;
-BEGIN {
-  $MooseX::Storage::Format::JSON::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A JSON serialization role
-$MooseX::Storage::Format::JSON::VERSION = '0.46';
+$MooseX::Storage::Format::JSON::VERSION = '0.47';
 use Moose::Role;
 use JSON::Any;
 use namespace::autoclean;
@@ -34,19 +31,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::Format::JSON - A JSON serialization role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Format::Storable;
-BEGIN {
-  $MooseX::Storage::Format::Storable::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A Storable serialization role
-$MooseX::Storage::Format::Storable::VERSION = '0.46';
+$MooseX::Storage::Format::Storable::VERSION = '0.47';
 use Moose::Role;
 use Storable ();
 use namespace::autoclean;
@@ -31,16 +28,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. IPC Storable's
-
 =head1 NAME
 
 MooseX::Storage::Format::Storable - A Storable serialization role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -68,10 +62,14 @@ version 0.46
 
 =head1 DESCRIPTION
 
+=for stopwords IPC
+
 This module will C<thaw> and C<freeze> Moose classes using Storable. It
 uses C<Storable::nfreeze> by default so that it can be easily used
 in IPC scenarios across machines or just locally.
 
+=for stopwords Storable's
+
 One important thing to note is that this module does not mix well
 with the IO modules. The structures that C<freeze> and C<thaw> deal with
 are Storable's memory representation, and (as far as I know) that
@@ -1,9 +1,6 @@
 package MooseX::Storage::Format::YAML;
-BEGIN {
-  $MooseX::Storage::Format::YAML::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A YAML serialization role
-$MooseX::Storage::Format::YAML::VERSION = '0.46';
+$MooseX::Storage::Format::YAML::VERSION = '0.47';
 use Moose::Role;
 
 # When I add YAML::LibYAML
@@ -36,16 +33,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc.
-
 =head1 NAME
 
 MooseX::Storage::Format::YAML - A YAML serialization role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::IO::AtomicFile;
-BEGIN {
-  $MooseX::Storage::IO::AtomicFile::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: An Atomic File I/O role
-$MooseX::Storage::IO::AtomicFile::VERSION = '0.46';
+$MooseX::Storage::IO::AtomicFile::VERSION = '0.47';
 use Moose::Role;
 use MooseX::Storage::Engine::IO::AtomicFile;
 use namespace::autoclean;
@@ -25,19 +22,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::IO::AtomicFile - An Atomic File I/O role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::IO::File;
-BEGIN {
-  $MooseX::Storage::IO::File::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A basic File I/O role
-$MooseX::Storage::IO::File::VERSION = '0.46';
+$MooseX::Storage::IO::File::VERSION = '0.47';
 use Moose::Role;
 use MooseX::Storage::Engine::IO::File;
 use namespace::autoclean;
@@ -31,19 +28,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::IO::File - A basic File I/O role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::IO::StorableFile;
-BEGIN {
-  $MooseX::Storage::IO::StorableFile::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: An Storable File I/O role
-$MooseX::Storage::IO::StorableFile::VERSION = '0.46';
+$MooseX::Storage::IO::StorableFile::VERSION = '0.47';
 use Moose::Role;
 use Storable ();
 use namespace::autoclean;
@@ -39,19 +36,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David
-
 =head1 NAME
 
 MooseX::Storage::IO::StorableFile - An Storable File I/O role
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -1,9 +1,6 @@
 package MooseX::Storage::Meta::Attribute::DoNotSerialize;
-BEGIN {
-  $MooseX::Storage::Meta::Attribute::DoNotSerialize::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A custom meta-attribute to bypass serialization
-$MooseX::Storage::Meta::Attribute::DoNotSerialize::VERSION = '0.46';
+$MooseX::Storage::Meta::Attribute::DoNotSerialize::VERSION = '0.47';
 use Moose;
 use namespace::autoclean;
 extends 'Moose::Meta::Attribute';
@@ -11,10 +8,7 @@ extends 'Moose::Meta::Attribute';
 
 # register this alias ...
 package Moose::Meta::Attribute::Custom::DoNotSerialize;
-BEGIN {
-  $Moose::Meta::Attribute::Custom::DoNotSerialize::AUTHORITY = 'cpan:STEVAN';
-}
-$Moose::Meta::Attribute::Custom::DoNotSerialize::VERSION = '0.46';
+$Moose::Meta::Attribute::Custom::DoNotSerialize::VERSION = '0.47';
 sub register_implementation { 'MooseX::Storage::Meta::Attribute::DoNotSerialize' }
 
 1;
@@ -25,19 +19,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David culted
-
 =head1 NAME
 
 MooseX::Storage::Meta::Attribute::DoNotSerialize - A custom meta-attribute to bypass serialization
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -60,6 +48,8 @@ version 0.46
 
 =head1 DESCRIPTION
 
+=for stopwords culted
+
 Sometimes you don't want a particular attribute to be part of the
 serialization, in this case, you want to make sure that attribute
 uses this custom meta-attribute. See the SYNOPSIS for a nice example
@@ -1,18 +1,12 @@
 package MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize;
-BEGIN {
-  $MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A custom meta-attribute-trait to bypass serialization
-$MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize::VERSION = '0.46';
+$MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize::VERSION = '0.47';
 use Moose::Role;
 use namespace::autoclean;
 
 # register this alias ...
 package Moose::Meta::Attribute::Custom::Trait::DoNotSerialize;
-BEGIN {
-  $Moose::Meta::Attribute::Custom::Trait::DoNotSerialize::AUTHORITY = 'cpan:STEVAN';
-}
-$Moose::Meta::Attribute::Custom::Trait::DoNotSerialize::VERSION = '0.46';
+$Moose::Meta::Attribute::Custom::Trait::DoNotSerialize::VERSION = '0.47';
 sub register_implementation { 'MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize' }
 
 1;
@@ -23,19 +17,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David culted
-
 =head1 NAME
 
 MooseX::Storage::Meta::Attribute::Trait::DoNotSerialize - A custom meta-attribute-trait to bypass serialization
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -58,6 +46,8 @@ version 0.46
 
 =head1 DESCRIPTION
 
+=for stopwords culted
+
 Sometimes you don't want a particular attribute to be part of the
 serialization, in this case, you want to make sure that attribute
 uses this custom meta-attribute-trait. See the SYNOPSIS for a nice
@@ -1,9 +1,6 @@
 package MooseX::Storage::Traits::DisableCycleDetection;
-BEGIN {
-  $MooseX::Storage::Traits::DisableCycleDetection::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A custom trait to bypass cycle detection
-$MooseX::Storage::Traits::DisableCycleDetection::VERSION = '0.46';
+$MooseX::Storage::Traits::DisableCycleDetection::VERSION = '0.47';
 use Moose::Role;
 use namespace::autoclean;
 
@@ -34,19 +31,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David culted
-
 =head1 NAME
 
 MooseX::Storage::Traits::DisableCycleDetection - A custom trait to bypass cycle detection
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -74,6 +65,8 @@ references, so if you know what you are doing, you can bypass this check.
 This trait is applied to all objects that inherit from it. To use this
 on a per-case basis, see C<disable_cycle_check> in L<MooseX::Storage::Basic>.
 
+=for stopwords culted
+
 See the SYNOPSIS for a nice example that can be easily cargo-culted.
 
 =head1 METHODS
@@ -1,9 +1,6 @@
 package MooseX::Storage::Traits::OnlyWhenBuilt;
-BEGIN {
-  $MooseX::Storage::Traits::OnlyWhenBuilt::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A custom trait to bypass serialization
-$MooseX::Storage::Traits::OnlyWhenBuilt::VERSION = '0.46';
+$MooseX::Storage::Traits::OnlyWhenBuilt::VERSION = '0.47';
 use Moose::Role;
 use namespace::autoclean;
 
@@ -34,19 +31,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David culted
-
 =head1 NAME
 
 MooseX::Storage::Traits::OnlyWhenBuilt - A custom trait to bypass serialization
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -80,6 +71,8 @@ as outlined in the C<Synopsis>, only attributes that have been built
 (i.e., where the predicate returns 'true') will be serialized.
 This avoids any potentially expensive computations.
 
+=for stopwords culted
+
 See the SYNOPSIS for a nice example that can be easily cargo-culted.
 
 =head1 METHODS
@@ -1,9 +1,6 @@
 package MooseX::Storage::Util;
-BEGIN {
-  $MooseX::Storage::Util::AUTHORITY = 'cpan:STEVAN';
-}
 # ABSTRACT: A MooseX::Storage Swiss Army chainsaw
-$MooseX::Storage::Util::VERSION = '0.46';
+$MooseX::Storage::Util::VERSION = '0.47';
 use Moose;
 use MooseX::Storage::Engine ();
 use Scalar::Util 'blessed';
@@ -71,19 +68,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David TODO
-
 =head1 NAME
 
 MooseX::Storage::Util - A MooseX::Storage Swiss Army chainsaw
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 DESCRIPTION
 
@@ -136,6 +127,8 @@ found in the key for you.
 
 =back
 
+=for stopwords TODO
+
 =head1 TODO
 
 Add more stuff to this module :)
@@ -1,10 +1,8 @@
 package MooseX::Storage;
-BEGIN {
-  $MooseX::Storage::AUTHORITY = 'cpan:STEVAN';
-}
-# git description: v0.45-17-g4a1dd0b
-$MooseX::Storage::VERSION = '0.46';
+# git description: v0.46-17-g342ddd4
+$MooseX::Storage::VERSION = '0.47';
 # ABSTRACT: A serialization framework for Moose classes
+# KEYWORDS: moose extension serial serialization class object store storage types strings
 
 use Moose 0.99;
 use MooseX::Storage::Meta::Attribute::DoNotSerialize;
@@ -58,12 +56,11 @@ sub _expand_role {
         my $class = $self->_rewrite_role_name($base, $value);
         use_module($class);
 
-        my $role = $class;
-
-        if ($class->meta->isa(
-            'MooseX::Role::Parameterized::Meta::Role::Parameterizable'
-        )) {
-            $role = $class->meta->generate_role(parameters => undef);
+        if ($class->meta->isa('MooseX::Role::Parameterized::Meta::Role::Parameterizable')
+            or ($class->meta->meta->can('does_role')
+                && $class->meta->meta->does_role('MooseX::Role::Parameterized::Meta::Trait::Parameterizable'))
+        ) {
+            my $role = $class->meta->generate_role(parameters => undef);
             $HORRIBLE_GC_AVOIDANCE_HACK{ $role->name } = $role;
             return $role->name;
         }
@@ -116,19 +113,13 @@ __END__
 
 =encoding UTF-8
 
-=for :stopwords Chris Prather Stevan Little יובל קוג'מן (Yuval Kogman) Infinity
-Interactive, Inc. Golden Steinbrunner Florian Ragwitz Johannes Plunien
-Jonathan Rockway Yu Jos Boumans Karen Etheridge Ricardo Signes Robert Boone
-Shawn M Moore Cory Tomas Doran Yuval Kogman Watson Dagfinn Ilmari Mannsåker
-Dan Brook David io serialisable subtypes parameterized TODO
-
 =head1 NAME
 
 MooseX::Storage - A serialization framework for Moose classes
 
 =head1 VERSION
 
-version 0.46
+version 0.47
 
 =head1 SYNOPSIS
 
@@ -207,6 +198,8 @@ specific serialization format and Perl land.
 This level is optional, if you don't want/need it, you don't have to
 have it. You can just use C<pack>/C<unpack> instead.
 
+=for stopwords io
+
 =item B<io>
 
 The third (io) level is C<load> and C<store>. In this level we are reading
@@ -248,6 +241,8 @@ See L<MooseX::Storage::Traits::OnlyWhenBuilt> for details.
 
 =item DisableCycleDetection
 
+=for stopwords serialisable
+
 Disables the default checks for circular references, which is necessary if you
 use such references in your serialisable objects.
 
@@ -283,6 +278,8 @@ any objects found are serialized/deserialized for you. We do not do
 this recursively by default, however this feature may become an
 option eventually.
 
+=for stopwords subtypes
+
 The specific serialize/deserialize routine is determined by the
 Moose type constraint a specific attribute has. In most cases subtypes
 of the supported types are handled correctly, and there is a facility
@@ -332,6 +329,8 @@ that is not under the default namespace prefix, start with an equal sign:
 
   Storage(format => '=My::Private::JSONFormat');
 
+=for stopwords parameterized
+
 To use a parameterized role (for which, see L<MooseX::Role::Parameterized>) you
 can pass an arrayref of the role name (in short or long form, as above) and its
 parameters:
@@ -356,6 +355,8 @@ parameters:
 
 =back
 
+=for stopwords TODO
+
 =head1 TODO
 
 This module needs docs and probably a Cookbook of some kind as well.
@@ -398,75 +399,81 @@ the same terms as the Perl 5 programming language system itself.
 
 =head1 CONTRIBUTORS
 
+=for stopwords Karen Etheridge Tomas Doran Ricardo Signes Chris Prather Yuval Kogman Jos Boumans Shawn M Moore Jonathan Yu Robert Boone Dagfinn Ilmari Mannsåker Cory Watson Dan Brook David Steinbrunner Jason Pope Johannes Plunien Rockway Florian Ragwitz Golden
+
 =over 4
 
 =item *
 
-Chris Prather <chris@prather.org>
+Karen Etheridge <ether@cpan.org>
 
 =item *
 
-Cory Watson <gphat@Crankwizzah.local>
+Tomas Doran <bobtfish@bobtfish.net>
 
 =item *
 
-Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
+Ricardo Signes <rjbs@cpan.org>
 
 =item *
 
-Dan Brook <dan@broquaint.com>
+Chris Prather <chris@prather.org>
 
 =item *
 
-David Golden <dagolden@cpan.org>
+Yuval Kogman <nothingmuch@woobling.org>
 
 =item *
 
-David Steinbrunner <dsteinbrunner@pobox.com>
+Jos Boumans <jos@dwim.org>
 
 =item *
 
-Florian Ragwitz <rafl@debian.org>
+Shawn M Moore <sartak@gmail.com>
 
 =item *
 
-Johannes Plunien <plu@pqpq.de>
+Jonathan Yu <frequency@cpan.org>
 
 =item *
 
-Jonathan Rockway <jon@jrock.us>
+Robert Boone <robo4288@gmail.com>
 
 =item *
 
-Jonathan Yu <frequency@cpan.org>
+Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
 
 =item *
 
-Jos Boumans <jos@dwim.org>
+Cory Watson <gphat@Crankwizzah.local>
 
 =item *
 
-Karen Etheridge <ether@cpan.org>
+Dan Brook <dan@broquaint.com>
 
 =item *
 
-Ricardo Signes <rjbs@cpan.org>
+David Steinbrunner <dsteinbrunner@pobox.com>
 
 =item *
 
-Robert Boone <robo4288@gmail.com>
+Jason Pope <cowholio4@gmail.com>
 
 =item *
 
-Shawn M Moore <sartak@gmail.com>
+Johannes Plunien <plu@pqpq.de>
 
 =item *
 
-Tomas Doran <bobtfish@bobtfish.net>
+Jonathan Rockway <jon@jrock.us>
 
 =item *
 
-Yuval Kogman <nothingmuch@woobling.org>
+Florian Ragwitz <rafl@debian.org>
+
+=item *
+
+David Golden <dagolden@cpan.org>
 
 =back
 
@@ -0,0 +1,166 @@
+do { my $x = {
+       'configure' => {
+                        'requires' => {
+                                        'ExtUtils::MakeMaker' => '0',
+                                        'Module::Build::Tiny' => '0.037'
+                                      }
+                      },
+       'develop' => {
+                      'recommends' => {
+                                        'Dist::Zilla::PluginBundle::Author::ETHER' => '0.072'
+                                      },
+                      'requires' => {
+                                      'Digest::HMAC_SHA1' => '0',
+                                      'Dist::Zilla' => '5',
+                                      'Dist::Zilla::Plugin::Authority' => '0',
+                                      'Dist::Zilla::Plugin::AutoMetaResources' => '0',
+                                      'Dist::Zilla::Plugin::AutoPrereqs' => '0',
+                                      'Dist::Zilla::Plugin::CheckIssues' => '0',
+                                      'Dist::Zilla::Plugin::CheckPrereqsIndexed' => '0',
+                                      'Dist::Zilla::Plugin::CheckSelfDependency' => '0',
+                                      'Dist::Zilla::Plugin::CheckStrictVersion' => '0',
+                                      'Dist::Zilla::Plugin::ConfirmRelease' => '0',
+                                      'Dist::Zilla::Plugin::CopyFilesFromRelease' => '0',
+                                      'Dist::Zilla::Plugin::EOLTests' => '0',
+                                      'Dist::Zilla::Plugin::ExecDir' => '0',
+                                      'Dist::Zilla::Plugin::FileFinder::ByName' => '0',
+                                      'Dist::Zilla::Plugin::GenerateFile::ShareDir' => '0',
+                                      'Dist::Zilla::Plugin::Git::Check' => '0',
+                                      'Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch' => '0.004',
+                                      'Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts' => '0',
+                                      'Dist::Zilla::Plugin::Git::Commit' => '2.020',
+                                      'Dist::Zilla::Plugin::Git::Contributors' => '0.004',
+                                      'Dist::Zilla::Plugin::Git::Describe' => '0',
+                                      'Dist::Zilla::Plugin::Git::GatherDir' => '2.016',
+                                      'Dist::Zilla::Plugin::Git::NextVersion' => '0',
+                                      'Dist::Zilla::Plugin::Git::Push' => '0',
+                                      'Dist::Zilla::Plugin::Git::Remote::Check' => '0',
+                                      'Dist::Zilla::Plugin::Git::Tag' => '0',
+                                      'Dist::Zilla::Plugin::GitHub::Update' => '0',
+                                      'Dist::Zilla::Plugin::GithubMeta' => '0',
+                                      'Dist::Zilla::Plugin::InstallGuide' => '0',
+                                      'Dist::Zilla::Plugin::Keywords' => '0.004',
+                                      'Dist::Zilla::Plugin::License' => '0',
+                                      'Dist::Zilla::Plugin::MakeMaker::Fallback' => '0.012',
+                                      'Dist::Zilla::Plugin::Manifest' => '0',
+                                      'Dist::Zilla::Plugin::MetaConfig' => '0',
+                                      'Dist::Zilla::Plugin::MetaJSON' => '0',
+                                      'Dist::Zilla::Plugin::MetaNoIndex' => '0',
+                                      'Dist::Zilla::Plugin::MetaProvides::Package' => '1.15000002',
+                                      'Dist::Zilla::Plugin::MetaResources' => '0',
+                                      'Dist::Zilla::Plugin::MetaTests' => '0',
+                                      'Dist::Zilla::Plugin::MetaYAML' => '0',
+                                      'Dist::Zilla::Plugin::MinimumPerl' => '0',
+                                      'Dist::Zilla::Plugin::ModuleBuildTiny::Fallback' => '0.005',
+                                      'Dist::Zilla::Plugin::MojibakeTests' => '0',
+                                      'Dist::Zilla::Plugin::NextRelease' => '4.300018',
+                                      'Dist::Zilla::Plugin::OptionalFeature' => '0',
+                                      'Dist::Zilla::Plugin::PkgVersion' => '5.010',
+                                      'Dist::Zilla::Plugin::PodCoverageTests' => '0',
+                                      'Dist::Zilla::Plugin::PodSyntaxTests' => '0',
+                                      'Dist::Zilla::Plugin::PodWeaver' => '0',
+                                      'Dist::Zilla::Plugin::Prereqs' => '0',
+                                      'Dist::Zilla::Plugin::Prereqs::AuthorDeps' => '0',
+                                      'Dist::Zilla::Plugin::Prereqs::Soften' => '0.004000',
+                                      'Dist::Zilla::Plugin::PromptIfStale' => '0',
+                                      'Dist::Zilla::Plugin::Readme' => '0',
+                                      'Dist::Zilla::Plugin::ReadmeAnyFromPod' => '0.142180',
+                                      'Dist::Zilla::Plugin::Run::AfterBuild' => '0',
+                                      'Dist::Zilla::Plugin::Run::AfterRelease' => '0',
+                                      'Dist::Zilla::Plugin::RunExtraTests' => '0.019',
+                                      'Dist::Zilla::Plugin::ShareDir' => '0',
+                                      'Dist::Zilla::Plugin::Test::CPAN::Changes' => '0.008',
+                                      'Dist::Zilla::Plugin::Test::ChangesHasContent' => '0',
+                                      'Dist::Zilla::Plugin::Test::CheckBreaks' => '0',
+                                      'Dist::Zilla::Plugin::Test::CleanNamespaces' => '0',
+                                      'Dist::Zilla::Plugin::Test::Compile' => '2.039',
+                                      'Dist::Zilla::Plugin::Test::Kwalitee' => '0',
+                                      'Dist::Zilla::Plugin::Test::MinimumVersion' => '2.000003',
+                                      'Dist::Zilla::Plugin::Test::NoTabs' => '0',
+                                      'Dist::Zilla::Plugin::Test::Pod::No404s' => '0',
+                                      'Dist::Zilla::Plugin::Test::PodSpelling' => '0',
+                                      'Dist::Zilla::Plugin::Test::Portability' => '0',
+                                      'Dist::Zilla::Plugin::Test::ReportPrereqs' => '0',
+                                      'Dist::Zilla::Plugin::TestRelease' => '0',
+                                      'Dist::Zilla::Plugin::UploadToCPAN' => '0',
+                                      'Dist::Zilla::PluginBundle::Author::ETHER' => '0.068',
+                                      'File::Spec' => '0',
+                                      'IO::AtomicFile' => '0',
+                                      'IO::File' => '0',
+                                      'IO::Handle' => '0',
+                                      'IPC::Open3' => '0',
+                                      'JSON::Any' => '1.15',
+                                      'MooseX::Storage::Format::JSONpm' => '0',
+                                      'Pod::Coverage::TrustPod' => '0',
+                                      'Pod::Weaver' => '4',
+                                      'Pod::Weaver::Section::Contributors' => '0',
+                                      'Storable' => '0',
+                                      'Test::CPAN::Changes' => '0.19',
+                                      'Test::CPAN::Meta' => '0',
+                                      'Test::CleanNamespaces' => '0.15',
+                                      'Test::Deep::JSON' => '0',
+                                      'Test::Kwalitee' => '1.21',
+                                      'Test::More' => '0.94',
+                                      'Test::NoTabs' => '0',
+                                      'Test::Pod' => '1.41',
+                                      'Test::Pod::Coverage' => '1.08',
+                                      'Test::Spelling' => '0.12',
+                                      'Test::Without::Module' => '0',
+                                      'YAML' => '0',
+                                      'YAML::Any' => '0',
+                                      'YAML::Syck' => '0',
+                                      'YAML::XS' => '0'
+                                    }
+                    },
+       'runtime' => {
+                      'recommends' => {
+                                        'IO::AtomicFile' => '0',
+                                        'IO::File' => '0',
+                                        'JSON::Any' => '1.15',
+                                        'MooseX::Storage::Format::JSONpm' => '0',
+                                        'Storable' => '0',
+                                        'YAML' => '0',
+                                        'YAML::Any' => '0',
+                                        'YAML::Syck' => '0',
+                                        'YAML::XS' => '0'
+                                      },
+                      'requires' => {
+                                      'Carp' => '0',
+                                      'Data::Dumper' => '0',
+                                      'Digest' => '0',
+                                      'Module::Runtime' => '0',
+                                      'Moose' => '0.99',
+                                      'Moose::Meta::Attribute' => '0',
+                                      'Moose::Role' => '0',
+                                      'Scalar::Util' => '0',
+                                      'String::RewritePrefix' => '0',
+                                      'namespace::autoclean' => '0',
+                                      'perl' => '5.008'
+                                    }
+                    },
+       'test' => {
+                   'recommends' => {
+                                     'CPAN::Meta' => '2.120900',
+                                     'Digest::HMAC_SHA1' => '0',
+                                     'Test::Deep::JSON' => '0',
+                                     'Test::Without::Module' => '0'
+                                   },
+                   'requires' => {
+                                   'ExtUtils::MakeMaker' => '0',
+                                   'File::Spec' => '0',
+                                   'File::Spec::Functions' => '0',
+                                   'File::Temp' => '0',
+                                   'Moose::Util::TypeConstraints' => '0',
+                                   'Test::Deep' => '0',
+                                   'Test::Fatal' => '0',
+                                   'Test::More' => '0',
+                                   'Test::Requires' => '0',
+                                   'overload' => '0',
+                                   'strict' => '0',
+                                   'utf8' => '0',
+                                   'warnings' => '0'
+                                 }
+                 }
+     };
+  $x;
+ }
\ No newline at end of file
@@ -3,236 +3,185 @@
 use strict;
 use warnings;
 
-# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.013
+# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019
 
 use Test::More tests => 1;
 
 use ExtUtils::MakeMaker;
-use File::Spec::Functions;
-use List::Util qw/max/;
-use version;
+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_req = "CPAN::Meta::Requirements";
-my $HAS_CPAN_META = eval "require $cpan_meta"; ## no critic
-my $HAS_CPAN_META_REQ = eval "require $cpan_meta_req; $cpan_meta_req->VERSION('2.120900')";
+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 _merge_requires {
+sub _max {
+    my $max = shift;
+    $max = ( $_ > $max ) ? $_ : $max for @_;
+    return $max;
+}
+
+sub _merge_prereqs {
     my ($collector, $prereqs) = @_;
-    for my $phase ( qw/configure build test runtime develop/ ) {
-        next unless exists $prereqs->{$phase};
-        if ( my $req = $prereqs->{$phase}{'requires'} ) {
-            my $cmr = CPAN::Meta::Requirements->from_string_hash( $req );
-            $collector->add_requirements( $cmr );
+
+    # 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};
+            }
         }
     }
-}
 
-my %include = map {; $_ => 1 } qw(
+    return $collector;
+}
 
+my @include = qw(
+  Dist::CheckConflicts
+  YAML::Old
+  YAML
+  YAML::Tiny
+  MooseX::Role::Parameterized
+  JSON
+  JSON::PP
+  JSON::DWIW
+  JSON::Syck
+  JSON::XS
+  Cpanel::JSON::XS
+  JSON::MaybeXS
+  YAML::XS
+  YAML::Syck
 );
 
-my %exclude = map {; $_ => 1 } qw(
+my @exclude = qw(
 
 );
 
 # Add static prereqs to the included modules list
-my $static_prereqs = do { my $x = {
-       'configure' => {
-                        'requires' => {
-                                        'ExtUtils::MakeMaker' => '6.30',
-                                        'Module::Build::Tiny' => '0.035'
-                                      }
-                      },
-       'develop' => {
-                      'recommends' => {
-                                        'Dist::Zilla::PluginBundle::Author::ETHER' => '0.054'
-                                      },
-                      'requires' => {
-                                      'Digest::HMAC_SHA1' => '0',
-                                      'Dist::Zilla' => '5.014',
-                                      'Dist::Zilla::Plugin::ContributorsFromGit' => '0',
-                                      'Dist::Zilla::Plugin::GitHub::Update' => '0',
-                                      'Dist::Zilla::Plugin::GithubMeta' => '0',
-                                      'Dist::Zilla::Plugin::MakeMaker::Fallback' => '0.008',
-                                      'Dist::Zilla::Plugin::MetaResources' => '0',
-                                      'Dist::Zilla::Plugin::ModuleBuildTiny' => '0.004',
-                                      'Dist::Zilla::Plugin::OptionalFeature' => '0',
-                                      'Dist::Zilla::Plugin::Prereqs::Soften' => '0.004000',
-                                      'Dist::Zilla::Plugin::Test::CheckBreaks' => '0',
-                                      'Dist::Zilla::Plugin::Test::CleanNamespaces' => '0',
-                                      'Dist::Zilla::PluginBundle::Author::ETHER' => '0.019',
-                                      'File::Spec' => '0',
-                                      'IO::AtomicFile' => '0',
-                                      'IO::File' => '0',
-                                      'IO::Handle' => '0',
-                                      'IPC::Open3' => '0',
-                                      'JSON::Any' => '1.15',
-                                      'MooseX::Storage::Format::JSONpm' => '0',
-                                      'Pod::Coverage::TrustPod' => '0',
-                                      'Pod::Weaver' => '4',
-                                      'Pod::Weaver::Section::Contributors' => '0',
-                                      'Storable' => '0',
-                                      'Test::CPAN::Changes' => '0.19',
-                                      'Test::CPAN::Meta' => '0',
-                                      'Test::CleanNamespaces' => '>= 0.04, != 0.06',
-                                      'Test::Deep::JSON' => '0',
-                                      'Test::Kwalitee' => '1.12',
-                                      'Test::More' => '0.94',
-                                      'Test::NoTabs' => '0',
-                                      'Test::Pod' => '1.41',
-                                      'Test::Pod::Coverage' => '1.08',
-                                      'Test::Without::Module' => '0',
-                                      'YAML' => '0',
-                                      'YAML::Any' => '0',
-                                      'YAML::Syck' => '0',
-                                      'YAML::XS' => '0'
-                                    }
-                    },
-       'runtime' => {
-                      'recommends' => {
-                                        'IO::AtomicFile' => '0',
-                                        'IO::File' => '0',
-                                        'JSON::Any' => '1.15',
-                                        'MooseX::Storage::Format::JSONpm' => '0',
-                                        'Storable' => '0',
-                                        'YAML' => '0',
-                                        'YAML::Any' => '0',
-                                        'YAML::Syck' => '0',
-                                        'YAML::XS' => '0'
-                                      },
-                      'requires' => {
-                                      'Carp' => '0',
-                                      'Data::Dumper' => '0',
-                                      'Digest' => '0',
-                                      'Module::Runtime' => '0',
-                                      'Moose' => '0.99',
-                                      'Moose::Meta::Attribute' => '0',
-                                      'Moose::Role' => '0',
-                                      'Scalar::Util' => '0',
-                                      'String::RewritePrefix' => '0',
-                                      'namespace::autoclean' => '0',
-                                      'perl' => '5.008'
-                                    }
-                    },
-       'test' => {
-                   'recommends' => {
-                                     'CPAN::Meta' => '0',
-                                     'CPAN::Meta::Requirements' => '2.120900',
-                                     'Digest::HMAC_SHA1' => '0',
-                                     'Test::Deep::JSON' => '0',
-                                     'Test::Without::Module' => '0'
-                                   },
-                   'requires' => {
-                                   'ExtUtils::MakeMaker' => '0',
-                                   'File::Spec::Functions' => '0',
-                                   'File::Temp' => '0',
-                                   'List::Util' => '0',
-                                   'Moose::Util::TypeConstraints' => '0',
-                                   'Test::Deep' => '0',
-                                   'Test::Fatal' => '0',
-                                   'Test::More' => '0',
-                                   'Test::Requires' => '0',
-                                   'overload' => '0',
-                                   'strict' => '0',
-                                   'utf8' => '0',
-                                   'version' => '0',
-                                   'warnings' => '0'
-                                 }
-                 }
-     };
-  $x;
- };
-
-delete $static_prereqs->{develop} if not $ENV{AUTHOR_TESTING};
-$include{$_} = 1 for map { keys %$_ } map { values %$_ } values %$static_prereqs;
-
-# Merge requirements for major phases (if we can)
-my $all_requires;
-if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META_REQ ) {
-    $all_requires = $cpan_meta_req->new;
-    _merge_requires($all_requires, $static_prereqs);
-}
+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) } ) {
-    my $dynamic_prereqs = $meta->prereqs;
-    delete $dynamic_prereqs->{develop} if not $ENV{AUTHOR_TESTING};
-    $include{$_} = 1 for map { keys %$_ } map { values %$_ } values %$dynamic_prereqs;
-
-    if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META_REQ ) {
-        _merge_requires($all_requires, $dynamic_prereqs);
+    if ( my $meta = eval { CPAN::Meta->load_file($source) } ) {
+        $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs);
     }
-  }
 }
 else {
-  $source = 'static metadata';
+    $source = 'static metadata';
 }
 
-my @modules = sort grep { ! $exclude{$_} } keys %include;
-my @reports = [qw/Version Module/];
+my @full_reports;
 my @dep_errors;
-my $req_hash = defined($all_requires) ? $all_requires->as_string_hash : {};
-
-for my $mod ( @modules ) {
-  next if $mod eq 'perl';
-  my $file = $mod;
-  $file =~ s{::}{/}g;
-  $file .= ".pm";
-  my ($prefix) = grep { -e catfile($_, $file) } @INC;
-  if ( $prefix ) {
-    my $ver = MM->parse_version( catfile($prefix, $file) );
-    $ver = "undef" unless defined $ver; # Newer MM should do this anyway
-    push @reports, [$ver, $mod];
-
-    if ( $DO_VERIFY_PREREQS && $all_requires ) {
-      my $req = $req_hash->{$mod};
-      if ( defined $req && length $req ) {
-        if ( ! defined eval { version->parse($ver) } ) {
-          push @dep_errors, "$mod version '$ver' cannot be parsed (version '$req' required)";
-        }
-        elsif ( ! $all_requires->accepts_module( $mod => $ver ) ) {
-          push @dep_errors, "$mod version '$ver' is not in required range '$req'";
+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)";
+                }
+            }
         }
-      }
-    }
 
-  }
-  else {
-    push @reports, ["missing", $mod];
+        if ( @reports ) {
+            push @full_reports, "=== $title ===\n\n";
 
-    if ( $DO_VERIFY_PREREQS && $all_requires ) {
-      my $req = $req_hash->{$mod};
-      if ( defined $req && length $req ) {
-        push @dep_errors, "$mod is not installed (version '$req' required)";
-      }
+            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 ( @reports ) {
-  my $vl = max map { length $_->[0] } @reports;
-  my $ml = max map { length $_->[1] } @reports;
-  splice @reports, 1, 0, ["-" x $vl, "-" x $ml];
-  diag "\nVersions for all modules listed in $source (including optional ones):\n",
-    map {sprintf("  %*s %*s\n",$vl,$_->[0],-$ml,$_->[1])} @reports;
+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"
-  );
+    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;
@@ -9,7 +9,6 @@ BEGIN {
 }
 
 {
-
     package Foo;
     use Moose;
     use MooseX::Storage;
@@ -10,6 +10,7 @@ use File::Spec::Functions;
 my $dir = tempdir;
 
 use Test::Requires 'JSON::Any';
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 BEGIN {
     plan tests => 10;
@@ -63,4 +64,3 @@ my $file = catfile($dir, 'temp.json');
     isa_ok($foo->object, 'Foo');
     is($foo->object->number, 2, '... got the right number (in the embedded object)');
 }
-
@@ -17,7 +17,6 @@ cases.
 =cut
 
 {
-
     package Foo;
     use Moose;
     use Moose::Util::TypeConstraints;
@@ -93,7 +93,6 @@ ArrayRef and HashRef type handlers.
     }
 }
 
-
 {
     my $baz = Baz->new(
         bars => { map { ($_ => Bar->new(number => $_)) } (1 .. 10) }
@@ -15,7 +15,6 @@ BEGIN {
 # - you can use a special metaclass to tell MooseX::Storage to skip an attribute
 
 {
-
     package Circular;
     use Moose;
     use MooseX::Storage;
@@ -48,7 +47,6 @@ BEGIN {
 }
 
 {
-
     package Tree;
     use Moose;
     use MooseX::Storage;
@@ -153,7 +151,6 @@ BEGIN {
     ok( $pack,                  "   Object packs when cycle check is disabled");
     ok( Double->unpack( $pack ),
                                 "   And unpacked again" );
-
 }
 
 ### the same as above, but now done with a trait
@@ -86,8 +86,3 @@ $foo->pack,
     is($foo->bar->baz, 'BAZ', '... got the right stuff');
     is($foo->bar->boo, 'BOO', '... got the right stuff');
 }
-
-
-
-
-
@@ -9,7 +9,6 @@ BEGIN {
 }
 
 {
-
     package Foo;
     use Moose;
     use MooseX::Storage;
@@ -94,8 +94,3 @@ BEGIN {
     my $bar2 = Bar->unpack( $bpack, inject => { foo => bless {} } );
     ok( $bar2,                  "   Unpacked correctly with foo => Object");
 }
-
-
-
-
-
@@ -8,6 +8,7 @@ use Test::Requires qw(
     JSON::Any
     Test::Deep::JSON
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 BEGIN {
     plan tests => 11;
@@ -15,7 +16,6 @@ BEGIN {
 }
 
 {
-
     package Foo;
     use Moose;
     use MooseX::Storage;
@@ -82,4 +82,3 @@ BEGIN {
     is( $foo->object->number, 2,
         '... got the right number (in the embedded object)' );
 }
-
@@ -16,6 +16,11 @@ use Test::Requires qw(
     Encode
     JSON::Any
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
+
+binmode $_, ':utf8' foreach map { Test::Builder->new->$_ } qw(output failure_output todo_output);
+binmode STDOUT, ':utf8';
+binmode STDERR, ':utf8';
 
 plan tests => 16;
 use_ok('MooseX::Storage');
@@ -36,7 +36,6 @@ BEGIN {
         -1,
         "there are newlines in our JSON, because it is pretty",
     ) or diag $json;
-
 }
 
 {
@@ -10,6 +10,7 @@ use Test::Requires qw(
     YAML
     Test::Without::Module
 );
+diag 'using YAML backend: ', YAML::Any->implementation;
 
 BEGIN {
     Test::Without::Module->import(YAML::Any->order);
@@ -19,7 +20,6 @@ BEGIN {
 }
 
 {
-
     package Foo;
     use Moose;
     use MooseX::Storage;
@@ -64,4 +64,3 @@ BEGIN {
     is( $bar->object->number, 2,
         '... got the right number (in the embedded object)' );
 }
-
@@ -10,6 +10,7 @@ use Test::Requires qw(
     YAML::Syck
     Test::Without::Module
 );
+diag 'using YAML backend: ', YAML::Any->implementation;
 
 BEGIN {
     Test::Without::Module->import(YAML::Any->order);
@@ -63,4 +64,3 @@ BEGIN {
     is( $bar->object->number, 2,
         '... got the right number (in the embedded object)' );
 }
-
@@ -10,6 +10,7 @@ use Test::Requires qw(
     YAML::XS
     Test::Without::Module
 );
+diag 'using YAML backend: ', YAML::Any->implementation;
 
 BEGIN {
     Test::Without::Module->import(YAML::Any->order);
@@ -63,4 +64,3 @@ BEGIN {
     is( $bar->object->number, 2,
         '... got the right number (in the embedded object)' );
 }
-
@@ -9,6 +9,7 @@ use Test::Requires qw(
     Digest::HMAC_SHA1
     JSON::Any
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 BEGIN {
     plan tests => 26;
@@ -82,5 +82,3 @@ SKIP: {
     is('Foo', $classname,
        '... got the right class name from the yaml item');
 }
-
-
@@ -2,7 +2,7 @@ $|++;
 use strict;
 use warnings;
 
-use Test::More tests => 11;
+use Test::More tests => 15;
 use Test::Deep;
 use Storable;
 
@@ -11,13 +11,14 @@ BEGIN {
 }
 
 {
-
     package Foo;
     use Moose;
     use MooseX::Storage;
 
     with Storage( 'format' => 'Storable' );
 
+    has 'unset'  => ( is => 'ro', isa => 'Any' );
+    has 'undef'  => ( is => 'ro', isa => 'Any' );
     has 'number' => ( is => 'ro', isa => 'Int' );
     has 'string' => ( is => 'ro', isa => 'Str' );
     has 'float'  => ( is => 'ro', isa => 'Num' );
@@ -28,6 +29,7 @@ BEGIN {
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -44,9 +46,10 @@ BEGIN {
         $struct,
         {
             '__CLASS__' => 'Foo',
-            'float'     => 10.5,
+            'undef'     => undef,
             'number'    => 10,
             'string'    => 'foo',
+            'float'     => 10.5,
             'array'     => [ 1 .. 10],
             'hash'      => { map { $_ => undef } 1 .. 10 },
             'object'    => {
@@ -61,9 +64,10 @@ BEGIN {
 {
     my $stored = Storable::nfreeze({
         '__CLASS__' => 'Foo',
-        'float'     => 10.5,
+        'undef'     => undef,
         'number'    => 10,
         'string'    => 'foo',
+        'float'     => 10.5,
         'array'     => [ 1 .. 10],
         'hash'      => { map { $_ => undef } 1 .. 10 },
         'object'    => {
@@ -75,6 +79,10 @@ BEGIN {
     my $foo = Foo->thaw($stored);
     isa_ok( $foo, 'Foo' );
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is( $foo->number, 10,    '... got the right number' );
     is( $foo->string, 'foo', '... got the right string' );
     is( $foo->float,  10.5,  '... got the right float' );
@@ -89,4 +97,3 @@ BEGIN {
     is( $foo->object->number, 2,
         '... got the right number (in the embedded object)' );
 }
-
@@ -11,14 +11,14 @@ use Test::Requires qw(
     JSON::Any
     YAML::Any
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
+diag 'using YAML backend: ', YAML::Any->implementation;
 
 BEGIN {
-    plan tests => 30;
+    plan tests => 34;
     use_ok('MooseX::Storage');
 }
 
-diag('Using implementation: ', YAML::Any->implementation);
-
 {
     package Foo;
     use Moose;
@@ -26,6 +26,8 @@ diag('Using implementation: ', YAML::Any->implementation);
 
     with 'MooseX::Storage::Deferred';
 
+    has 'unset'  => ( is => 'ro', isa => 'Any' );
+    has 'undef'  => ( is => 'ro', isa => 'Any' );
     has 'number' => ( is => 'ro', isa => 'Int' );
     has 'string' => ( is => 'ro', isa => 'Str' );
     has 'float'  => ( is => 'ro', isa => 'Num' );
@@ -36,6 +38,7 @@ diag('Using implementation: ', YAML::Any->implementation);
 
 {
     my $foo = Foo->new(
+        undef => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -50,6 +53,7 @@ diag('Using implementation: ', YAML::Any->implementation);
     cmp_deeply(
         $json,
         json({
+            undef => undef,
             number => 10,
             string => 'foo',
             float  => 10.5,
@@ -89,6 +93,7 @@ diag('Using implementation: ', YAML::Any->implementation);
 
 {
     my $foo = Foo->new(
+        undef => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -105,8 +110,9 @@ diag('Using implementation: ', YAML::Any->implementation);
         $struct,
         {
             '__CLASS__' => 'Foo',
-            'float'     => 10.5,
+            'undef'     => undef,
             'number'    => 10,
+            'float'     => 10.5,
             'string'    => 'foo',
             'array'     => [ 1 .. 10],
             'hash'      => { map { $_ => undef } 1 .. 10 },
@@ -122,9 +128,10 @@ diag('Using implementation: ', YAML::Any->implementation);
 {
     my $stored = Storable::nfreeze({
         '__CLASS__' => 'Foo',
-        'float'     => 10.5,
+        'undef'     => undef,
         'number'    => 10,
         'string'    => 'foo',
+        'float'     => 10.5,
         'array'     => [ 1 .. 10],
         'hash'      => { map { $_ => undef } 1 .. 10 },
         'object'    => {
@@ -153,6 +160,7 @@ diag('Using implementation: ', YAML::Any->implementation);
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -167,6 +175,10 @@ diag('Using implementation: ', YAML::Any->implementation);
     my $bar = Foo->thaw( $yaml, { 'format' => 'YAML' } );
     isa_ok( $bar, 'Foo' );
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is( $bar->number, 10,    '... got the right number' );
     is( $bar->string, 'foo', '... got the right string' );
     is( $bar->float,  10.5,  '... got the right float' );
@@ -181,4 +193,3 @@ diag('Using implementation: ', YAML::Any->implementation);
     is( $bar->object->number, 2,
         '... got the right number (in the embedded object)' );
 }
-
@@ -12,9 +12,10 @@ use Test::Requires qw(
     IO::AtomicFile
     JSON::Any
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 BEGIN {
-    plan tests => 20;
+    plan tests => 24;
     use_ok('MooseX::Storage');
 }
 
@@ -25,6 +26,8 @@ BEGIN {
 
     with 'MooseX::Storage::Deferred';
 
+    has 'unset'  => ( is => 'ro', isa => 'Any' );
+    has 'undef'  => ( is => 'ro', isa => 'Any' );
     has 'number' => (is => 'ro', isa => 'Int');
     has 'string' => (is => 'ro', isa => 'Str');
     has 'float'  => (is => 'ro', isa => 'Num');
@@ -37,6 +40,7 @@ my $file = catfile($dir, 'temp.json');
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -68,6 +72,7 @@ ok(!(-e $file), '... the file has been deleted');
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -84,6 +89,10 @@ ok(!(-e $file), '... the file has been deleted');
     my $foo = Foo->load($file, { format => 'JSON', io => 'AtomicFile' });
     isa_ok($foo, 'Foo');
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is($foo->number, 10, '... got the right number');
     is($foo->string, 'foo', '... got the right string');
     is($foo->float, 10.5, '... got the right float');
@@ -93,5 +102,3 @@ ok(!(-e $file), '... the file has been deleted');
     isa_ok($foo->object, 'Foo');
     is($foo->object->number, 2, '... got the right number (in the embedded object)');
 }
-
-
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 22;
+use Test::More tests => 30;
 use Test::Deep;
 
 BEGIN {
@@ -9,13 +9,14 @@ BEGIN {
 }
 
 {
-
     package Foo;
     use Moose;
     use MooseX::Storage;
 
     with Storage;
 
+    has 'unset'   => ( is => 'ro', isa => 'Any' );
+    has 'undef'   => ( is => 'ro', isa => 'Any' );
     has 'number'  => ( is => 'ro', isa => 'Maybe[Int]' );
     has 'string'  => ( is => 'ro', isa => 'Maybe[Str]' );
     has 'boolean' => ( is => 'ro', isa => 'Maybe[Bool]' );
@@ -27,6 +28,7 @@ BEGIN {
 
 {
     my $foo = Foo->new(
+        undef   => undef,
         number  => 10,
         string  => 'foo',
         boolean => 1,
@@ -41,6 +43,7 @@ BEGIN {
         $foo->pack,
         {
             __CLASS__ => 'Foo',
+            undef     => undef,
             number    => 10,
             string    => 'foo',
             boolean   => 1,
@@ -60,6 +63,7 @@ BEGIN {
     my $foo = Foo->unpack(
         {
             __CLASS__ => 'Foo',
+            undef     => undef,
             number    => 10,
             string    => 'foo',
             boolean   => 1,
@@ -74,6 +78,10 @@ BEGIN {
     );
     isa_ok( $foo, 'Foo' );
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is( $foo->number, 10,    '... got the right number' );
     is( $foo->string, 'foo', '... got the right string' );
     ok( $foo->boolean,       '... got the right boolean' );
@@ -90,7 +98,6 @@ BEGIN {
         '... got the right number (in the embedded object)' );
 }
 
-
 {
 
     package Foo;
@@ -122,6 +129,8 @@ BEGIN {
         => as 'HashRef'
         => where { scalar grep { !defined($_) } values %{$_} };
 
+    has 'unset'  => ( is => 'ro', isa => 'Any' );
+    has 'undef'  => ( is => 'ro', isa => 'Any' );
     has 'number' => ( is => 'ro', isa => 'Maybe[Natural]' );
     has 'string' => ( is => 'ro', isa => 'Maybe[FooString]' );
     has 'float'  => ( is => 'ro', isa => 'Maybe[HalfNum]' );
@@ -132,6 +141,7 @@ BEGIN {
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -145,6 +155,7 @@ BEGIN {
         $foo->pack,
         {
             __CLASS__ => 'Foo',
+            undef     => undef,
             number    => 10,
             string    => 'foo',
             float     => 10.5,
@@ -163,6 +174,7 @@ BEGIN {
     my $foo = Foo->unpack(
         {
             __CLASS__ => 'Foo',
+            undef     => undef,
             number    => 10,
             string    => 'foo',
             float     => 10.5,
@@ -176,6 +188,10 @@ BEGIN {
     );
     isa_ok( $foo, 'Foo' );
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is( $foo->number, 10,    '... got the right number' );
     is( $foo->string, 'foo', '... got the right string' );
     is( $foo->float,  10.5,  '... got the right float' );
@@ -8,9 +8,10 @@ use File::Spec::Functions;
 my $dir = tempdir;
 
 use Test::Requires 'JSON::Any';
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 BEGIN {
-    plan tests => 10;
+    plan tests => 14;
     use_ok('MooseX::Storage');
 }
 
@@ -21,6 +22,8 @@ BEGIN {
 
     with Storage(format => 'JSON', io => 'File');
 
+    has 'unset'  => (is => 'ro', isa => 'Any');
+    has 'undef'  => (is => 'ro', isa => 'Any');
     has 'number' => (is => 'ro', isa => 'Int');
     has 'string' => (is => 'ro', isa => 'Str');
     has 'float'  => (is => 'ro', isa => 'Num');
@@ -33,6 +36,7 @@ my $file = catfile( $dir, 'temp.json' );
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -49,6 +53,10 @@ my $file = catfile( $dir, 'temp.json' );
     my $foo = Foo->load($file);
     isa_ok($foo, 'Foo');
 
+    is($foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is($foo->undef, undef,  '... got the right undef value');
+    ok($foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is($foo->number, 10, '... got the right number');
     is($foo->string, 'foo', '... got the right string');
     is($foo->float, 10.5, '... got the right float');
@@ -58,4 +66,3 @@ my $file = catfile( $dir, 'temp.json' );
     isa_ok($foo->object, 'Foo');
     is($foo->object->number, 2, '... got the right number (in the embedded object)');
 }
-
@@ -11,9 +11,10 @@ use Test::Requires qw(
     JSON::Any
     IO::AtomicFile
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 BEGIN {
-    plan tests => 10;
+    plan tests => 14;
     use_ok('MooseX::Storage');
 }
 
@@ -24,6 +25,8 @@ BEGIN {
 
     with Storage(format => 'JSON', io => 'AtomicFile');
 
+    has 'unset'  => (is => 'ro', isa => 'Any');
+    has 'undef'  => (is => 'ro', isa => 'Any');
     has 'number' => (is => 'ro', isa => 'Int');
     has 'string' => (is => 'ro', isa => 'Str');
     has 'float'  => (is => 'ro', isa => 'Num');
@@ -36,6 +39,7 @@ my $file = catfile($dir,'temp.json');
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -52,6 +56,10 @@ my $file = catfile($dir,'temp.json');
     my $foo = Foo->load($file);
     isa_ok($foo, 'Foo');
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is($foo->number, 10, '... got the right number');
     is($foo->string, 'foo', '... got the right string');
     is($foo->float, 10.5, '... got the right float');
@@ -61,4 +69,3 @@ my $file = catfile($dir,'temp.json');
     isa_ok($foo->object, 'Foo');
     is($foo->object->number, 2, '... got the right number (in the embedded object)');
 }
-
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 10;
+use Test::More tests => 14;
 use Test::Deep;
 use File::Temp qw(tempdir);
 use File::Spec::Functions;
@@ -18,6 +18,8 @@ BEGIN {
 
     with Storage(io => 'StorableFile');
 
+    has 'unset'  => ( is => 'ro', isa => 'Any' );
+    has 'undef'  => ( is => 'ro', isa => 'Any' );
     has 'number' => (is => 'ro', isa => 'Int');
     has 'string' => (is => 'ro', isa => 'Str');
     has 'float'  => (is => 'ro', isa => 'Num');
@@ -30,6 +32,7 @@ my $file = catfile($dir,'temp.storable');
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -46,6 +49,10 @@ my $file = catfile($dir,'temp.storable');
     my $foo = Foo->load($file);
     isa_ok($foo, 'Foo');
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is($foo->number, 10, '... got the right number');
     is($foo->string, 'foo', '... got the right string');
     is($foo->float, 10.5, '... got the right float');
@@ -55,4 +62,3 @@ my $file = catfile($dir,'temp.storable');
     isa_ok($foo->object, 'Foo');
     is($foo->object->number, 2, '... got the right number (in the embedded object)');
 }
-
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 11;
+use Test::More tests => 15;
 use Test::Deep;
 use Storable ();
 use File::Temp qw(tempdir);
@@ -19,6 +19,8 @@ BEGIN {
 
     with Storage(io => 'StorableFile');
 
+    has 'unset'  => ( is => 'ro', isa => 'Any' );
+    has 'undef'  => ( is => 'ro', isa => 'Any' );
     has 'number' => (is => 'ro', isa => 'Int');
     has 'string' => (is => 'rw', isa => 'Str');
     has 'float'  => (is => 'ro', isa => 'Num');
@@ -48,6 +50,7 @@ my $file = catfile($dir,'temp.storable');
 
 {
     my $foo = Foo->new(
+        undef  => undef,
         number => 10,
         string => 'foo',
         float  => 10.5,
@@ -65,6 +68,7 @@ my $file = catfile($dir,'temp.storable');
         $data,
         {
             '__CLASS__' => 'Foo',
+            'undef'     => undef,
             'float'     => 10.5,
             'number'    => 10,
             'string'    => 'HELLO WORLD',
@@ -87,6 +91,10 @@ my $file = catfile($dir,'temp.storable');
     ## check our custom thaw hook fired
     is($foo->string, 'Hello World', '... got the right string');
 
+    is( $foo->unset, undef,  '... got the right unset value');
+    ok(!$foo->meta->get_attribute('unset')->has_value($foo), 'unset attribute has no value');
+    is( $foo->undef, undef,  '... got the right undef value');
+    ok( $foo->meta->get_attribute('undef')->has_value($foo), 'undef attribute has a value');
     is($foo->number, 10, '... got the right number');
     is($foo->float, 10.5, '... got the right float');
     cmp_deeply($foo->array, [ 1 .. 10], '... got the right array');
@@ -95,4 +103,3 @@ my $file = catfile($dir,'temp.storable');
     isa_ok($foo->object, 'Foo');
     is($foo->object->number, 2, '... got the right number (in the embedded object)');
 }
-
@@ -19,11 +19,15 @@ use Test::Requires qw(
     JSON::Any
     IO::AtomicFile
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 plan tests => 8;
 use_ok('MooseX::Storage');
 
 use utf8;
+binmode $_, ':utf8' foreach map { Test::Builder->new->$_ } qw(output failure_output todo_output);
+binmode STDOUT, ':utf8';
+binmode STDERR, ':utf8';
 
 {
     package Foo;
@@ -19,6 +19,11 @@ use Test::Requires qw(
     JSON::Any
     IO::AtomicFile
 );
+diag 'using JSON backend: ', JSON::Any->handlerType;
+
+binmode $_, ':utf8' foreach map { Test::Builder->new->$_ } qw(output failure_output todo_output);
+binmode STDOUT, ':utf8';
+binmode STDERR, ':utf8';
 
 plan tests => 8;
 use_ok('MooseX::Storage');
@@ -4,6 +4,7 @@ use Test::More;
 use Test::Fatal;
 
 use Test::Requires 'JSON::Any';
+diag 'using JSON backend: ', JSON::Any->handlerType;
 
 {
     package Thing;
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 
-# this test was generated with Dist::Zilla::Plugin::Test::CheckBreaks 0.007
+# this test was generated with Dist::Zilla::Plugin::Test::CheckBreaks 0.009
 
 use Test::More;
 
@@ -3,6 +3,4 @@
 [-Transformer]
 transformer = List
 
-[-StopWords]
-
 [Contributors]
@@ -2,7 +2,7 @@ use 5.006;
 use strict;
 use warnings;
 
-# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.039
+# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.046
 
 use Test::More 0.94 tests => 12 + ($ENV{AUTHOR_TESTING} ? 1 : 0);
 
@@ -56,6 +56,6 @@ for my $lib (@module_files)
 
 
 
-is(scalar(@warnings), 0, 'no warnings found') if $ENV{AUTHOR_TESTING};
+is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', explain \@warnings if $ENV{AUTHOR_TESTING};
 
 BAIL_OUT("Compilation problems") if !Test::More->builder->is_passing;
@@ -0,0 +1,82 @@
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.09
+
+use Test::More 0.88;
+use Test::NoTabs;
+
+my @files = (
+    'lib/MooseX/Storage.pm',
+    'lib/MooseX/Storage/Base/WithChecksum.pm',
+    'lib/MooseX/Storage/Basic.pm',
+    'lib/MooseX/Storage/Deferred.pm',
+    'lib/MooseX/Storage/Engine.pm',
+    'lib/MooseX/Storage/Engine/IO/AtomicFile.pm',
+    'lib/MooseX/Storage/Engine/IO/File.pm',
+    'lib/MooseX/Storage/Engine/Trait/DisableCycleDetection.pm',
+    'lib/MooseX/Storage/Engine/Trait/OnlyWhenBuilt.pm',
+    'lib/MooseX/Storage/Format/JSON.pm',
+    'lib/MooseX/Storage/Format/Storable.pm',
+    'lib/MooseX/Storage/Format/YAML.pm',
+    'lib/MooseX/Storage/IO/AtomicFile.pm',
+    'lib/MooseX/Storage/IO/File.pm',
+    'lib/MooseX/Storage/IO/StorableFile.pm',
+    'lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm',
+    'lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm',
+    'lib/MooseX/Storage/Traits/DisableCycleDetection.pm',
+    'lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm',
+    'lib/MooseX/Storage/Util.pm',
+    't/00-report-prereqs.dd',
+    't/00-report-prereqs.t',
+    't/000_load.t',
+    't/001_basic.t',
+    't/002_basic_io.t',
+    't/002_basic_w_subtypes.t',
+    't/003_basic_w_embedded_objects.t',
+    't/004_w_cycles.t',
+    't/005_w_versions_and_authority_check.t',
+    't/006_w_custom_type_handlers.t',
+    't/007_false.t',
+    't/008_do_not_serialize.t',
+    't/009_do_not_serialize_lazy.t',
+    't/010_basic_json.t',
+    't/011_basic_json_w_utf8.t',
+    't/012_param_json.t',
+    't/020_basic_yaml.t',
+    't/020_basic_yaml_syck.t',
+    't/020_basic_yaml_xs.t',
+    't/030_with_checksum.t',
+    't/040_basic_utils.t',
+    't/050_basic_storable.t',
+    't/060_basic_deferred.t',
+    't/061_basic_deferred_w_io.t',
+    't/070_basic_maybe.t',
+    't/100_io.t',
+    't/101_io_atomic.t',
+    't/102_io_storable_file.t',
+    't/103_io_storable_file_custom.t',
+    't/104_io_w_utf8.t',
+    't/105_io_atomic_w_utf8.t',
+    't/200_combined_in_roles.t',
+    't/300_overloaded.t',
+    't/zzz-check-breaks.t',
+    'xt/author/00-compile.t',
+    'xt/author/no-tabs.t',
+    'xt/author/pod-spell.t',
+    'xt/release/changes_has_content.t',
+    'xt/release/clean-namespaces.t',
+    'xt/release/cpan-changes.t',
+    'xt/release/distmeta.t',
+    'xt/release/eol.t',
+    'xt/release/kwalitee.t',
+    'xt/release/minimum-version.t',
+    'xt/release/mojibake.t',
+    'xt/release/pod-coverage.t',
+    'xt/release/pod-no404s.t',
+    'xt/release/pod-syntax.t',
+    'xt/release/portability.t'
+);
+
+notabs_ok($_) foreach @files;
+done_testing;
@@ -2,7 +2,7 @@ use strict;
 use warnings;
 use Test::More;
 
-# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006007
+# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006008
 use Test::Spelling 0.12;
 use Pod::Wordlist;
 
@@ -25,71 +25,74 @@ nothingmuch
 Infinity
 Interactive
 Inc
-Cory
-Watson
-gphat
+Karen
+Etheridge
+ether
+Tomas
+Doran
+bobtfish
+Ricardo
+Signes
+rjbs
+Jos
+Boumans
+jos
+Shawn
+Moore
+sartak
+Jonathan
+Yu
+frequency
+Robert
+Boone
+robo4288
 Dagfinn
 Ilmari
 Mannsåker
 ilmari
+Cory
+Watson
+gphat
 Dan
 Brook
 dan
 David
-Golden
-dagolden
 Steinbrunner
 dsteinbrunner
-Florian
-Ragwitz
-rafl
+Jason
+Pope
+cowholio4
 Johannes
 Plunien
 plu
-Jonathan
 Rockway
 jon
-Yu
-frequency
-Jos
-Boumans
-jos
-Karen
-Etheridge
-ether
-Ricardo
-Signes
-rjbs
-Robert
-Boone
-robo4288
-Shawn
-Moore
-sartak
-Tomas
-Doran
-bobtfish
+Florian
+Ragwitz
+rafl
+Golden
+dagolden
 lib
 MooseX
 Storage
 IO
 AtomicFile
-StorableFile
-Traits
-DisableCycleDetection
-Meta
-Attribute
-Trait
-DoNotSerialize
 Engine
+Trait
 OnlyWhenBuilt
-File
-Basic
 Deferred
-Base
-WithChecksum
 Util
+File
 Format
 JSON
+Meta
+Attribute
+DoNotSerialize
 Storable
+Basic
+Traits
+DisableCycleDetection
 YAML
+Base
+WithChecksum
+StorableFile
@@ -4,7 +4,7 @@ use Test::More tests => 2;
 
 note 'Checking Changes';
 my $changes_file = 'Changes';
-my $newver = '0.46';
+my $newver = '0.47';
 my $trial_token = '-TRIAL';
 
 SKIP: {
@@ -1,10 +1,10 @@
 use strict;
 use warnings;
 
-# this test was generated with Dist::Zilla::Plugin::Test::CleanNamespaces 0.003
+# this test was generated with Dist::Zilla::Plugin::Test::CleanNamespaces 0.005
 
 use Test::More 0.94;
-use Test::CleanNamespaces 0.04;
+use Test::CleanNamespaces 0.15;
 
 subtest all_namespaces_clean => sub { all_namespaces_clean() };
 
@@ -1,4 +1,9 @@
-# this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.07
+# this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.10
 use strict;
 use warnings;
-use Test::Kwalitee;
+use Test::More 0.88;
+use Test::Kwalitee 1.21 'kwalitee_ok';
+
+kwalitee_ok();
+
+done_testing;
@@ -1,33 +0,0 @@
-use strict;
-use warnings;
-
-# this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.06
-
-use Test::More 0.88;
-use Test::NoTabs;
-
-my @files = (
-    'lib/MooseX/Storage.pm',
-    'lib/MooseX/Storage/Base/WithChecksum.pm',
-    'lib/MooseX/Storage/Basic.pm',
-    'lib/MooseX/Storage/Deferred.pm',
-    'lib/MooseX/Storage/Engine.pm',
-    'lib/MooseX/Storage/Engine/IO/AtomicFile.pm',
-    'lib/MooseX/Storage/Engine/IO/File.pm',
-    'lib/MooseX/Storage/Engine/Trait/DisableCycleDetection.pm',
-    'lib/MooseX/Storage/Engine/Trait/OnlyWhenBuilt.pm',
-    'lib/MooseX/Storage/Format/JSON.pm',
-    'lib/MooseX/Storage/Format/Storable.pm',
-    'lib/MooseX/Storage/Format/YAML.pm',
-    'lib/MooseX/Storage/IO/AtomicFile.pm',
-    'lib/MooseX/Storage/IO/File.pm',
-    'lib/MooseX/Storage/IO/StorableFile.pm',
-    'lib/MooseX/Storage/Meta/Attribute/DoNotSerialize.pm',
-    'lib/MooseX/Storage/Meta/Attribute/Trait/DoNotSerialize.pm',
-    'lib/MooseX/Storage/Traits/DisableCycleDetection.pm',
-    'lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm',
-    'lib/MooseX/Storage/Util.pm'
-);
-
-notabs_ok($_) foreach @files;
-done_testing;
@@ -1,22 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-
-# generated by Dist::Zilla::Plugin::Test::Version 0.002004
-BEGIN { eval "use Test::Version; 1;" or die $@; }
-
-my @imports = ( 'version_all_ok' );
-
-my $params = {
-    is_strict   => 1,
-    has_version => 1,
-};
-
-push @imports, $params
-    if version->parse( $Test::Version::VERSION ) >= version->parse('1.002');
-
-
-Test::Version->import(@imports);
-
-version_all_ok;
-done_testing;
@@ -1,8 +0,0 @@
-#!perl
-
-use Test::More;
-
-eval "use Test::Vars";
-plan skip_all => "Test::Vars required for testing unused vars"
-  if $@;
-all_vars_ok();