The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 021
LICENSE 44
MANIFEST 24
META.json 61298
META.yml 79255
Makefile.PL 2941
README 24
lib/Log/Dispatchouli/Global.pm 13158
lib/Log/Dispatchouli/Proxy.pm 625
lib/Log/Dispatchouli.pm 22384
t/00-compile.t 740
t/00-report-prereqs.dd 051
t/00-report-prereqs.t 0176
t/000-report-versions-tiny.t 950
t/file.t 069
xt/release/changes_has_content.t 11
xt/release/pod-syntax.t 32
17 files changed (This is a version diff) 3911493
@@ -1,5 +1,26 @@
 Revision history for Log-Dispatchouli
 
+2.012     2014-11-30 08:49:01-05:00 America/New_York
+          avoid a newly-introduced warning on older perls (thanks, Christopher
+          J. Madsen)
+
+2.011     2014-11-29 08:50:45-05:00 America/New_York
+          some optimizations in timestamp and pid logging (thanks, Olivier
+          Mengué)
+
+2.010     2014-07-28 22:24:23-04:00 America/New_York
+          add the file_format option (thanks, Randy Stauner)
+
+2.009     2014-01-11 14:14:11-05:00 America/New_York
+          load the Proxy class earlier, to get it loaded prefork
+
+2.008     2013-09-26 20:39:11 America/New_York
+          fix test for JSON::PP, which doesn't always follow orders about
+          spaces!  (thanks, Dagfinn Ilmari MannsÄker!)
+
+2.007     2013-09-25 22:12:22 America/New_York
+          doc fixes and tests (thanks George Hartzell and Randy Stauner)
+
 2.006     2013-04-05 15:02:05 America/New_York
           put the ->info, ->fatal, ->debug methods on proxies, too
           (thanks George Hartzell)
@@ -1,4 +1,4 @@
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -12,7 +12,7 @@ b) the "Artistic License"
 
 --- The GNU General Public License, Version 1, February 1989 ---
 
-This software is Copyright (c) 2013 by Ricardo SIGNES.
+This software is Copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software, licensed under:
 
@@ -22,7 +22,7 @@ This is free software, licensed under:
                      Version 1, February 1989
 
  Copyright (C) 1989 Free Software Foundation, Inc.
- 51 Franklin St, Suite 500, Boston, MA  02110-1335  USA
+ 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
@@ -272,7 +272,7 @@ That's all there is to it!
 
 --- The Artistic License 1.0 ---
 
-This software is Copyright (c) 2013 by Ricardo SIGNES.
+This software is Copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software, licensed under:
 
@@ -1,3 +1,4 @@
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.025.
 Changes
 LICENSE
 MANIFEST
@@ -9,10 +10,11 @@ dist.ini
 lib/Log/Dispatchouli.pm
 lib/Log/Dispatchouli/Global.pm
 lib/Log/Dispatchouli/Proxy.pm
-t/00-compile.t
-t/000-report-versions-tiny.t
+t/00-report-prereqs.dd
+t/00-report-prereqs.t
 t/basic.t
 t/env-value.t
+t/file.t
 t/global-subclass.t
 t/global.t
 t/lib/DDR/Child.pm
@@ -4,7 +4,7 @@
       "Ricardo SIGNES <rjbs@cpan.org>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 4.300032, CPAN::Meta::Converter version 2.130880",
+   "generated_by" : "Dist::Zilla version 5.025, CPAN::Meta::Converter version 2.143240",
    "license" : [
       "perl_5"
    ],
@@ -16,13 +16,12 @@
    "prereqs" : {
       "configure" : {
          "requires" : {
-            "ExtUtils::MakeMaker" : "6.30"
+            "ExtUtils::MakeMaker" : "0"
          }
       },
       "develop" : {
          "requires" : {
-            "Test::Pod" : "1.41",
-            "version" : "0.9901"
+            "Test::Pod" : "1.41"
          }
       },
       "runtime" : {
@@ -47,155 +46,221 @@
          }
       },
       "test" : {
+         "recommends" : {
+            "CPAN::Meta" : "2.120900"
+         },
          "requires" : {
-            "File::Find" : "0",
+            "ExtUtils::MakeMaker" : "0",
+            "File::Spec" : "0",
+            "File::Spec::Functions" : "0",
             "File::Temp" : "0",
             "Test::Deep" : "0",
             "Test::Fatal" : "0",
             "Test::More" : "0.96",
-            "base" : "0"
+            "base" : "0",
+            "lib" : "0"
          }
       }
    },
    "release_status" : "stable",
    "resources" : {
-      "homepage" : "https://github.com/rjbs/log-dispatchouli",
+      "bugtracker" : {
+         "web" : "https://github.com/rjbs/Log-Dispatchouli/issues"
+      },
+      "homepage" : "https://github.com/rjbs/Log-Dispatchouli",
       "repository" : {
          "type" : "git",
-         "url" : "https://github.com/rjbs/log-dispatchouli.git",
-         "web" : "https://github.com/rjbs/log-dispatchouli"
+         "url" : "https://github.com/rjbs/Log-Dispatchouli.git",
+         "web" : "https://github.com/rjbs/Log-Dispatchouli"
       }
    },
-   "version" : "2.006",
+   "version" : "2.012",
    "x_Dist_Zilla" : {
       "perl" : {
-         "version" : "5.017010"
+         "version" : "5.021005"
       },
       "plugins" : [
          {
             "class" : "Dist::Zilla::Plugin::Git::GatherDir",
+            "config" : {
+               "Dist::Zilla::Plugin::GatherDir" : {
+                  "exclude_filename" : [],
+                  "exclude_match" : [],
+                  "follow_symlinks" : "0",
+                  "include_dotfiles" : "0",
+                  "prefix" : "",
+                  "prune_directory" : [],
+                  "root" : "."
+               },
+               "Dist::Zilla::Plugin::Git::GatherDir" : {
+                  "include_untracked" : "0"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@RJBS/Git::GatherDir",
-            "version" : "2.012"
+            "version" : "2.028"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed",
             "name" : "@RJBS/CheckPrereqsIndexed",
-            "version" : "0.008"
+            "version" : "0.013"
          },
          {
             "class" : "Dist::Zilla::Plugin::CheckExtraTests",
             "name" : "@RJBS/CheckExtraTests",
-            "version" : "0.011"
+            "version" : "0.025"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::PromptIfStale",
+            "config" : {
+               "Dist::Zilla::Plugin::PromptIfStale" : {
+                  "check_all_plugins" : 0,
+                  "check_all_prereqs" : 0,
+                  "modules" : [
+                     "Dist::Zilla::PluginBundle::RJBS"
+                  ],
+                  "phase" : "build",
+                  "skip" : []
+               }
+            },
+            "name" : "@RJBS/RJBS-Outdated",
+            "version" : "0.032"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::PromptIfStale",
+            "config" : {
+               "Dist::Zilla::Plugin::PromptIfStale" : {
+                  "check_all_plugins" : "1",
+                  "check_all_prereqs" : 0,
+                  "modules" : [],
+                  "phase" : "release",
+                  "skip" : []
+               }
+            },
+            "name" : "@RJBS/CPAN-Outdated",
+            "version" : "0.032"
          },
          {
             "class" : "Dist::Zilla::Plugin::PruneCruft",
             "name" : "@RJBS/@Filter/PruneCruft",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::ManifestSkip",
             "name" : "@RJBS/@Filter/ManifestSkip",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaYAML",
             "name" : "@RJBS/@Filter/MetaYAML",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::License",
             "name" : "@RJBS/@Filter/License",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Readme",
             "name" : "@RJBS/@Filter/Readme",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::ExecDir",
             "name" : "@RJBS/@Filter/ExecDir",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::ShareDir",
             "name" : "@RJBS/@Filter/ShareDir",
-            "version" : "4.300032"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::MakeMaker",
-            "name" : "@RJBS/@Filter/MakeMaker",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Manifest",
             "name" : "@RJBS/@Filter/Manifest",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::TestRelease",
             "name" : "@RJBS/@Filter/TestRelease",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::ConfirmRelease",
             "name" : "@RJBS/@Filter/ConfirmRelease",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::UploadToCPAN",
             "name" : "@RJBS/@Filter/UploadToCPAN",
-            "version" : "4.300032"
+            "version" : "5.025"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::MakeMaker",
+            "config" : {
+               "Dist::Zilla::Role::TestRunner" : {
+                  "default_jobs" : 9
+               }
+            },
+            "name" : "@RJBS/MakeMaker",
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::AutoPrereqs",
             "name" : "@RJBS/AutoPrereqs",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::NextVersion",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::NextVersion" : {
+                  "first_version" : "0.001",
+                  "version_by_branch" : "0",
+                  "version_regexp" : "(?^:^([0-9]+\\.[0-9]+)$)"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@RJBS/Git::NextVersion",
-            "version" : "2.012"
+            "version" : "2.028"
          },
          {
             "class" : "Dist::Zilla::Plugin::PkgVersion",
             "name" : "@RJBS/PkgVersion",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaConfig",
             "name" : "@RJBS/MetaConfig",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::MetaJSON",
             "name" : "@RJBS/MetaJSON",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::NextRelease",
             "name" : "@RJBS/NextRelease",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent",
             "name" : "@RJBS/Test::ChangesHasContent",
-            "version" : "0.006"
+            "version" : "0.007"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodSyntaxTests",
             "name" : "@RJBS/PodSyntaxTests",
-            "version" : "4.300032"
-         },
-         {
-            "class" : "Dist::Zilla::Plugin::Test::Compile",
-            "name" : "@RJBS/Test::Compile",
-            "version" : "2.001"
+            "version" : "5.025"
          },
          {
-            "class" : "Dist::Zilla::Plugin::ReportVersions::Tiny",
-            "name" : "@RJBS/ReportVersions::Tiny",
-            "version" : "1.08"
+            "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs",
+            "name" : "@RJBS/Test::ReportPrereqs",
+            "version" : "0.019"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -206,37 +271,199 @@
                }
             },
             "name" : "@RJBS/TestMoreWithSubtests",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::PodWeaver",
+            "config" : {
+               "Dist::Zilla::Plugin::PodWeaver" : {
+                  "config_plugins" : [
+                     "@RJBS"
+                  ],
+                  "finder" : [
+                     ":InstallModules",
+                     ":ExecFiles"
+                  ],
+                  "plugins" : [
+                     {
+                        "class" : "Pod::Weaver::Plugin::EnsurePod5",
+                        "name" : "@CorePrep/EnsurePod5",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Plugin::H1Nester",
+                        "name" : "@CorePrep/H1Nester",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Plugin::SingleEncoding",
+                        "name" : "@RJBS/SingleEncoding",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Name",
+                        "name" : "@RJBS/Name",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Version",
+                        "name" : "@RJBS/Version",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Region",
+                        "name" : "@RJBS/Prelude",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Synopsis",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Description",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Overview",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Generic",
+                        "name" : "@RJBS/Stability",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Collect",
+                        "name" : "Attributes",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Collect",
+                        "name" : "Methods",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Collect",
+                        "name" : "Functions",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Leftovers",
+                        "name" : "@RJBS/Leftovers",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Region",
+                        "name" : "@RJBS/postlude",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Authors",
+                        "name" : "@RJBS/Authors",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Section::Legal",
+                        "name" : "@RJBS/Legal",
+                        "version" : "4.008"
+                     },
+                     {
+                        "class" : "Pod::Weaver::Plugin::Transformer",
+                        "name" : "@RJBS/List",
+                        "version" : "4.008"
+                     }
+                  ]
+               }
+            },
             "name" : "@RJBS/PodWeaver",
-            "version" : "3.101641"
+            "version" : "4.006"
          },
          {
             "class" : "Dist::Zilla::Plugin::GithubMeta",
             "name" : "@RJBS/GithubMeta",
-            "version" : "0.28"
+            "version" : "0.46"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Check",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Check" : {
+                  "untracked_files" : "die"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [
+                     "dist.ini",
+                     "Changes"
+                  ],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@RJBS/@Git/Check",
-            "version" : "2.012"
+            "version" : "2.028"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Commit",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Commit" : {
+                  "add_files_in" : [],
+                  "commit_msg" : "v%v%n%n%c",
+                  "time_zone" : "local"
+               },
+               "Dist::Zilla::Role::Git::DirtyFiles" : {
+                  "allow_dirty" : [
+                     "dist.ini",
+                     "Changes"
+                  ],
+                  "allow_dirty_match" : [],
+                  "changelog" : "Changes"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@RJBS/@Git/Commit",
-            "version" : "2.012"
+            "version" : "2.028"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Tag",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Tag" : {
+                  "branch" : null,
+                  "signed" : 0,
+                  "tag" : "2.012",
+                  "tag_format" : "%v",
+                  "tag_message" : "v%v",
+                  "time_zone" : "local"
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@RJBS/@Git/Tag",
-            "version" : "2.012"
+            "version" : "2.028"
          },
          {
             "class" : "Dist::Zilla::Plugin::Git::Push",
+            "config" : {
+               "Dist::Zilla::Plugin::Git::Push" : {
+                  "push_to" : [
+                     "origin :",
+                     "github :"
+                  ],
+                  "remotes_must_exist" : 0
+               },
+               "Dist::Zilla::Role::Git::Repo" : {
+                  "repo_root" : "."
+               }
+            },
             "name" : "@RJBS/@Git/Push",
-            "version" : "2.012"
+            "version" : "2.028"
          },
          {
             "class" : "Dist::Zilla::Plugin::Prereqs",
@@ -247,37 +474,47 @@
                }
             },
             "name" : "Prereqs",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":InstallModules",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":IncModules",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":TestFiles",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ExecFiles",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":ShareFiles",
-            "version" : "4.300032"
+            "version" : "5.025"
          },
          {
             "class" : "Dist::Zilla::Plugin::FinderCode",
             "name" : ":MainModule",
-            "version" : "4.300032"
+            "version" : "5.025"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::FinderCode",
+            "name" : ":AllFiles",
+            "version" : "5.025"
+         },
+         {
+            "class" : "Dist::Zilla::Plugin::FinderCode",
+            "name" : ":NoFiles",
+            "version" : "5.025"
          }
       ],
       "zilla" : {
@@ -285,7 +522,7 @@
          "config" : {
             "is_trial" : "0"
          },
-         "version" : "4.300032"
+         "version" : "5.025"
       }
    }
 }
@@ -3,147 +3,193 @@ abstract: 'a simple wrapper around Log::Dispatch'
 author:
   - 'Ricardo SIGNES <rjbs@cpan.org>'
 build_requires:
-  File::Find: 0
-  File::Temp: 0
-  Test::Deep: 0
-  Test::Fatal: 0
-  Test::More: 0.96
-  base: 0
+  ExtUtils::MakeMaker: '0'
+  File::Spec: '0'
+  File::Spec::Functions: '0'
+  File::Temp: '0'
+  Test::Deep: '0'
+  Test::Fatal: '0'
+  Test::More: '0.96'
+  base: '0'
+  lib: '0'
 configure_requires:
-  ExtUtils::MakeMaker: 6.30
+  ExtUtils::MakeMaker: '0'
 dynamic_config: 0
-generated_by: 'Dist::Zilla version 4.300032, CPAN::Meta::Converter version 2.130880'
+generated_by: 'Dist::Zilla version 5.025, CPAN::Meta::Converter version 2.143240'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: Log-Dispatchouli
 requires:
-  Carp: 0
-  File::Spec: 0
-  Log::Dispatch: 0
-  Log::Dispatch::Array: 0
-  Log::Dispatch::File: 0
-  Log::Dispatch::Screen: 0
-  Log::Dispatch::Syslog: 0
-  Params::Util: 0
-  Scalar::Util: 0
-  String::Flogger: 0
-  Sub::Exporter: 0
-  Sub::Exporter::GlobExporter: 0.002
-  Sys::Syslog: 0.16
-  Try::Tiny: 0.04
-  overload: 0
-  strict: 0
-  warnings: 0
+  Carp: '0'
+  File::Spec: '0'
+  Log::Dispatch: '0'
+  Log::Dispatch::Array: '0'
+  Log::Dispatch::File: '0'
+  Log::Dispatch::Screen: '0'
+  Log::Dispatch::Syslog: '0'
+  Params::Util: '0'
+  Scalar::Util: '0'
+  String::Flogger: '0'
+  Sub::Exporter: '0'
+  Sub::Exporter::GlobExporter: '0.002'
+  Sys::Syslog: '0.16'
+  Try::Tiny: '0.04'
+  overload: '0'
+  strict: '0'
+  warnings: '0'
 resources:
-  homepage: https://github.com/rjbs/log-dispatchouli
-  repository: https://github.com/rjbs/log-dispatchouli.git
-version: 2.006
+  bugtracker: https://github.com/rjbs/Log-Dispatchouli/issues
+  homepage: https://github.com/rjbs/Log-Dispatchouli
+  repository: https://github.com/rjbs/Log-Dispatchouli.git
+version: '2.012'
 x_Dist_Zilla:
   perl:
-    version: 5.017010
+    version: '5.021005'
   plugins:
     -
       class: Dist::Zilla::Plugin::Git::GatherDir
+      config:
+        Dist::Zilla::Plugin::GatherDir:
+          exclude_filename: []
+          exclude_match: []
+          follow_symlinks: '0'
+          include_dotfiles: '0'
+          prefix: ''
+          prune_directory: []
+          root: .
+        Dist::Zilla::Plugin::Git::GatherDir:
+          include_untracked: '0'
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@RJBS/Git::GatherDir'
-      version: 2.012
+      version: '2.028'
     -
       class: Dist::Zilla::Plugin::CheckPrereqsIndexed
       name: '@RJBS/CheckPrereqsIndexed'
-      version: 0.008
+      version: '0.013'
     -
       class: Dist::Zilla::Plugin::CheckExtraTests
       name: '@RJBS/CheckExtraTests'
-      version: 0.011
+      version: '0.025'
+    -
+      class: Dist::Zilla::Plugin::PromptIfStale
+      config:
+        Dist::Zilla::Plugin::PromptIfStale:
+          check_all_plugins: 0
+          check_all_prereqs: 0
+          modules:
+            - Dist::Zilla::PluginBundle::RJBS
+          phase: build
+          skip: []
+      name: '@RJBS/RJBS-Outdated'
+      version: '0.032'
+    -
+      class: Dist::Zilla::Plugin::PromptIfStale
+      config:
+        Dist::Zilla::Plugin::PromptIfStale:
+          check_all_plugins: '1'
+          check_all_prereqs: 0
+          modules: []
+          phase: release
+          skip: []
+      name: '@RJBS/CPAN-Outdated'
+      version: '0.032'
     -
       class: Dist::Zilla::Plugin::PruneCruft
       name: '@RJBS/@Filter/PruneCruft'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::ManifestSkip
       name: '@RJBS/@Filter/ManifestSkip'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::MetaYAML
       name: '@RJBS/@Filter/MetaYAML'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::License
       name: '@RJBS/@Filter/License'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::Readme
       name: '@RJBS/@Filter/Readme'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::ExecDir
       name: '@RJBS/@Filter/ExecDir'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::ShareDir
       name: '@RJBS/@Filter/ShareDir'
-      version: 4.300032
-    -
-      class: Dist::Zilla::Plugin::MakeMaker
-      name: '@RJBS/@Filter/MakeMaker'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::Manifest
       name: '@RJBS/@Filter/Manifest'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::TestRelease
       name: '@RJBS/@Filter/TestRelease'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::ConfirmRelease
       name: '@RJBS/@Filter/ConfirmRelease'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::UploadToCPAN
       name: '@RJBS/@Filter/UploadToCPAN'
-      version: 4.300032
+      version: '5.025'
+    -
+      class: Dist::Zilla::Plugin::MakeMaker
+      config:
+        Dist::Zilla::Role::TestRunner:
+          default_jobs: 9
+      name: '@RJBS/MakeMaker'
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::AutoPrereqs
       name: '@RJBS/AutoPrereqs'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::Git::NextVersion
+      config:
+        Dist::Zilla::Plugin::Git::NextVersion:
+          first_version: '0.001'
+          version_by_branch: '0'
+          version_regexp: (?^:^([0-9]+\.[0-9]+)$)
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@RJBS/Git::NextVersion'
-      version: 2.012
+      version: '2.028'
     -
       class: Dist::Zilla::Plugin::PkgVersion
       name: '@RJBS/PkgVersion'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::MetaConfig
       name: '@RJBS/MetaConfig'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::MetaJSON
       name: '@RJBS/MetaJSON'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::NextRelease
       name: '@RJBS/NextRelease'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::Test::ChangesHasContent
       name: '@RJBS/Test::ChangesHasContent'
-      version: 0.006
+      version: '0.007'
     -
       class: Dist::Zilla::Plugin::PodSyntaxTests
       name: '@RJBS/PodSyntaxTests'
-      version: 4.300032
+      version: '5.025'
     -
-      class: Dist::Zilla::Plugin::Test::Compile
-      name: '@RJBS/Test::Compile'
-      version: 2.001
-    -
-      class: Dist::Zilla::Plugin::ReportVersions::Tiny
-      name: '@RJBS/ReportVersions::Tiny'
-      version: 1.08
+      class: Dist::Zilla::Plugin::Test::ReportPrereqs
+      name: '@RJBS/Test::ReportPrereqs'
+      version: '0.019'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -151,31 +197,153 @@ x_Dist_Zilla:
           phase: test
           type: requires
       name: '@RJBS/TestMoreWithSubtests'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::PodWeaver
+      config:
+        Dist::Zilla::Plugin::PodWeaver:
+          config_plugins:
+            - '@RJBS'
+          finder:
+            - ':InstallModules'
+            - ':ExecFiles'
+          plugins:
+            -
+              class: Pod::Weaver::Plugin::EnsurePod5
+              name: '@CorePrep/EnsurePod5'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Plugin::H1Nester
+              name: '@CorePrep/H1Nester'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Plugin::SingleEncoding
+              name: '@RJBS/SingleEncoding'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Name
+              name: '@RJBS/Name'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Version
+              name: '@RJBS/Version'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Region
+              name: '@RJBS/Prelude'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Synopsis'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Description'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Overview'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Generic
+              name: '@RJBS/Stability'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Collect
+              name: Attributes
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Collect
+              name: Methods
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Collect
+              name: Functions
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Leftovers
+              name: '@RJBS/Leftovers'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Region
+              name: '@RJBS/postlude'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Authors
+              name: '@RJBS/Authors'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Section::Legal
+              name: '@RJBS/Legal'
+              version: '4.008'
+            -
+              class: Pod::Weaver::Plugin::Transformer
+              name: '@RJBS/List'
+              version: '4.008'
       name: '@RJBS/PodWeaver'
-      version: 3.101641
+      version: '4.006'
     -
       class: Dist::Zilla::Plugin::GithubMeta
       name: '@RJBS/GithubMeta'
-      version: 0.28
+      version: '0.46'
     -
       class: Dist::Zilla::Plugin::Git::Check
+      config:
+        Dist::Zilla::Plugin::Git::Check:
+          untracked_files: die
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty:
+            - dist.ini
+            - Changes
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@RJBS/@Git/Check'
-      version: 2.012
+      version: '2.028'
     -
       class: Dist::Zilla::Plugin::Git::Commit
+      config:
+        Dist::Zilla::Plugin::Git::Commit:
+          add_files_in: []
+          commit_msg: v%v%n%n%c
+          time_zone: local
+        Dist::Zilla::Role::Git::DirtyFiles:
+          allow_dirty:
+            - dist.ini
+            - Changes
+          allow_dirty_match: []
+          changelog: Changes
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@RJBS/@Git/Commit'
-      version: 2.012
+      version: '2.028'
     -
       class: Dist::Zilla::Plugin::Git::Tag
+      config:
+        Dist::Zilla::Plugin::Git::Tag:
+          branch: ~
+          signed: 0
+          tag: '2.012'
+          tag_format: '%v'
+          tag_message: v%v
+          time_zone: local
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@RJBS/@Git/Tag'
-      version: 2.012
+      version: '2.028'
     -
       class: Dist::Zilla::Plugin::Git::Push
+      config:
+        Dist::Zilla::Plugin::Git::Push:
+          push_to:
+            - 'origin :'
+            - 'github :'
+          remotes_must_exist: 0
+        Dist::Zilla::Role::Git::Repo:
+          repo_root: .
       name: '@RJBS/@Git/Push'
-      version: 2.012
+      version: '2.028'
     -
       class: Dist::Zilla::Plugin::Prereqs
       config:
@@ -183,33 +351,41 @@ x_Dist_Zilla:
           phase: runtime
           type: requires
       name: Prereqs
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':InstallModules'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':IncModules'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':TestFiles'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ExecFiles'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':ShareFiles'
-      version: 4.300032
+      version: '5.025'
     -
       class: Dist::Zilla::Plugin::FinderCode
       name: ':MainModule'
-      version: 4.300032
+      version: '5.025'
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':AllFiles'
+      version: '5.025'
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':NoFiles'
+      version: '5.025'
   zilla:
     class: Dist::Zilla::Dist::Builder
     config:
-      is_trial: 0
-    version: 4.300032
+      is_trial: '0'
+    version: '5.025'
@@ -1,19 +1,19 @@
 
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.025.
 use strict;
 use warnings;
 
 
 
-use ExtUtils::MakeMaker 6.30;
+use ExtUtils::MakeMaker;
 
 
 
 my %WriteMakefileArgs = (
   "ABSTRACT" => "a simple wrapper around Log::Dispatch",
   "AUTHOR" => "Ricardo SIGNES <rjbs\@cpan.org>",
-  "BUILD_REQUIRES" => {},
   "CONFIGURE_REQUIRES" => {
-    "ExtUtils::MakeMaker" => "6.30"
+    "ExtUtils::MakeMaker" => 0
   },
   "DISTNAME" => "Log-Dispatchouli",
   "EXE_FILES" => [],
@@ -39,44 +39,56 @@ my %WriteMakefileArgs = (
     "warnings" => 0
   },
   "TEST_REQUIRES" => {
-    "File::Find" => 0,
+    "ExtUtils::MakeMaker" => 0,
+    "File::Spec" => 0,
+    "File::Spec::Functions" => 0,
     "File::Temp" => 0,
     "Test::Deep" => 0,
     "Test::Fatal" => 0,
     "Test::More" => "0.96",
-    "base" => 0
+    "base" => 0,
+    "lib" => 0
   },
-  "VERSION" => "2.006",
+  "VERSION" => "2.012",
   "test" => {
     "TESTS" => "t/*.t"
   }
 );
 
 
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
-  my $tr = delete $WriteMakefileArgs{TEST_REQUIRES};
-  my $br = $WriteMakefileArgs{BUILD_REQUIRES};
-  for my $mod ( keys %$tr ) {
-    if ( exists $br->{$mod} ) {
-      $br->{$mod} = $tr->{$mod} if $tr->{$mod} > $br->{$mod};
-    }
-    else {
-      $br->{$mod} = $tr->{$mod};
-    }
-  }
-}
+my %FallbackPrereqs = (
+  "Carp" => 0,
+  "ExtUtils::MakeMaker" => 0,
+  "File::Spec" => 0,
+  "File::Spec::Functions" => 0,
+  "File::Temp" => 0,
+  "Log::Dispatch" => 0,
+  "Log::Dispatch::Array" => 0,
+  "Log::Dispatch::File" => 0,
+  "Log::Dispatch::Screen" => 0,
+  "Log::Dispatch::Syslog" => 0,
+  "Params::Util" => 0,
+  "Scalar::Util" => 0,
+  "String::Flogger" => 0,
+  "Sub::Exporter" => 0,
+  "Sub::Exporter::GlobExporter" => "0.002",
+  "Sys::Syslog" => "0.16",
+  "Test::Deep" => 0,
+  "Test::Fatal" => 0,
+  "Test::More" => "0.96",
+  "Try::Tiny" => "0.04",
+  "base" => 0,
+  "lib" => 0,
+  "overload" => 0,
+  "strict" => 0,
+  "warnings" => 0
+);
 
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
-  my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
-  my $pp = $WriteMakefileArgs{PREREQ_PM};
-  for my $mod ( keys %$br ) {
-    if ( exists $pp->{$mod} ) {
-      $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
-    }
-    else {
-      $pp->{$mod} = $br->{$mod};
-    }
-  }
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+  delete $WriteMakefileArgs{TEST_REQUIRES};
+  delete $WriteMakefileArgs{BUILD_REQUIRES};
+  $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
 }
 
 delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
@@ -1,13 +1,15 @@
 
 
 This archive contains the distribution Log-Dispatchouli,
-version 2.006:
+version 2.012:
 
   a simple wrapper around Log::Dispatch
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 
+This README file was generated by Dist::Zilla::Plugin::Readme v5.025.
+
@@ -1,11 +1,8 @@
 use strict;
 use warnings;
 package Log::Dispatchouli::Global;
-{
-  $Log::Dispatchouli::Global::VERSION = '2.006';
-}
 # ABSTRACT: a system for sharing a global, dynamically-scoped logger
-
+$Log::Dispatchouli::Global::VERSION = '2.012';
 use Carp ();
 use Log::Dispatchouli;
 use Scalar::Util ();
@@ -17,6 +14,84 @@ use Sub::Exporter -setup => {
   },
 };
 
+#pod =head1 DESCRIPTION
+#pod
+#pod B<Warning>: This interface is still experimental.
+#pod
+#pod Log::Dispatchouli::Global is a framework for a global logger object. In your
+#pod top-level programs that are actually executed, you'd add something like this:
+#pod
+#pod   use Log::Dispatchouli::Global '$Logger' => {
+#pod     init => {
+#pod       ident     => 'My::Daemon',
+#pod       facility  => 'local2',
+#pod       to_stdout => 1,
+#pod     },
+#pod   };
+#pod
+#pod This will import a C<$Logger> into your program, and more importantly will
+#pod initialize it with a new L<Log::Dispatchouli> object created by passing the
+#pod value for the C<init> parameter to Log::Dispatchouli's C<new> method.
+#pod
+#pod Much of the rest of your program, across various libraries, can then just use
+#pod this:
+#pod
+#pod   use Log::Dispatchouli::Global '$Logger';
+#pod
+#pod   sub whatever {
+#pod     ...
+#pod
+#pod     $Logger->log("about to do something");
+#pod
+#pod     local $Logger = $Logger->proxy({ proxy_prefix => "whatever: " });
+#pod
+#pod     for (@things) {
+#pod       $Logger->log([ "doing thing %s", $_ ]);
+#pod       ...
+#pod     }
+#pod   }
+#pod
+#pod This eliminates the need to pass around what is effectively a global, while
+#pod still allowing it to be specialized within certain contexts of your program.
+#pod
+#pod B<Warning!>  Although you I<could> just use Log::Dispatchouli::Global as your
+#pod shared logging library, you almost I<certainly> want to write a subclass that
+#pod will only be shared amongst your application's classes.
+#pod Log::Dispatchouli::Global is meant to be subclassed and shared only within
+#pod controlled systems.  Remember, I<sharing your state with code you don't
+#pod control is dangerous>.
+#pod
+#pod =head1 USING
+#pod
+#pod In general, you will either be using a Log::Dispatchouli::Global class to get
+#pod a C<$Logger> or to initialize it (and then get C<$Logger>).  These are both
+#pod demonstrated above.  Also, when importing C<$Logger> you may request it be
+#pod imported under a different name:
+#pod
+#pod   use Log::Dispatchouli::Global '$Logger' => { -as => 'L' };
+#pod
+#pod   $L->log( ... );
+#pod
+#pod There is only one class method that you are likely to use: C<current_logger>.
+#pod This provides the value of the shared logger from the caller's context,
+#pod initializing it to a default if needed.  Even this method is unlikely to be
+#pod required frequently, but it I<does> allow users to I<see> C<$Logger> without
+#pod importing it.
+#pod
+#pod =head1 SUBCLASSING
+#pod
+#pod Before using Log::Dispatchouli::Global in your application, you should subclass
+#pod it.  When you subclass it, you should provide the following methods:
+#pod
+#pod =head2 logger_globref
+#pod
+#pod This method should return a globref in which the shared logger will be stored.
+#pod Subclasses will be in their own package, so barring any need for cleverness,
+#pod every implementation of this method can look like the following:
+#pod
+#pod   sub logger_globref { no warnings 'once'; return \*Logger }
+#pod
+#pod =cut
 
 sub logger_globref {
   no warnings 'once';
@@ -35,6 +110,15 @@ sub current_logger {
   return $$$globref;
 }
 
+#pod =head2 default_logger
+#pod
+#pod If no logger has been initialized, but something tries to log, it gets the
+#pod default logger, created by calling this method.
+#pod
+#pod The default implementation calls C<new> on the C<default_logger_class> with the
+#pod result of C<default_logger_args> as the arguments.
+#pod
+#pod =cut
 
 sub default_logger {
   my ($self) = @_;
@@ -46,9 +130,27 @@ sub default_logger {
   );
 }
 
+#pod =head2 default_logger_class
+#pod
+#pod This returns the class on which C<new> will be called when initializing a
+#pod logger, either from the C<init> argument when importing or the default logger.
+#pod
+#pod Its default value is Log::Dispatchouli.
+#pod
+#pod =cut
 
 sub default_logger_class { 'Log::Dispatchouli' }
 
+#pod =head2 default_logger_args
+#pod
+#pod If no logger has been initialized, but something tries to log, it gets the
+#pod default logger, created by calling C<new> on the C<default_logger_class> and
+#pod passing the results of calling this method.
+#pod
+#pod Its default return value creates a sink, so that anything logged without an
+#pod initialized logger is lost.
+#pod
+#pod =cut
 
 sub default_logger_args {
   return {
@@ -57,6 +159,22 @@ sub default_logger_args {
   }
 }
 
+#pod =head2 default_logger_ref
+#pod
+#pod This method returns a scalar reference in which the cached default value is
+#pod stored for comparison.  This is used when someone tries to C<init> the global.
+#pod When someone tries to initialize the global logger, and it's already set, then:
+#pod
+#pod =for :list
+#pod * if the current value is the same as the default, the new value is set
+#pod * if the current value is I<not> the same as the default, we die
+#pod
+#pod Since you want the default to be isolated to your application's logger, the
+#pod default behavior is default loggers are associated with the glob reference to
+#pod which the default might be assigned.  It is unlikely that you will need to
+#pod interact with this method.
+#pod
+#pod =cut
 
 my %default_logger_for_glob;
 
@@ -118,6 +236,35 @@ sub _build_logger {
   return $globref;
 }
 
+#pod =head1 COOKBOOK
+#pod
+#pod =head2 Common Logger Recipes
+#pod
+#pod Say you often use the same configuration for one kind of program, like
+#pod automated tests.  You've already written your own subclass to get your own
+#pod storage and defaults, maybe C<MyApp::Logger>.
+#pod
+#pod You can't just write a subclass with a different default, because if another
+#pod class using the same global has set the global with I<its> default, yours won't
+#pod be honored.  You don't just want this new value to be the default, you want it
+#pod to be I<the> logger.  What you want to do in this case is to initialize your
+#pod logger normally, then reexport it, like this:
+#pod
+#pod   package MyApp::Logger::Test;
+#pod   use parent 'MyApp::Logger';
+#pod
+#pod   use MyApp::Logger '$Logger' => {
+#pod     init => {
+#pod       ident    => "Tester($0)",
+#pod       to_self  => 1,
+#pod       facility => undef,
+#pod     },
+#pod   };
+#pod
+#pod This will set up the logger and re-export it, and will properly die if anything
+#pod else attempts to initialize the logger to something else.
+#pod
+#pod =cut
 
 1;
 
@@ -125,13 +272,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Log::Dispatchouli::Global - a system for sharing a global, dynamically-scoped logger
 
 =head1 VERSION
 
-version 2.006
+version 2.012
 
 =head1 DESCRIPTION
 
@@ -171,7 +320,7 @@ this:
   }
 
 This eliminates the need to pass around what is effectively a global, while
-still allowing it to be specialized withing certain contexts of your program.
+still allowing it to be specialized within certain contexts of your program.
 
 B<Warning!>  Although you I<could> just use Log::Dispatchouli::Global as your
 shared logging library, you almost I<certainly> want to write a subclass that
@@ -254,12 +403,8 @@ if the current value is I<not> the same as the default, we die
 
 Since you want the default to be isolated to your application's logger, the
 default behavior is default loggers are associated with the glob reference to
-which the default might be assigned.  It is recommended that you replace this
-method to return a shared, private variable for your subclasses, by putting the
-following code in the base class for your Log::Dispatchouli::Global classes:
-
-  my $default_logger;
-  sub default_logger_ref { \$default_logger };
+which the default might be assigned.  It is unlikely that you will need to
+interact with this method.
 
 =head1 COOKBOOK
 
@@ -295,7 +440,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,30 @@
 use strict;
 use warnings;
 package Log::Dispatchouli::Proxy;
-{
-  $Log::Dispatchouli::Proxy::VERSION = '2.006';
-}
 # ABSTRACT: a simple wrapper around Log::Dispatch
-
+$Log::Dispatchouli::Proxy::VERSION = '2.012';
 use Params::Util qw(_ARRAY0 _HASH0);
 
+#pod =head1 DESCRIPTION
+#pod
+#pod A Log::Dispatchouli::Proxy object is the child of a L<Log::Dispatchouli> logger
+#pod (or another proxy) and relays log messages to its parent.  It behaves almost
+#pod identically to a Log::Dispatchouli logger, and you should refer there for more
+#pod of its documentation.
+#pod
+#pod Here are the differences:
+#pod
+#pod =begin :list
+#pod
+#pod * You can't create a proxy with C<< ->new >>, only by calling C<< ->proxy >> on an existing logger or proxy.
+#pod
+#pod * C<set_debug> will set a value for the proxy; if none is set, C<get_debug> will check the parent's setting; C<clear_debug> will clear any set value on this proxy
+#pod
+#pod * C<log_debug> messages will be redispatched to C<log> (bug to the 'debug' logging level) to prevent parent loggers from dropping them due to C<debug> setting differences
+#pod
+#pod =end :list
+#pod
+#pod =cut
 
 sub _new {
   my ($class, $arg) = @_;
@@ -119,13 +136,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Log::Dispatchouli::Proxy - a simple wrapper around Log::Dispatch
 
 =head1 VERSION
 
-version 2.006
+version 2.012
 
 =head1 DESCRIPTION
 
@@ -158,7 +177,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,8 @@
 use strict;
 use warnings;
 package Log::Dispatchouli;
-{
-  $Log::Dispatchouli::VERSION = '2.006';
-}
 # ABSTRACT: a simple wrapper around Log::Dispatch
-
+$Log::Dispatchouli::VERSION = '2.012';
 use Carp ();
 use File::Spec ();
 use Log::Dispatch;
@@ -14,8 +11,124 @@ use Scalar::Util qw(blessed weaken);
 use String::Flogger;
 use Try::Tiny 0.04;
 
+require Log::Dispatchouli::Proxy;
+
 our @CARP_NOT = qw(Log::Dispatchouli::Proxy);
 
+#pod =head1 SYNOPSIS
+#pod
+#pod   my $logger = Log::Dispatchouli->new({
+#pod     ident     => 'stuff-purger',
+#pod     facility  => 'daemon',
+#pod     to_stdout => $opt->{print},
+#pod     debug     => $opt->{verbose}
+#pod   });
+#pod
+#pod   $logger->log([ "There are %s items left to purge...", $stuff_left ]);
+#pod
+#pod   $logger->log_debug("this is extra often-ignored debugging log");
+#pod
+#pod   $logger->log_fatal("Now we will die!!");
+#pod
+#pod =head1 DESCRIPTION
+#pod
+#pod Log::Dispatchouli is a thin layer above L<Log::Dispatch> and meant to make it
+#pod dead simple to add logging to a program without having to think much about
+#pod categories, facilities, levels, or things like that.  It is meant to make
+#pod logging just configurable enough that you can find the logs you want and just
+#pod easy enough that you will actually log things.
+#pod
+#pod Log::Dispatchouli can log to syslog (if you specify a facility), standard error
+#pod or standard output, to a file, or to an array in memory.  That last one is
+#pod mostly useful for testing.
+#pod
+#pod In addition to providing as simple a way to get a handle for logging
+#pod operations, Log::Dispatchouli uses L<String::Flogger> to process the things to
+#pod be logged, meaning you can easily log data structures.  Basically: strings are
+#pod logged as is, arrayrefs are taken as (sprintf format, args), and subroutines
+#pod are called only if needed.  For more information read the L<String::Flogger>
+#pod docs.
+#pod
+#pod =head1 LOGGER PREFIX
+#pod
+#pod Log messages may be prepended with information to set context.  This can be set
+#pod at a logger level or per log item.  The simplest example is:
+#pod
+#pod   my $logger = Log::Dispatchouli->new( ... );
+#pod
+#pod   $logger->set_prefix("Batch 123: ");
+#pod
+#pod   $logger->log("begun processing");
+#pod
+#pod   # ...
+#pod
+#pod   $logger->log("finished processing");
+#pod
+#pod The above will log something like:
+#pod
+#pod   Batch 123: begun processing
+#pod   Batch 123: finished processing
+#pod
+#pod To pass a prefix per-message:
+#pod
+#pod   $logger->log({ prefix => 'Sub-Item 234: ' }, 'error!')
+#pod
+#pod   # Logs: Batch 123: Sub-Item 234: error!
+#pod
+#pod If the prefix is a string, it is prepended to each line of the message.  If it
+#pod is a coderef, it is called and passed the message to be logged.  The return
+#pod value is logged instead.
+#pod
+#pod L<Proxy loggers|/METHODS FOR PROXY LOGGERS> also have their own prefix
+#pod settings, which accumulate.  So:
+#pod
+#pod   my $proxy = $logger->proxy({ proxy_prefix => 'Subsystem 12: ' });
+#pod
+#pod   $proxy->set_prefix('Page 9: ');
+#pod
+#pod   $proxy->log({ prefix => 'Paragraph 6: ' }, 'Done.');
+#pod
+#pod ...will log...
+#pod
+#pod   Batch 123: Subsystem 12: Page 9: Paragraph 6: Done.
+#pod
+#pod =method new
+#pod
+#pod   my $logger = Log::Dispatchouli->new(\%arg);
+#pod
+#pod This returns a new logger, a Log::Dispatchouli object.
+#pod
+#pod Valid arguments are:
+#pod
+#pod   ident       - the name of the thing logging (mandatory)
+#pod   to_self     - log to the logger object for testing; default: false
+#pod   to_stdout   - log to STDOUT; default: false
+#pod   to_stderr   - log to STDERR; default: false
+#pod   facility    - to which syslog facility to send logs; default: none
+#pod
+#pod   to_file     - log to PROGRAM_NAME.YYYYMMDD in the log path; default: false
+#pod   log_file    - a leaf name for the file to log to with to_file
+#pod   log_path    - path in which to log to file; defaults to DISPATCHOULI_PATH
+#pod                 environment variable or, failing that, to your system's tmpdir
+#pod
+#pod   file_format - this optional coderef is passed the message to be logged
+#pod                 and returns the text to write out
+#pod
+#pod   log_pid     - if true, prefix all log entries with the pid; default: true
+#pod   fail_fatal  - a boolean; if true, failure to log is fatal; default: true
+#pod   muted       - a boolean; if true, only fatals are logged; default: false
+#pod   debug       - a boolean; if true, log_debug method is not a no-op
+#pod                 defaults to the truth of the DISPATCHOULI_DEBUG env var
+#pod   quiet_fatal - 'stderr' or 'stdout' or an arrayref of zero, one, or both
+#pod                 fatal log messages will not be logged to these
+#pod                 (default: stderr)
+#pod   config_id   - a name for this logger's config; rarely needed!
+#pod
+#pod The log path is either F</tmp> or the value of the F<DISPATCHOULI_PATH> env var.
+#pod
+#pod If the F<DISPATCHOULI_NOSYSLOG> env var is true, we don't log to syslog.
+#pod
+#pod =cut
 
 sub new {
   my ($class, $arg) = @_;
@@ -38,21 +151,27 @@ sub new {
   my $self = bless {} => $class;
 
   my $log = Log::Dispatch->new(
-    callbacks => sub {
-      return( ($pid_prefix ? "[$$] " : '') . {@_}->{message})
-    },
+    $pid_prefix
+    ? (
+        callbacks => sub {
+	  "[$$] ". {@_}->{message}
+	},
+      )
+    : ()
   );
 
   if ($arg->{to_file}) {
     require Log::Dispatch::File;
     my $log_file = File::Spec->catfile(
       ($arg->{log_path} || $self->env_value('PATH') || File::Spec->tmpdir),
-      $arg->{log_file} || sprintf('%s.%04u%02u%02u',
-        $ident,
-        ((localtime)[5] + 1900),
-        sprintf('%02d', (localtime)[4] + 1),
-        sprintf('%02d', (localtime)[3]),
-      )
+      $arg->{log_file} || do {
+        my @time = localtime;
+        sprintf('%s.%04u%02u%02u',
+          $ident,
+          $time[5] + 1900,
+          $time[4] + 1,
+          $time[3])
+      }
     );
 
     $log->add(
@@ -61,11 +180,15 @@ sub new {
         min_level => 'debug',
         filename  => $log_file,
         mode      => 'append',
-        callbacks => sub {
-          # The time format returned here is subject to change. -- rjbs,
-          # 2008-11-21
-          return (localtime) . ' ' . {@_}->{message} . "\n"
-        }
+        callbacks => do {
+          if (my $format = $arg->{file_format}) {
+            sub { $format->({@_}->{message}) }
+          } else {
+            # The time format returned here is subject to change. -- rjbs,
+            # 2008-11-21
+            sub { (localtime) . ' ' . {@_}->{message} . "\n" }
+          }
+        },
       )
     );
   }
@@ -130,6 +253,21 @@ sub new {
   return $self;
 }
 
+#pod =method log
+#pod
+#pod   $logger->log(@messages);
+#pod
+#pod   $logger->log(\%arg, @messages);
+#pod
+#pod This method uses L<String::Flogger> on the input, then logs the result.  Each
+#pod message is flogged individually, then joined with spaces.
+#pod
+#pod If the first argument is a hashref, it will be used as extra arguments to
+#pod logging.  It may include a C<prefix> entry to preprocess the message by
+#pod prepending a string (if the prefix is a string) or calling a subroutine to
+#pod generate a new message (if the prefix is a coderef).
+#pod
+#pod =cut
 
 sub _join { shift; join q{ }, @{ $_[0] } }
 
@@ -172,6 +310,16 @@ sub log {
   return;
 }
 
+#pod =method log_fatal
+#pod
+#pod This behaves like the C<log> method, but will throw the logged string as an
+#pod exception after logging.
+#pod
+#pod This method can also be called as C<fatal>, to match other popular logging
+#pod interfaces.  B<If you want to override this method, you must override
+#pod C<log_fatal> and not C<fatal>>.
+#pod
+#pod =cut
 
 sub log_fatal {
   my ($self, @rest) = @_;
@@ -184,6 +332,16 @@ sub log_fatal {
   $self->log($arg, @rest);
 }
 
+#pod =method log_debug
+#pod
+#pod This behaves like the C<log> method, but will only log (at the debug level) if
+#pod the logger object has its debug property set to true.
+#pod
+#pod This method can also be called as C<debug>, to match other popular logging
+#pod interfaces.  B<If you want to override this method, you must override
+#pod C<log_debug> and not C<debug>>.
+#pod
+#pod =cut
 
 sub log_debug {
   my ($self, @rest) = @_;
@@ -197,49 +355,150 @@ sub log_debug {
   $self->log($arg, @rest);
 }
 
+#pod =method set_debug
+#pod
+#pod   $logger->set_debug($bool);
+#pod
+#pod This sets the logger's debug property, which affects the behavior of
+#pod C<log_debug>.
+#pod
+#pod =cut
 
 sub set_debug {
   return($_[0]->{debug} = $_[1] ? 1 : 0);
 }
 
+#pod =method get_debug
+#pod
+#pod This gets the logger's debug property, which affects the behavior of
+#pod C<log_debug>.
+#pod
+#pod =cut
 
 sub get_debug { return $_[0]->{debug} }
 
+#pod =method clear_debug
+#pod
+#pod This method does nothing, and is only useful for L<Log::Dispatchouli::Proxy>
+#pod objects.  See L<Methods for Proxy Loggers|/METHODS FOR PROXY LOGGERS>, below.
+#pod
+#pod =cut
 
 sub clear_debug { }
 
 sub mute   { $_[0]{muted} = 1 }
 sub unmute { $_[0]{muted} = 0 }
 
+#pod =method set_muted
+#pod
+#pod   $logger->set_muted($bool);
+#pod
+#pod This sets the logger's muted property, which affects the behavior of
+#pod C<log>.
+#pod
+#pod =cut
 
 sub set_muted {
   return($_[0]->{muted} = $_[1] ? 1 : 0);
 }
 
+#pod =method get_muted
+#pod
+#pod This gets the logger's muted property, which affects the behavior of
+#pod C<log>.
+#pod
+#pod =cut
 
 sub get_muted { return $_[0]->{muted} }
 
+#pod =method clear_muted
+#pod
+#pod This method does nothing, and is only useful for L<Log::Dispatchouli::Proxy>
+#pod objects.  See L<Methods for Proxy Loggers|/METHODS FOR PROXY LOGGERS>, below.
+#pod
+#pod =cut
 
 sub clear_muted { }
 
+#pod =method get_prefix
+#pod
+#pod   my $prefix = $logger->get_prefix;
+#pod
+#pod This method returns the currently-set prefix for the logger, which may be a
+#pod string or code reference or undef.  See L<Logger Prefix|/LOGGER PREFIX>.
+#pod
+#pod =method set_prefix
+#pod
+#pod   $logger->set_prefix( $new_prefix );
+#pod
+#pod This method changes the prefix.  See L<Logger Prefix|/LOGGER PREFIX>.
+#pod
+#pod =method clear_prefix
+#pod
+#pod This method clears any set logger prefix.  (It can also be called as
+#pod C<unset_prefix>, but this is deprecated.  See L<Logger Prefix|/LOGGER PREFIX>.
+#pod
+#pod =cut
 
 sub get_prefix   { return $_[0]->{prefix}  }
 sub set_prefix   { $_[0]->{prefix} = $_[1] }
 sub clear_prefix { $_[0]->unset_prefix     }
 sub unset_prefix { undef $_[0]->{prefix}   }
 
+#pod =method ident
+#pod
+#pod This method returns the logger's ident.
+#pod
+#pod =cut
 
 sub ident { $_[0]{ident} }
 
+#pod =method config_id
+#pod
+#pod This method returns the logger's configuration id, which defaults to its ident.
+#pod This can be used to make two loggers equivalent in Log::Dispatchouli::Global so
+#pod that trying to reinitialize with a new logger with the same C<config_id> as the
+#pod current logger will not throw an exception, and will simply do no thing.
+#pod
+#pod =cut
 
 sub config_id { $_[0]{config_id} }
 
+#pod =head1 METHODS FOR SUBCLASSING
+#pod
+#pod =head2 string_flogger
+#pod
+#pod This method returns the thing on which F<flog> will be called to format log
+#pod messages.  By default, it just returns C<String::Flogger>
+#pod
+#pod =cut
 
 sub string_flogger { 'String::Flogger' }
 
+#pod =head2 env_prefix
+#pod
+#pod This method should return a string used as a prefix to find environment
+#pod variables that affect the logger's behavior.  For example, if this method
+#pod returns C<XYZZY> then when checking the environment for a default value for the
+#pod C<debug> parameter, Log::Dispatchouli will first check C<XYZZY_DEBUG>, then
+#pod C<DISPATCHOULI_DEBUG>.
+#pod
+#pod By default, this method returns C<()>, which means no extra environment
+#pod variable is checked.
+#pod
+#pod =cut
 
 sub env_prefix { return; }
 
+#pod =head2 env_value
+#pod
+#pod   my $value = $logger->env_value('DEBUG');
+#pod
+#pod This method returns the value for the environment variable suffix given.  For
+#pod example, the example given, calling with C<DEBUG> will check
+#pod C<DISPATCHOULI_DEBUG>.
+#pod
+#pod =cut
 
 sub env_value {
   my ($self, $suffix) = @_;
@@ -254,6 +513,19 @@ sub env_value {
   return;
 }
 
+#pod =head1 METHODS FOR TESTING
+#pod
+#pod =head2 new_tester
+#pod
+#pod   my $logger = Log::Dispatchouli->new_tester( \%arg );
+#pod
+#pod This returns a new logger that logs only C<to_self>.  It's useful in testing.
+#pod If no C<ident> arg is provided, one will be generated.  C<log_pid> is off by
+#pod default, but can be overridden.
+#pod
+#pod C<\%arg> is optional.
+#pod
+#pod =cut
 
 sub new_tester {
   my ($class, $arg) = @_;
@@ -271,6 +543,12 @@ sub new_tester {
   });
 }
 
+#pod =head2 events
+#pod
+#pod This method returns the arrayref of events logged to an array in memory (in the
+#pod logger).  If the logger is not logging C<to_self> this raises an exception.
+#pod
+#pod =cut
 
 sub events {
   Carp::confess "->events called on a logger not logging to self"
@@ -279,6 +557,12 @@ sub events {
   return $_[0]->{events};
 }
 
+#pod =head2 clear_events
+#pod
+#pod This method empties the current sequence of events logged into an array in
+#pod memory.  If the logger is not logging C<to_self> this raises an exception.
+#pod
+#pod =cut
 
 sub clear_events {
   Carp::confess "->events called on a logger not logging to self"
@@ -288,6 +572,27 @@ sub clear_events {
   return;
 }
 
+#pod =head1 METHODS FOR PROXY LOGGERS
+#pod
+#pod =head2 proxy
+#pod
+#pod   my $proxy_logger = $logger->proxy( \%arg );
+#pod
+#pod This method returns a new proxy logger -- an instance of
+#pod L<Log::Dispatchouli::Proxy> -- which will log through the given logger, but
+#pod which may have some settings localized.
+#pod
+#pod C<%arg> is optional.  It may contain the following entries:
+#pod
+#pod =for :list
+#pod = proxy_prefix
+#pod This is a prefix that will be applied to anything the proxy logger logs, and
+#pod cannot be changed.
+#pod = debug
+#pod This can be set to true or false to change the proxy's "am I in debug mode?"
+#pod setting.  It can be changed or cleared later on the proxy.
+#pod
+#pod =cut
 
 sub proxy {
   my ($self, $arg) = @_;
@@ -302,13 +607,58 @@ sub proxy {
   });
 }
 
+#pod =head2 parent
+#pod
+#pod =head2 logger
+#pod
+#pod These methods return the logger itself.  (They're more useful when called on
+#pod proxy loggers.)
+#pod
+#pod =cut
 
 sub parent { $_[0] }
 sub logger { $_[0] }
 
+#pod =method dispatcher
+#pod
+#pod This returns the underlying Log::Dispatch object.  This is not the method
+#pod you're looking for.  Move along.
+#pod
+#pod =cut
 
 sub dispatcher   { $_[0]->{dispatcher} }
 
+#pod =head1 METHODS FOR API COMPATIBILITY
+#pod
+#pod To provide compatibility with some other loggers, most specifically
+#pod L<Log::Contextual>, the following methods are provided.  You should not use
+#pod these methods without a good reason, and you should never subclass them.
+#pod Instead, subclass the methods they call.
+#pod
+#pod =begin :list
+#pod
+#pod = is_debug
+#pod
+#pod This method calls C<get_debug>.
+#pod
+#pod = is_info
+#pod
+#pod = is_fatal
+#pod
+#pod These methods return true.
+#pod
+#pod = info
+#pod
+#pod = fatal
+#pod
+#pod = debug
+#pod
+#pod These methods redispatch to C<log>, C<log_fatal>, and C<log_debug>
+#pod respectively.
+#pod
+#pod =end :list
+#pod
+#pod =cut
 
 sub is_debug { $_[0]->get_debug }
 sub is_info  { 1 }
@@ -323,6 +673,13 @@ use overload
   fallback => 1,
 ;
 
+#pod =head1 SEE ALSO
+#pod
+#pod =for :list
+#pod * L<Log::Dispatch>
+#pod * L<String::Flogger>
+#pod
+#pod =cut
 
 1;
 
@@ -330,13 +687,15 @@ __END__
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 Log::Dispatchouli - a simple wrapper around Log::Dispatch
 
 =head1 VERSION
 
-version 2.006
+version 2.012
 
 =head1 SYNOPSIS
 
@@ -345,7 +704,7 @@ version 2.006
     facility  => 'daemon',
     to_stdout => $opt->{print},
     debug     => $opt->{verbose}
-  })
+  });
 
   $logger->log([ "There are %s items left to purge...", $stuff_left ]);
 
@@ -393,6 +752,9 @@ Valid arguments are:
   log_path    - path in which to log to file; defaults to DISPATCHOULI_PATH
                 environment variable or, failing that, to your system's tmpdir
 
+  file_format - this optional coderef is passed the message to be logged
+                and returns the text to write out
+
   log_pid     - if true, prefix all log entries with the pid; default: true
   fail_fatal  - a boolean; if true, failure to log is fatal; default: true
   muted       - a boolean; if true, only fatals are logged; default: false
@@ -529,7 +891,7 @@ The above will log something like:
 
 To pass a prefix per-message:
 
-  $logger->log({ prefix => 'Sub-Item 234: ', 'error!' })
+  $logger->log({ prefix => 'Sub-Item 234: ' }, 'error!')
 
   # Logs: Batch 123: Sub-Item 234: error!
 
@@ -681,7 +1043,7 @@ Ricardo SIGNES <rjbs@cpan.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is copyright (c) 2013 by Ricardo SIGNES.
+This software is copyright (c) 2014 by Ricardo SIGNES.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -1,74 +0,0 @@
-#!perl
-
-use strict;
-use warnings;
-
-use Test::More;
-
-
-
-use File::Find;
-use File::Temp qw{ tempdir };
-
-my @modules;
-find(
-  sub {
-    return if $File::Find::name !~ /\.pm\z/;
-    my $found = $File::Find::name;
-    $found =~ s{^lib/}{};
-    $found =~ s{[/\\]}{::}g;
-    $found =~ s/\.pm$//;
-    # nothing to skip
-    push @modules, $found;
-  },
-  'lib',
-);
-
-sub _find_scripts {
-    my $dir = shift @_;
-
-    my @found_scripts = ();
-    find(
-      sub {
-        return unless -f;
-        my $found = $File::Find::name;
-        # nothing to skip
-        open my $FH, '<', $_ or do {
-          note( "Unable to open $found in ( $! ), skipping" );
-          return;
-        };
-        my $shebang = <$FH>;
-        return unless $shebang =~ /^#!.*?\bperl\b\s*$/;
-        push @found_scripts, $found;
-      },
-      $dir,
-    );
-
-    return @found_scripts;
-}
-
-my @scripts;
-do { push @scripts, _find_scripts($_) if -d $_ }
-    for qw{ bin script scripts };
-
-my $plan = scalar(@modules) + scalar(@scripts);
-$plan ? (plan tests => $plan) : (plan skip_all => "no tests to run");
-
-{
-    # fake home for cpan-testers
-    # no fake requested ## local $ENV{HOME} = tempdir( CLEANUP => 1 );
-
-    like( qx{ $^X -Ilib -e "require $_; print '$_ ok'" }, qr/^\s*$_ ok/s, "$_ loaded ok" )
-        for sort @modules;
-
-    SKIP: {
-        eval "use Test::Script 1.05; 1;";
-        skip "Test::Script needed to test script compilation", scalar(@scripts) if $@;
-        foreach my $file ( @scripts ) {
-            my $script = $file;
-            $script =~ s!.*/!!;
-            script_compiles( $file, "$script script compiles" );
-        }
-    }
-
-}
@@ -0,0 +1,51 @@
+do { my $x = {
+       'configure' => {
+                        'requires' => {
+                                        'ExtUtils::MakeMaker' => '0'
+                                      }
+                      },
+       'develop' => {
+                      'requires' => {
+                                      'Test::Pod' => '1.41'
+                                    }
+                    },
+       'runtime' => {
+                      'requires' => {
+                                      'Carp' => '0',
+                                      'File::Spec' => '0',
+                                      'Log::Dispatch' => '0',
+                                      'Log::Dispatch::Array' => '0',
+                                      'Log::Dispatch::File' => '0',
+                                      'Log::Dispatch::Screen' => '0',
+                                      'Log::Dispatch::Syslog' => '0',
+                                      'Params::Util' => '0',
+                                      'Scalar::Util' => '0',
+                                      'String::Flogger' => '0',
+                                      'Sub::Exporter' => '0',
+                                      'Sub::Exporter::GlobExporter' => '0.002',
+                                      'Sys::Syslog' => '0.16',
+                                      'Try::Tiny' => '0.04',
+                                      'overload' => '0',
+                                      'strict' => '0',
+                                      'warnings' => '0'
+                                    }
+                    },
+       'test' => {
+                   'recommends' => {
+                                     'CPAN::Meta' => '2.120900'
+                                   },
+                   'requires' => {
+                                   'ExtUtils::MakeMaker' => '0',
+                                   'File::Spec' => '0',
+                                   'File::Spec::Functions' => '0',
+                                   'File::Temp' => '0',
+                                   'Test::Deep' => '0',
+                                   'Test::Fatal' => '0',
+                                   'Test::More' => '0.96',
+                                   'base' => '0',
+                                   'lib' => '0'
+                                 }
+                 }
+     };
+  $x;
+ }
\ No newline at end of file
@@ -0,0 +1,176 @@
+#!perl
+
+use strict;
+use warnings;
+
+# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019
+
+use Test::More tests => 1;
+
+use ExtUtils::MakeMaker;
+use File::Spec;
+
+# from $version::LAX
+my $lax_version_re =
+    qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )?
+            |
+            (?:\.[0-9]+) (?:_[0-9]+)?
+        ) | (?:
+            v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )?
+            |
+            (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)?
+        )
+    )/x;
+
+# hide optional CPAN::Meta modules from prereq scanner
+# and check if they are available
+my $cpan_meta = "CPAN::Meta";
+my $cpan_meta_pre = "CPAN::Meta::Prereqs";
+my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic
+
+# Verify requirements?
+my $DO_VERIFY_PREREQS = 1;
+
+sub _max {
+    my $max = shift;
+    $max = ( $_ > $max ) ? $_ : $max for @_;
+    return $max;
+}
+
+sub _merge_prereqs {
+    my ($collector, $prereqs) = @_;
+
+    # CPAN::Meta::Prereqs object
+    if (ref $collector eq $cpan_meta_pre) {
+        return $collector->with_merged_prereqs(
+            CPAN::Meta::Prereqs->new( $prereqs )
+        );
+    }
+
+    # Raw hashrefs
+    for my $phase ( keys %$prereqs ) {
+        for my $type ( keys %{ $prereqs->{$phase} } ) {
+            for my $module ( keys %{ $prereqs->{$phase}{$type} } ) {
+                $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module};
+            }
+        }
+    }
+
+    return $collector;
+}
+
+my @include = qw(
+
+);
+
+my @exclude = qw(
+
+);
+
+# Add static prereqs to the included modules list
+my $static_prereqs = do 't/00-report-prereqs.dd';
+
+# Merge all prereqs (either with ::Prereqs or a hashref)
+my $full_prereqs = _merge_prereqs(
+    ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ),
+    $static_prereqs
+);
+
+# Add dynamic prereqs to the included modules list (if we can)
+my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml';
+if ( $source && $HAS_CPAN_META ) {
+    if ( my $meta = eval { CPAN::Meta->load_file($source) } ) {
+        $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs);
+    }
+}
+else {
+    $source = 'static metadata';
+}
+
+my @full_reports;
+my @dep_errors;
+my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs;
+
+# Add static includes into a fake section
+for my $mod (@include) {
+    $req_hash->{other}{modules}{$mod} = 0;
+}
+
+for my $phase ( qw(configure build test runtime develop other) ) {
+    next unless $req_hash->{$phase};
+    next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING});
+
+    for my $type ( qw(requires recommends suggests conflicts modules) ) {
+        next unless $req_hash->{$phase}{$type};
+
+        my $title = ucfirst($phase).' '.ucfirst($type);
+        my @reports = [qw/Module Want Have/];
+
+        for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) {
+            next if $mod eq 'perl';
+            next if grep { $_ eq $mod } @exclude;
+
+            my $file = $mod;
+            $file =~ s{::}{/}g;
+            $file .= ".pm";
+            my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC;
+
+            my $want = $req_hash->{$phase}{$type}{$mod};
+            $want = "undef" unless defined $want;
+            $want = "any" if !$want && $want == 0;
+
+            my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required";
+
+            if ($prefix) {
+                my $have = MM->parse_version( File::Spec->catfile($prefix, $file) );
+                $have = "undef" unless defined $have;
+                push @reports, [$mod, $want, $have];
+
+                if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) {
+                    if ( $have !~ /\A$lax_version_re\z/ ) {
+                        push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)";
+                    }
+                    elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) {
+                        push @dep_errors, "$mod version '$have' is not in required range '$want'";
+                    }
+                }
+            }
+            else {
+                push @reports, [$mod, $want, "missing"];
+
+                if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) {
+                    push @dep_errors, "$mod is not installed ($req_string)";
+                }
+            }
+        }
+
+        if ( @reports ) {
+            push @full_reports, "=== $title ===\n\n";
+
+            my $ml = _max( map { length $_->[0] } @reports );
+            my $wl = _max( map { length $_->[1] } @reports );
+            my $hl = _max( map { length $_->[2] } @reports );
+            splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl];
+
+            push @full_reports, map { sprintf("    %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports;
+            push @full_reports, "\n";
+        }
+    }
+}
+
+if ( @full_reports ) {
+    diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports;
+}
+
+if ( @dep_errors ) {
+    diag join("\n",
+        "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n",
+        "The following REQUIRED prerequisites were not satisfied:\n",
+        @dep_errors,
+        "\n"
+    );
+}
+
+pass;
+
+# vim: ts=4 sts=4 sw=4 et:
@@ -1,95 +0,0 @@
-use strict;
-use warnings;
-use Test::More 0.88;
-# This is a relatively nice way to avoid Test::NoWarnings breaking our
-# expectations by adding extra tests, without using no_plan.  It also helps
-# avoid any other test module that feels introducing random tests, or even
-# test plans, is a nice idea.
-our $success = 0;
-END { $success && done_testing; }
-
-# List our own version used to generate this
-my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.08\n";
-
-eval {                     # no excuses!
-    # report our Perl details
-    my $want = "any version";
-    $v .= "perl: $] (wanted $want) on $^O from $^X\n\n";
-};
-defined($@) and diag("$@");
-
-# Now, our module version dependencies:
-sub pmver {
-    my ($module, $wanted) = @_;
-    $wanted = " (want $wanted)";
-    my $pmver;
-    eval "require $module;";
-    if ($@) {
-        if ($@ =~ m/Can't locate .* in \@INC/) {
-            $pmver = 'module not found.';
-        } else {
-            diag("${module}: $@");
-            $pmver = 'died during require.';
-        }
-    } else {
-        my $version;
-        eval { $version = $module->VERSION; };
-        if ($@) {
-            diag("${module}: $@");
-            $pmver = 'died during VERSION check.';
-        } elsif (defined $version) {
-            $pmver = "$version";
-        } else {
-            $pmver = '<undef>';
-        }
-    }
-
-    # So, we should be good, right?
-    return sprintf('%-45s => %-10s%-15s%s', $module, $pmver, $wanted, "\n");
-}
-
-eval { $v .= pmver('Carp','any version') };
-eval { $v .= pmver('ExtUtils::MakeMaker','6.30') };
-eval { $v .= pmver('File::Find','any version') };
-eval { $v .= pmver('File::Spec','any version') };
-eval { $v .= pmver('File::Temp','any version') };
-eval { $v .= pmver('Log::Dispatch','any version') };
-eval { $v .= pmver('Log::Dispatch::Array','any version') };
-eval { $v .= pmver('Log::Dispatch::File','any version') };
-eval { $v .= pmver('Log::Dispatch::Screen','any version') };
-eval { $v .= pmver('Log::Dispatch::Syslog','any version') };
-eval { $v .= pmver('Params::Util','any version') };
-eval { $v .= pmver('Scalar::Util','any version') };
-eval { $v .= pmver('String::Flogger','any version') };
-eval { $v .= pmver('Sub::Exporter','any version') };
-eval { $v .= pmver('Sub::Exporter::GlobExporter','0.002') };
-eval { $v .= pmver('Sys::Syslog','0.16') };
-eval { $v .= pmver('Test::Deep','any version') };
-eval { $v .= pmver('Test::Fatal','any version') };
-eval { $v .= pmver('Test::More','0.96') };
-eval { $v .= pmver('Test::Pod','1.41') };
-eval { $v .= pmver('Try::Tiny','0.04') };
-eval { $v .= pmver('base','any version') };
-eval { $v .= pmver('overload','any version') };
-eval { $v .= pmver('strict','any version') };
-eval { $v .= pmver('version','0.9901') };
-eval { $v .= pmver('warnings','any version') };
-
-
-# All done.
-$v .= <<'EOT';
-
-Thanks for using my code.  I hope it works for you.
-If not, please try and include this output in the bug report.
-That will help me reproduce the issue and solve your problem.
-
-EOT
-
-diag($v);
-ok(1, "we really didn't test anything, just reporting data");
-$success = 1;
-
-# Work around another nasty module on CPAN. :/
-no warnings 'once';
-$Template::Test::NO_FLUSH = 1;
-exit 0;
@@ -0,0 +1,69 @@
+use strict;
+use warnings;
+
+use Log::Dispatchouli;
+use Test::More 0.88;
+use File::Spec::Functions qw( catfile );
+use File::Temp qw( tempdir );
+
+my $tmpdir = tempdir( TMPDIR => 1, CLEANUP => 1 );
+
+{
+  {
+    my $logger = Log::Dispatchouli->new({
+      log_pid  => 1,
+      ident    => 't_file',
+      to_file  => 1,
+      log_path => $tmpdir,
+    });
+
+    isa_ok($logger, 'Log::Dispatchouli');
+
+    is($logger->ident, 't_file', '$logger->ident is available');
+
+    $logger->log([ "point: %s", {x=>1,y=>2} ]);
+  }
+
+  my ($log_file) = glob(catfile($tmpdir, 't_file.*'));
+  ok -r $log_file, 'log file with ident name';
+
+  like slurp_file($log_file),
+    qr/^.+? \[$$\] point: \{\{\{("[xy]": [12](, ?)?){2}\}\}\}$/,
+    'logged timestamp, pid, and hash';
+}
+
+{
+  {
+    my $logger = Log::Dispatchouli->new({
+      log_pid  => 0,
+      ident    => 'ouli_file',
+      to_file  => 1,
+      log_file => 'ouli.log',
+      log_path => $tmpdir,
+      file_format => sub { "$$: sec:" . time() . " m:" . $_[0] },
+    });
+
+    isa_ok($logger, 'Log::Dispatchouli');
+
+    is($logger->ident, 'ouli_file', '$logger->ident is available');
+
+    $logger->log([ "point: %s", {x=>1,y=>2} ]);
+  }
+
+  my $log_file = catfile($tmpdir, 'ouli.log');
+  ok -r $log_file, 'log file with custom name';
+
+  like slurp_file($log_file),
+    qr/^$$: sec:\d+ m:point: \{\{\{("[xy]": [12](, ?)?){2}\}\}\}$/,
+    'custom file callbacks';
+}
+
+done_testing;
+
+sub slurp_file {
+  my ($file) = @_;
+  open my $fh, '<', $file
+    or die "Failed to open $file: $!";
+  local $/;
+  return <$fh>;
+}
@@ -4,7 +4,7 @@ use Test::More tests => 2;
 
 note 'Checking Changes';
 my $changes_file = 'Changes';
-my $newver = '2.006';
+my $newver = '2.012';
 my $trial_token = '-TRIAL';
 
 SKIP: {
@@ -1,7 +1,6 @@
 #!perl
+# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests.
 use Test::More;
-
-eval "use Test::Pod 1.41";
-plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
+use Test::Pod 1.41;
 
 all_pod_files_ok();