The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
.gitignore 50
Changes 761
INSTALL 044
LICENSE 0379
MANIFEST 2947
META.yml 14334
Makefile.PL 1074
README 197
README.md 0191
dist.ini 043
inc/Module/Install/AuthorTests.pm 590
inc/Module/Install/Base.pm 780
inc/Module/Install/Can.pm 810
inc/Module/Install/Fetch.pm 930
inc/Module/Install/Include.pm 340
inc/Module/Install/Makefile.pm 2680
inc/Module/Install/Metadata.pm 6240
inc/Module/Install/Repository.pm 880
inc/Module/Install/TestBase.pm 290
inc/Module/Install/Win32.pm 640
inc/Module/Install/WriteAll.pm 600
inc/Module/Install.pm 4300
inc/Spiffy.pm 5390
inc/Test/Base/Filter.pm 3440
inc/Test/Base.pm 6840
inc/Test/Builder/Module.pm 810
inc/Test/Builder.pm 14130
inc/Test/More.pm 7350
lib/Test/Synopsis.pm 23238
t/00-compile.t 050
t/00_compile.t 40
t/01-fail-if-SYNOPSIS-has-errors.t 013
t/02-END-token-errors.t 013
t/03-end-in-pod.t 05
t/04-HEREDOC.t 05
t/05-multi-files-clash.t 08
t/06-for.t 06
t/07-nopod.t 05
t/08-plain-text-in-pod.t 05
t/09-synopsis.t 04
t/10-in-pod-skip.t 05
t/11-DATA-in-pod.t 05
t/12-DATA-token-errors.t 013
t/for.t 60
t/lib/BrokenSYNOPSIS01.pm 024
t/lib/ENDInPod.pm 032
t/lib/ENDInPodWithError.pm 034
t/lib/NoPod.pm 11
t/lib/PlainTextInPod.pm 034
t/lib/Test03.pm 019
t/lib/Test03Other.pm 022
t/lib/Test04HEREDOC.pm 021
t/lib/Test10HEREDOC.pm 021
t/lib/Test10InPodSkipWithBegin.pm 019
t/lib/Test11DATAInPod.pm 032
t/lib/Test12DATAInPodWithError.pm 032
t/nopod.t 50
t/synopsis.t 40
xt/author/pod-spell.t 030
xt/author/test-eol.t 08
xt/perlcritic.t 50
xt/pod.t 40
xt/podspell.t 90
xt/release/cpan-changes.t 011
xt/release/dist-manifest.t 08
xt/release/distmeta.t 08
xt/release/kwalitee.t 011
xt/release/minimum-version.t 08
xt/release/mojibake.t 012
xt/release/no-tabs.t 014
xt/release/pod-coverage.t 014
xt/release/pod-syntax.t 08
xt/release/portability.t 011
xt/release/synopsis.t 08
xt/release/test-version.t 022
xt/release/unused-vars.t 08
76 files changed (This is a version diff) 58492027
@@ -1,5 +0,0 @@
-META.yml
-Makefile
-inc/
-pm_to_blib
-*~
@@ -1,22 +1,76 @@
 Revision history for Perl extension Test::Synopsis
 
-0.06  Mon Jul  6 11:07:50 PDT 2009
+0.10  2014-02-07
+        [Changes by ZOFFIX]
+        - Reverted the change of renaming extract_synopsis() to
+          _extract_synopsis(), as it appears some distros have used
+          undocumented extract_synopsis() in their user tests, and
+          the change is causing their distros to fail
+        - Added contributors into META file through dzil plugin
+
+0.09  2014-02-06
+        [Changes by ZOFFIX]
+        - Fixed prereqs to allow earlier versions of Test-Simple (Issue #9)
+        - Removed POD errors from test .pm's to increase Kwalitee
+
+0.08  2014-02-05
+        [Changes by ZOFFIX]
+        - Implemented proper handling of __DATA__ tokens
+        - Removed unwanted warnings issued during tests
+        - Upped required Test-Simple distro version (Fixes Issue #9)
+        - Minor pod fixes
+
+0.07  2014-02-04
+
+        [Changes by ZOFFIX]
+
+        - Converted to dzil for automation of everything and
+            auto-generation of all the author/release tests and extra files
+
+        - Fixed RT#84863 (should ignore descriptions, and
+            other text that is not code)
+            https://rt.cpan.org/Ticket/Display.html?id=84863
+
+        - Fixed RT#76856 (Sandbox breaks when combining synopses that use
+            Moose and Moose::Role)
+            https://rt.cpan.org/Ticket/Display.html?id=76856
+
+        - Fixed RT#69438 (heredocs fail to terminate because of the
+            leading space for verbatim blocks)
+            https://rt.cpan.org/Ticket/Display.html?id=69438
+
+        - Fixed RT#54731 (suggest =for conditionalized synopsis check)
+            https://rt.cpan.org/Ticket/Display.html?id=54731
+
+        - Fixed RT#53192 (missing Copyright information for Test::Synopsis)
+            https://rt.cpan.org/Ticket/Display.html?id=53192
+
+        - Fixed RT#52684 (pod directive to skip Test::Synopsis)
+            https://rt.cpan.org/Ticket/Display.html?id=52684
+
+        - Fixed RT#51534 (end =for at blank line)
+            https://rt.cpan.org/Ticket/Display.html?id=51534
+
+        - Fixed RT#51535 (show failing code on error)
+            https://rt.cpan.org/Ticket/Display.html?id=51535
+
+0.06  2009-06-06 11:07:50 PDT 2009
         - Reworked NoPod tests so it doesn't sit in lib/ and won't be installed.
 
-0.05  Mon Jul  6 10:55:02 PDT 2009
+0.05  2009-06-06 10:55:02 PDT 2009
         - use Test::Builder::Module to support forward compatibilities with Test::More
-        - Don't warn in tr/// if there is no pod at all.
+        - Don't warn in tr/// if there is no pod at all. (Thanks to hanekomu)
 
-0.04  Thu Mar  5 17:19:13 PST 2009
+0.04  2009-03-05 17:19:13 PST 2009
         - Fixed a doc bug where all_synopsis_ok() is taking a directory which it doesn't.
 
-0.03  Wed Feb 25 20:48:54 PST 2009
+0.03  2009-02-25 20:48:54 PST 2009
         - Added file name and line number to eval context
           (Thanks to Daisuke Maki and Goro Fuji)
 
-0.02  Tue Feb 24 12:22:03 PST 2009
+0.02  2009-02-24 12:22:03 PST
         - Added more docs.
         - eval the code in a more separate sandbox so that variables in Test::Synopsis won't affect.
 
-0.01  Tue Feb 24 00:21:02 2009
+0.01  2009-02-24 00:21:02 PST
         - original version
@@ -0,0 +1,44 @@
+
+This is the Perl distribution Test-Synopsis.
+
+Installing Test-Synopsis is straightforward.
+
+## Installation with cpanm
+
+If you have cpanm, you only need one line:
+
+    % cpanm Test::Synopsis
+
+If you are installing into a system-wide directory, you may need to pass the
+"-S" flag to cpanm, which uses sudo to install the module:
+
+    % cpanm -S Test::Synopsis
+
+## Installing with the CPAN shell
+
+Alternatively, if your CPAN shell is set up, you should just be able to do:
+
+    % cpan Test::Synopsis
+
+## Manual installation
+
+As a last resort, you can manually install it. Download the tarball, untar it,
+then build it:
+
+    % perl Makefile.PL
+    % make && make test
+
+Then install it:
+
+    % make install
+
+If you are installing into a system-wide directory, you may need to run:
+
+    % sudo make install
+
+## Documentation
+
+Test-Synopsis documentation is available as POD.
+You can run perldoc from a shell to read the documentation:
+
+    % perldoc Test::Synopsis
@@ -0,0 +1,379 @@
+This software is copyright (c) 2014 by Tatsuhiko Miyagawa.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+Terms of the Perl programming language system itself
+
+a) the GNU General Public License as published by the Free
+   Software Foundation; either version 1, or (at your option) any
+   later version, or
+b) the "Artistic License"
+
+--- The GNU General Public License, Version 1, February 1989 ---
+
+This software is Copyright (c) 2014 by Tatsuhiko Miyagawa.
+
+This is free software, licensed under:
+
+  The GNU General Public License, Version 1, February 1989
+
+                    GNU GENERAL PUBLIC LICENSE
+                     Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+ 51 Franklin St, Suite 500, Boston, MA  02110-1335  USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The license agreements of most software companies try to keep users
+at the mercy of those companies.  By contrast, our General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  The
+General Public License applies to the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, that you receive source code or can get it if you want it,
+that you can change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of a such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must tell them their rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any program or other work which
+contains a notice placed by the copyright holder saying it may be
+distributed under the terms of this General Public License.  The
+"Program", below, refers to any such program or work, and a "work based
+on the Program" means either the Program or any work containing the
+Program or a portion of it, either verbatim or with modifications.  Each
+licensee is addressed as "you".
+
+  1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program.  You may charge a fee for the physical act of
+transferring a copy.
+
+  2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+    a) cause the modified files to carry prominent notices stating that
+    you changed the files and the date of any change; and
+
+    b) cause the whole of any work that you distribute or publish, that
+    in whole or in part contains the Program or any part thereof, either
+    with or without modifications, to be licensed at no charge to all
+    third parties under the terms of this General Public License (except
+    that you may choose to grant warranty protection to some or all
+    third parties, at your option).
+
+    c) If the modified program normally reads commands interactively when
+    run, you must cause it, when started running for such interactive use
+    in the simplest and most usual way, to print or display an
+    announcement including an appropriate copyright notice and a notice
+    that there is no warranty (or else, saying that you provide a
+    warranty) and that users may redistribute the program under these
+    conditions, and telling the user how to view a copy of this General
+    Public License.
+
+    d) You may charge a fee for the physical act of transferring a
+    copy, and you may at your option offer warranty protection in
+    exchange for a fee.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+  3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 1 and 2 above provided that you also do one of the following:
+
+    a) accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of
+    Paragraphs 1 and 2 above; or,
+
+    b) accompany it with a written offer, valid for at least three
+    years, to give any third party free (except for a nominal charge
+    for the cost of distribution) a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of
+    Paragraphs 1 and 2 above; or,
+
+    c) accompany it with the information you received as to where the
+    corresponding source code may be obtained.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it.  For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+  4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License.  However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+  5. By copying, distributing or modifying the Program (or any work based
+on the Program) you indicate your acceptance of this license to do so,
+and all its terms and conditions.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these
+terms and conditions.  You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein.
+
+  7. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of the license which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+  8. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+        Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to humanity, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+  To do so, attach the following notices to the program.  It is safest to
+attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 1, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19xx name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  program `Gnomovision' (a program to direct compilers to make passes
+  at assemblers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+--- The Artistic License 1.0 ---
+
+This software is Copyright (c) 2014 by Tatsuhiko Miyagawa.
+
+This is free software, licensed under:
+
+  The Artistic License 1.0
+
+The Artistic License
+
+Preamble
+
+The intent of this document is to state the conditions under which a Package
+may be copied, such that the Copyright Holder maintains some semblance of
+artistic control over the development of the package, while giving the users of
+the package the right to use and distribute the Package in a more-or-less
+customary fashion, plus the right to make reasonable modifications.
+
+Definitions:
+
+  - "Package" refers to the collection of files distributed by the Copyright
+    Holder, and derivatives of that collection of files created through
+    textual modification. 
+  - "Standard Version" refers to such a Package if it has not been modified,
+    or has been modified in accordance with the wishes of the Copyright
+    Holder. 
+  - "Copyright Holder" is whoever is named in the copyright or copyrights for
+    the package. 
+  - "You" is you, if you're thinking about copying or distributing this Package.
+  - "Reasonable copying fee" is whatever you can justify on the basis of media
+    cost, duplication charges, time of people involved, and so on. (You will
+    not be required to justify it to the Copyright Holder, but only to the
+    computing community at large as a market that must bear the fee.) 
+  - "Freely Available" means that no fee is charged for the item itself, though
+    there may be fees involved in handling the item. It also means that
+    recipients of the item may redistribute it under the same conditions they
+    received it. 
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications derived
+from the Public Domain or from the Copyright Holder. A Package modified in such
+a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided that
+you insert a prominent notice in each changed file stating how and when you
+changed that file, and provided that you do at least ONE of the following:
+
+  a) place your modifications in the Public Domain or otherwise make them
+     Freely Available, such as by posting said modifications to Usenet or an
+     equivalent medium, or placing the modifications on a major archive site
+     such as ftp.uu.net, or by allowing the Copyright Holder to include your
+     modifications in the Standard Version of the Package.
+
+  b) use the modified Package only within your corporation or organization.
+
+  c) rename any non-standard executables so the names do not conflict with
+     standard executables, which must also be provided, and provide a separate
+     manual page for each non-standard executable that clearly documents how it
+     differs from the Standard Version.
+
+  d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or executable
+form, provided that you do at least ONE of the following:
+
+  a) distribute a Standard Version of the executables and library files,
+     together with instructions (in the manual page or equivalent) on where to
+     get the Standard Version.
+
+  b) accompany the distribution with the machine-readable source of the Package
+     with your modifications.
+
+  c) accompany any non-standard executables with their corresponding Standard
+     Version executables, giving the non-standard executables non-standard
+     names, and clearly documenting the differences in manual pages (or
+     equivalent), together with instructions on where to get the Standard
+     Version.
+
+  d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package.  You may charge any fee you choose for support of this Package. You
+may not charge a fee for this Package itself. However, you may distribute this
+Package in aggregate with other (possibly commercial) programs as part of a
+larger (possibly commercial) software distribution provided that you do not
+advertise this Package as a product of your own.
+
+6. The scripts and library files supplied as input to or produced as output
+from the programs of this Package do not automatically fall under the copyright
+of this Package, but belong to whomever generated them, and may be sold
+commercially, and may be aggregated with this Package.
+
+7. C or perl subroutines supplied by you and linked into this Package shall not
+be considered part of this Package.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The End
+
@@ -1,33 +1,51 @@
-.gitignore
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.012.
 Changes
-inc/Module/Install.pm
-inc/Module/Install/AuthorTests.pm
-inc/Module/Install/Base.pm
-inc/Module/Install/Can.pm
-inc/Module/Install/Fetch.pm
-inc/Module/Install/Include.pm
-inc/Module/Install/Makefile.pm
-inc/Module/Install/Metadata.pm
-inc/Module/Install/Repository.pm
-inc/Module/Install/TestBase.pm
-inc/Module/Install/Win32.pm
-inc/Module/Install/WriteAll.pm
-inc/Spiffy.pm
-inc/Test/Base.pm
-inc/Test/Base/Filter.pm
-inc/Test/Builder.pm
-inc/Test/Builder/Module.pm
-inc/Test/More.pm
-lib/Test/Synopsis.pm
-Makefile.PL
-MANIFEST			This list of files
+INSTALL
+LICENSE
+MANIFEST
 META.yml
+Makefile.PL
 README
-t/00_compile.t
-t/for.t
+README.md
+dist.ini
+lib/Test/Synopsis.pm
+t/00-compile.t
+t/01-fail-if-SYNOPSIS-has-errors.t
+t/02-END-token-errors.t
+t/03-end-in-pod.t
+t/04-HEREDOC.t
+t/05-multi-files-clash.t
+t/06-for.t
+t/07-nopod.t
+t/08-plain-text-in-pod.t
+t/09-synopsis.t
+t/10-in-pod-skip.t
+t/11-DATA-in-pod.t
+t/12-DATA-token-errors.t
+t/lib/BrokenSYNOPSIS01.pm
+t/lib/ENDInPod.pm
+t/lib/ENDInPodWithError.pm
 t/lib/NoPod.pm
-t/nopod.t
-t/synopsis.t
-xt/perlcritic.t
-xt/pod.t
-xt/podspell.t
+t/lib/PlainTextInPod.pm
+t/lib/Test03.pm
+t/lib/Test03Other.pm
+t/lib/Test04HEREDOC.pm
+t/lib/Test10HEREDOC.pm
+t/lib/Test10InPodSkipWithBegin.pm
+t/lib/Test11DATAInPod.pm
+t/lib/Test12DATAInPodWithError.pm
+xt/author/pod-spell.t
+xt/author/test-eol.t
+xt/release/cpan-changes.t
+xt/release/dist-manifest.t
+xt/release/distmeta.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-syntax.t
+xt/release/portability.t
+xt/release/synopsis.t
+xt/release/test-version.t
+xt/release/unused-vars.t
@@ -3,26 +3,346 @@ abstract: 'Test your SYNOPSIS code'
 author:
   - 'Tatsuhiko Miyagawa <miyagawa@bulknews.net>'
 build_requires:
-  ExtUtils::MakeMaker: 6.42
+  File::Spec: 0
+  IO::Handle: 0
+  IPC::Open3: 0
+  Test::Builder: 0.34
+  Test::Builder::Tester: 0
+  Test::More: 0
 configure_requires:
-  ExtUtils::MakeMaker: 6.42
-distribution_type: module
-generated_by: 'Module::Install version 0.91'
+  ExtUtils::MakeMaker: 6.30
+dynamic_config: 0
+generated_by: 'Dist::Zilla version 5.012, CPAN::Meta::Converter version 2.132830'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
   version: 1.4
 name: Test-Synopsis
-no_index:
-  directory:
-    - inc
-    - t
-    - xt
+provides:
+  Test::Synopsis:
+    file: lib/Test/Synopsis.pm
+    version: 0.10
 requires:
-  Filter::Util::Call: 0
-  Test::Builder: 0
-  perl: 5.8.1
+  ExtUtils::Manifest: 0
+  Pod::Parser: 0
+  Test::Builder::Module: 0
+  base: 0
+  perl: 5.008_001
+  strict: 0
+  warnings: 0
 resources:
-  license: http://dev.perl.org/licenses/
+  bugtracker: https://github.com/miyagawa/test-synopsis/issues
+  homepage: http://metacpan.org/release/Test-Synopsis
   repository: git://github.com/miyagawa/test-synopsis.git
-version: 0.06
+version: 0.10
+x_Dist_Zilla:
+  perl:
+    version: 5.014002
+  plugins:
+    -
+      class: Dist::Zilla::Plugin::OurPkgVersion
+      name: '@Author::ZOFFIX/OurPkgVersion'
+      version: 0.005001
+    -
+      class: Dist::Zilla::Plugin::PromptIfStale
+      config:
+        Dist::Zilla::Plugin::PromptIfStale:
+          check_all_plugins: 1
+          check_all_prereqs: 1
+          modules: []
+          phase: release
+          skip:
+            - strict
+            - warnings
+            - base
+            - ExtUtils::MakeMaker
+            - IPC::Open3
+            - File::Copy
+      name: '@Author::ZOFFIX/PromptIfStale'
+      version: 0.016
+    -
+      class: Dist::Zilla::Plugin::GatherDir
+      name: '@Author::ZOFFIX/GatherDir'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::PruneCruft
+      name: '@Author::ZOFFIX/PruneCruft'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::ManifestSkip
+      name: '@Author::ZOFFIX/ManifestSkip'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::MetaYAML
+      name: '@Author::ZOFFIX/MetaYAML'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::License
+      name: '@Author::ZOFFIX/License'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Readme
+      name: '@Author::ZOFFIX/Readme'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::ExecDir
+      name: '@Author::ZOFFIX/ExecDir'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::ShareDir
+      name: '@Author::ZOFFIX/ShareDir'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::MakeMaker
+      name: '@Author::ZOFFIX/MakeMaker'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Manifest
+      name: '@Author::ZOFFIX/Manifest'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::AutoPrereqs
+      name: '@Author::ZOFFIX/AutoPrereqs'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::MetaConfig
+      name: '@Author::ZOFFIX/MetaConfig'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Prereqs::AuthorDeps
+      name: '@Author::ZOFFIX/Prereqs::AuthorDeps'
+      version: 0.002
+    -
+      class: Dist::Zilla::Plugin::MinimumPerl
+      name: '@Author::ZOFFIX/MinimumPerl'
+      version: 1.003
+    -
+      class: Dist::Zilla::Plugin::MetaProvides::Package
+      config:
+        Dist::Zilla::Plugin::MetaProvides::Package:
+          finder_objects:
+            -
+              class: Dist::Zilla::Plugin::FinderCode
+              name: '@Author::ZOFFIX/MetaProvides::Package/AUTOVIV/:InstallModulesPM'
+              version: 5.012
+        Dist::Zilla::Role::MetaProvider::Provider:
+          inherit_missing: 1
+          inherit_version: 1
+          meta_noindex: 1
+      name: '@Author::ZOFFIX/MetaProvides::Package'
+      version: 2.000000
+    -
+      class: Dist::Zilla::Plugin::GithubMeta
+      name: '@Author::ZOFFIX/GithubMeta'
+      version: 0.42
+    -
+      class: Dist::Zilla::Plugin::InstallGuide
+      name: '@Author::ZOFFIX/InstallGuide'
+      version: 1.200002
+    -
+      class: Dist::Zilla::Plugin::ReadmeAnyFromPod
+      name: '@Author::ZOFFIX/ReadmeAnyFromPod'
+      version: 0.133360
+    -
+      class: Dist::Zilla::Plugin::Test::Compile
+      config:
+        Dist::Zilla::Plugin::Test::Compile:
+          filename: t/00-compile.t
+          module_finder:
+            - ':InstallModules'
+          script_finder:
+            - ':ExecFiles'
+      name: '@Author::ZOFFIX/Test::Compile'
+      version: 2.039
+    -
+      class: Dist::Zilla::Plugin::Test::DistManifest
+      name: '@Author::ZOFFIX/Test::DistManifest'
+      version: 2.000004
+    -
+      class: Dist::Zilla::Plugin::Test::EOL
+      name: '@Author::ZOFFIX/Test::EOL'
+      version: 0.10
+    -
+      class: Dist::Zilla::Plugin::Test::Version
+      name: '@Author::ZOFFIX/Test::Version'
+      version: 0.002004
+    -
+      class: Dist::Zilla::Plugin::Test::Kwalitee::Extra
+      name: '@Author::ZOFFIX/Test::Kwalitee::Extra'
+      version: v0.2.0
+    -
+      class: Dist::Zilla::Plugin::MetaTests
+      name: '@Author::ZOFFIX/MetaTests'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Test::CPAN::Meta::JSON
+      name: '@Author::ZOFFIX/Test::CPAN::Meta::JSON'
+      version: 0.003
+    -
+      class: Dist::Zilla::Plugin::MojibakeTests
+      name: '@Author::ZOFFIX/MojibakeTests'
+      version: 0.5
+    -
+      class: Dist::Zilla::Plugin::NoTabsTests
+      config:
+        Dist::Zilla::Plugin::Test::NoTabs:
+          module_finder:
+            - ':InstallModules'
+          script_finder:
+            - ':ExecFiles'
+      name: '@Author::ZOFFIX/NoTabsTests'
+      version: 0.06
+    -
+      class: Dist::Zilla::Plugin::PodCoverageTests
+      name: '@Author::ZOFFIX/PodCoverageTests'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::PodSyntaxTests
+      name: '@Author::ZOFFIX/PodSyntaxTests'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Test::Portability
+      name: '@Author::ZOFFIX/Test::Portability'
+      version: 2.000005
+    -
+      class: Dist::Zilla::Plugin::Test::Synopsis
+      name: '@Author::ZOFFIX/Test::Synopsis'
+      version: 2.000004
+    -
+      class: Dist::Zilla::Plugin::Test::UnusedVars
+      name: '@Author::ZOFFIX/Test::UnusedVars'
+      version: 2.000005
+    -
+      class: Dist::Zilla::Plugin::Test::CPAN::Changes
+      name: '@Author::ZOFFIX/Test::CPAN::Changes'
+      version: 0.008
+    -
+      class: Dist::Zilla::Plugin::Test::PodSpelling
+      name: '@Author::ZOFFIX/Test::PodSpelling'
+      version: 2.006002
+    -
+      class: Dist::Zilla::Plugin::CheckSelfDependency
+      config:
+        Dist::Zilla::Plugin::CheckSelfDependency:
+          finder:
+            - ':InstallModules'
+      name: '@Author::ZOFFIX/CheckSelfDependency'
+      version: 0.007
+    -
+      class: Dist::Zilla::Plugin::CheckPrereqsIndexed
+      name: '@Author::ZOFFIX/CheckPrereqsIndexed'
+      version: 0.010
+    -
+      class: Dist::Zilla::Plugin::Test::MinimumVersion
+      name: '@Author::ZOFFIX/Test::MinimumVersion'
+      version: 2.000005
+    -
+      class: Dist::Zilla::Plugin::CopyFilesFromRelease
+      name: '@Author::ZOFFIX/CopyFilesFromRelease'
+      version: 0.001
+    -
+      class: Dist::Zilla::Plugin::TestRelease
+      name: '@Author::ZOFFIX/TestRelease'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::InstallRelease
+      name: '@Author::ZOFFIX/InstallRelease'
+      version: 0.008
+    -
+      class: Dist::Zilla::Plugin::ConfirmRelease
+      name: '@Author::ZOFFIX/ConfirmRelease'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::UploadToCPAN
+      name: '@Author::ZOFFIX/UploadToCPAN'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Prereqs
+      config:
+        Dist::Zilla::Plugin::Prereqs:
+          phase: test
+          type: requires
+      name: TestRequires
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::Prereqs
+      config:
+        Dist::Zilla::Plugin::Prereqs:
+          phase: develop
+          type: requires
+      name: DevelopRequires
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::AutoMetaResources
+      name: AutoMetaResources
+      version: 1.20
+    -
+      class: Dist::Zilla::Plugin::Meta::Contributors
+      name: Meta::Contributors
+      version: 0.001
+    -
+      class: Dist::Zilla::Plugin::Git::NextVersion
+      name: Git::NextVersion
+      version: 2.020
+    -
+      class: Dist::Zilla::Plugin::Git::Tag
+      name: Git::Tag
+      version: 2.020
+    -
+      class: Dist::Zilla::Plugin::Git::Check
+      name: Git::Check
+      version: 2.020
+    -
+      class: Dist::Zilla::Plugin::Git::Commit
+      name: Git::Commit
+      version: 2.020
+    -
+      class: Dist::Zilla::Plugin::Git::Push
+      name: Git::Push
+      version: 2.020
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':InstallModules'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':IncModules'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':TestFiles'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':ExecFiles'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':ShareFiles'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':MainModule'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':AllFiles'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: ':NoFiles'
+      version: 5.012
+    -
+      class: Dist::Zilla::Plugin::FinderCode
+      name: '@Author::ZOFFIX/MetaProvides::Package/AUTOVIV/:InstallModulesPM'
+      version: 5.012
+  zilla:
+    class: Dist::Zilla::Dist::Builder
+    config:
+      is_trial: 0
+    version: 5.012
+x_contributors:
+  - 'Kevin Ryde <kryde@cpan.org>'
+  - 'Marcel Grünauer <marcel@cpan.org>'
+  - 'Mike Doherty <doherty@cpan.org>'
+  - 'Zoffix Znet <zoffix@cpan.org>'
@@ -1,10 +1,74 @@
-use inc::Module::Install;
-name 'Test-Synopsis';
-all_from 'lib/Test/Synopsis.pm';
-
-requires 'Test::Builder';
-use_test_base;
-auto_include_deps;
-author_tests('xt');
-auto_set_repository;
-WriteAll;
+
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.012.
+use strict;
+use warnings;
+
+use 5.008_001;
+
+use ExtUtils::MakeMaker 6.30;
+
+
+
+my %WriteMakefileArgs = (
+  "ABSTRACT" => "Test your SYNOPSIS code",
+  "AUTHOR" => "Tatsuhiko Miyagawa <miyagawa\@bulknews.net>",
+  "BUILD_REQUIRES" => {},
+  "CONFIGURE_REQUIRES" => {
+    "ExtUtils::MakeMaker" => "6.30"
+  },
+  "DISTNAME" => "Test-Synopsis",
+  "EXE_FILES" => [],
+  "LICENSE" => "perl",
+  "NAME" => "Test::Synopsis",
+  "PREREQ_PM" => {
+    "ExtUtils::Manifest" => 0,
+    "Pod::Parser" => 0,
+    "Test::Builder::Module" => 0,
+    "base" => 0,
+    "strict" => 0,
+    "warnings" => 0
+  },
+  "TEST_REQUIRES" => {
+    "File::Spec" => 0,
+    "IO::Handle" => 0,
+    "IPC::Open3" => 0,
+    "Test::Builder" => "0.34",
+    "Test::Builder::Tester" => 0,
+    "Test::More" => 0
+  },
+  "VERSION" => "0.10",
+  "test" => {
+    "TESTS" => "t/*.t"
+  }
+);
+
+
+my %FallbackPrereqs = (
+  "ExtUtils::Manifest" => 0,
+  "File::Spec" => 0,
+  "IO::Handle" => 0,
+  "IPC::Open3" => 0,
+  "Pod::Parser" => 0,
+  "Test::Builder" => "0.34",
+  "Test::Builder::Module" => 0,
+  "Test::Builder::Tester" => 0,
+  "Test::More" => 0,
+  "base" => 0,
+  "strict" => 0,
+  "warnings" => 0
+);
+
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+  delete $WriteMakefileArgs{TEST_REQUIRES};
+  delete $WriteMakefileArgs{BUILD_REQUIRES};
+  $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
+}
+
+delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
+  unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
+
+WriteMakefile(%WriteMakefileArgs);
+
+
+
@@ -1,27 +1,15 @@
-This is Perl module Test::Synopsis.
 
-INSTALLATION
 
-Test::Synopsis installation is straightforward. If your CPAN shell is set up,
-you should just be able to do
+This archive contains the distribution Test-Synopsis,
+version 0.10:
 
-    % cpan Test::Synopsis
+  Test your SYNOPSIS code
 
-Download it, unpack it, then build it as per the usual:
+This software is copyright (c) 2014 by Tatsuhiko Miyagawa.
 
-    % perl Makefile.PL
-    % make && make test
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
 
-Then install it:
 
-    % make install
+This README file was generated by Dist::Zilla::Plugin::Readme v5.012.
 
-DOCUMENTATION
-
-Test::Synopsis documentation is available as in POD. So you can do:
-
-    % perldoc Test::Synopsis
-
-to read the documentation online with your favorite pager.
-
-Tatsuhiko Miyagawa
@@ -0,0 +1,191 @@
+# NAME
+
+Test::Synopsis - Test your SYNOPSIS code
+
+# SYNOPSIS
+
+    # xt/synopsis.t (with Module::Install::AuthorTests)
+    use Test::Synopsis;
+    all_synopsis_ok();
+
+    # Or, run safe without Test::Synopsis
+    use Test::More;
+    eval "use Test::Synopsis";
+    plan skip_all => "Test::Synopsis required for testing" if $@;
+    all_synopsis_ok();
+
+# DESCRIPTION
+
+Test::Synopsis is an (author) test module to find .pm or .pod files
+under your _lib_ directory and then make sure the example snippet
+code in your _SYNOPSIS_ section passes the perl compile check.
+
+Note that this module only checks the perl syntax (by wrapping the
+code with `sub`) and doesn't actually run the code, __UNLESS__
+that code is a `BEGIN {}` block or a `use` statement.
+
+Suppose you have the following POD in your module.
+
+    =head1 NAME
+
+    Awesome::Template - My awesome template
+
+    =head1 SYNOPSIS
+
+    use Awesome::Template;
+
+    my $template = Awesome::Template->new;
+    $tempalte->render("template.at");
+
+    =head1 DESCRIPTION
+
+An user of your module would try copy-paste this synopsis code and
+find that this code doesn't compile because there's a typo in your
+variable name _$tempalte_. Test::Synopsis will catch that error
+before you ship it.
+
+# VARIABLE DECLARATIONS
+
+Sometimes you might want to put some undeclared variables in your
+synopsis, like:
+
+    =head1 SYNOPSIS
+
+    use Data::Dumper::Names;
+    print Dumper($scalar, \@array, \%hash);
+
+This assumes these variables like _$scalar_ are defined elsewhere in
+module user's code, but Test::Synopsis, by default, will complain that
+these variables are not declared:
+
+    Global symbol "$scalar" requires explicit package name at ...
+
+In this case, you can add the following POD sequence elsewhere in your POD:
+
+    =for test_synopsis
+    no strict 'vars'
+
+Or more explicitly,
+
+    =for test_synopsis
+    my($scalar, @array, %hash);
+
+Test::Synopsis will find these `=for` blocks and these statements are
+prepended before your SYNOPSIS code when being evaluated, so those
+variable name errors will go away, without adding unnecessary bits in
+SYNOPSIS which might confuse users.
+
+# SKIPPING TEST FROM INSIDE THE POD
+
+You can use a `BEGIN{}` block in the `=for test_synopsis` to check for
+specific conditions (e.g. if a module is present), and possibly skip
+the test.
+
+If you `die()` inside the `BEGIN{}` block and the die message begins
+with sequence `SKIP:` (note the colon at the end), the test
+will be skipped for that document.
+
+    =head1 SYNOPSIS
+
+    =for test_synopsis BEGIN { die "SKIP: skip this pod, it's horrible!\n"; }
+
+      $x; # undeclared variable, but we skipped the test!
+
+    =end
+
+# EXPORTED SUBROUTINES
+
+## `all_synopsis_ok`
+
+    all_synopsis_ok();
+
+    all_synopsis_ok( dump_all_code_on_error => 1 );
+
+Checks the SYNOPSIS code in all your modules. Takes __optional__
+arguments as key/value pairs. Possible arguments are as follows:
+
+### `dump_all_code_on_error`
+
+    all_synopsis_ok( dump_all_code_on_error => 1 );
+
+Takes true or false values as a value. __Defaults to:__ false. When
+set to a true value, if an error is discovered in the SYNOPSIS code,
+the test will dump the entire snippet of code it tried to test. Use this
+if you want to copy/paste and play around with the code until the error
+is fixed.
+
+The dumped code will include any of the `=for` code you specified (see
+["VARIABLE DECLARATIONS"](#variable-declarations) section above) as well as a few internal bits
+this test module uses to make SYNOPSIS code checking possible.
+
+__Note:__ you will likely have to remove the `#` and a space at the start
+of each line (`perl -pi -e 's/^#\s//;' TEMP_FILE_WITH_CODE`)
+
+## `synopsis_ok`
+
+    use Test::More tests => 1;
+    use Test::Synopsis;
+    synopsis_ok("t/lib/NoPod.pm");
+    synopsis_ok(qw/Pod1.pm  Pod2.pm  Pod3.pm/);
+
+Lets you test a single file. __Note:__ you must setup your own plan if
+you use this subroutine (e.g. with `use Test::More tests => 1;`).
+__Takes__ a list of filenames for documents containing SYNOPSIS code to test.
+
+# CAVEATS
+
+This module will not check code past the `__END__` or
+`__DATA__` tokens, if one is
+present in the SYNOPSIS code.
+
+This module will actually execute `use` statements and any code
+you specify in the `BEGIN {}` blocks in the SYNOPSIS.
+
+If you're using HEREDOCs in your SYNOPSIS, you will need to place
+the ending of the HEREDOC at the same indent as the
+first line of the code of your SYNOPSIS.
+
+# REPOSITORY
+
+Fork this module on GitHub:
+[https://github.com/miyagawa/Test-Synopsis](https://github.com/miyagawa/Test-Synopsis)
+
+# BUGS
+
+To report bugs or request features, please use
+[https://github.com/miyagawa/Test-Synopsis/issues](https://github.com/miyagawa/Test-Synopsis/issues)
+
+If you can't access GitHub, you can email your request
+to `bug-Test-Synopsis at rt.cpan.org`
+
+# AUTHOR
+
+Tatsuhiko Miyagawa <miyagawa@bulknews.net>
+
+Goro Fuji blogged about the original idea at
+[http://d.hatena.ne.jp/gfx/20090224/1235449381](http://d.hatena.ne.jp/gfx/20090224/1235449381) based on the testing
+code taken from [Test::Weaken](https://metacpan.org/pod/Test::Weaken).
+
+# MAINTAINER
+
+Zoffix Znet <cpan (at) zoffix.com>
+
+# CONTRIBUTORS
+
+- Kevin Ryde ([KRYDE](https://metacpan.org/author/KRYDE))
+- Marcel Grünauer ([MARCEL](https://metacpan.org/author/MARCEL))
+- Mike Doherty ([DOHERTY](https://metacpan.org/author/DOHERTY))
+- Zoffix Znet ([ZOFFIX](https://metacpan.org/author/ZOFFIX))
+
+# LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+# COPYRIGHT
+
+This library is Copyright (c) Tatsuhiko Miyagawa
+
+# SEE ALSO
+
+[Test::Pod](https://metacpan.org/pod/Test::Pod), [Test::UseAllModules](https://metacpan.org/pod/Test::UseAllModules), [Test::Inline](https://metacpan.org/pod/Test::Inline)
@@ -0,0 +1,43 @@
+name = Test-Synopsis
+author = Tatsuhiko Miyagawa <miyagawa@bulknews.net>
+license = Perl_5
+copyright_holder = Tatsuhiko Miyagawa
+
+[@Author::ZOFFIX]
+-remove = AutoMetaResources
+-remove = Test::Pod::LinkCheck ; Failing for a strange reason (firewalled?)
+-remove = Git::NextVersion
+-remove = Git::Tag
+-remove = Git::Check
+-remove = Git::Commit
+-remove = Git::Push
+
+[Prereqs / TestRequires]
+Test::Builder = 0.34
+
+[Prereqs / DevelopRequires]
+Pod::Wordlist = 1.06
+Test::More = 0.96
+
+[AutoMetaResources]
+bugtracker.github = user:miyagawa
+repository.github = user:miyagawa
+homepage = http://metacpan.org/release/%{dist}
+
+[Meta::Contributors]
+contributor = Kevin Ryde <kryde@cpan.org>
+contributor = Marcel Grünauer <marcel@cpan.org>
+contributor = Mike Doherty <doherty@cpan.org>
+contributor = Zoffix Znet <zoffix@cpan.org>
+
+[Git::NextVersion]
+first_version = 0.07
+version_regexp = ^(.+)$
+
+[Git::Tag]
+tag_format  = %v
+tag_message = %v
+
+[Git::Check]
+[Git::Commit]
+[Git::Push]
@@ -1,59 +0,0 @@
-#line 1
-package Module::Install::AuthorTests;
-
-use 5.005;
-use strict;
-use Module::Install::Base;
-use Carp ();
-
-#line 16
-
-use vars qw{$VERSION $ISCORE @ISA};
-BEGIN {
-  $VERSION = '0.002';
-  $ISCORE  = 1;
-  @ISA     = qw{Module::Install::Base};
-}
-
-#line 42
-
-sub author_tests {
-  my ($self, @dirs) = @_;
-  _add_author_tests($self, \@dirs, 0);
-}
-
-#line 56
-
-sub recursive_author_tests {
-  my ($self, @dirs) = @_;
-  _add_author_tests($self, \@dirs, 1);
-}
-
-sub _wanted {
-  my $href = shift;
-  sub { /\.t$/ and -f $_ and $href->{$File::Find::dir} = 1 }
-}
-
-sub _add_author_tests {
-  my ($self, $dirs, $recurse) = @_;
-  return unless $Module::Install::AUTHOR;
-
-  my @tests = $self->tests ? (split / /, $self->tests) : 't/*.t';
-
-  # XXX: pick a default, later -- rjbs, 2008-02-24
-  my @dirs = @$dirs ? @$dirs : Carp::confess "no dirs given to author_tests";
-     @dirs = grep { -d } @dirs;
-
-  if ($recurse) {
-    require File::Find;
-    my %test_dir;
-    File::Find::find(_wanted(\%test_dir), @dirs);
-    $self->tests( join ' ', @tests, map { "$_/*.t" } sort keys %test_dir );
-  } else {
-    $self->tests( join ' ', @tests, map { "$_/*.t" } sort @dirs );
-  }
-}
-
-#line 107
-
-1;
@@ -1,78 +0,0 @@
-#line 1
-package Module::Install::Base;
-
-use strict 'vars';
-use vars qw{$VERSION};
-BEGIN {
-	$VERSION = '0.91';
-}
-
-# Suspend handler for "redefined" warnings
-BEGIN {
-	my $w = $SIG{__WARN__};
-	$SIG{__WARN__} = sub { $w };
-}
-
-#line 42
-
-sub new {
-	my $class = shift;
-	unless ( defined &{"${class}::call"} ) {
-		*{"${class}::call"} = sub { shift->_top->call(@_) };
-	}
-	unless ( defined &{"${class}::load"} ) {
-		*{"${class}::load"} = sub { shift->_top->load(@_) };
-	}
-	bless { @_ }, $class;
-}
-
-#line 61
-
-sub AUTOLOAD {
-	local $@;
-	my $func = eval { shift->_top->autoload } or return;
-	goto &$func;
-}
-
-#line 75
-
-sub _top {
-	$_[0]->{_top};
-}
-
-#line 90
-
-sub admin {
-	$_[0]->_top->{admin}
-	or
-	Module::Install::Base::FakeAdmin->new;
-}
-
-#line 106
-
-sub is_admin {
-	$_[0]->admin->VERSION;
-}
-
-sub DESTROY {}
-
-package Module::Install::Base::FakeAdmin;
-
-my $fake;
-
-sub new {
-	$fake ||= bless(\@_, $_[0]);
-}
-
-sub AUTOLOAD {}
-
-sub DESTROY {}
-
-# Restore warning handler
-BEGIN {
-	$SIG{__WARN__} = $SIG{__WARN__}->();
-}
-
-1;
-
-#line 154
@@ -1,81 +0,0 @@
-#line 1
-package Module::Install::Can;
-
-use strict;
-use Config                ();
-use File::Spec            ();
-use ExtUtils::MakeMaker   ();
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';
-	@ISA     = 'Module::Install::Base';
-	$ISCORE  = 1;
-}
-
-# check if we can load some module
-### Upgrade this to not have to load the module if possible
-sub can_use {
-	my ($self, $mod, $ver) = @_;
-	$mod =~ s{::|\\}{/}g;
-	$mod .= '.pm' unless $mod =~ /\.pm$/i;
-
-	my $pkg = $mod;
-	$pkg =~ s{/}{::}g;
-	$pkg =~ s{\.pm$}{}i;
-
-	local $@;
-	eval { require $mod; $pkg->VERSION($ver || 0); 1 };
-}
-
-# check if we can run some command
-sub can_run {
-	my ($self, $cmd) = @_;
-
-	my $_cmd = $cmd;
-	return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
-
-	for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
-		next if $dir eq '';
-		my $abs = File::Spec->catfile($dir, $_[1]);
-		return $abs if (-x $abs or $abs = MM->maybe_command($abs));
-	}
-
-	return;
-}
-
-# can we locate a (the) C compiler
-sub can_cc {
-	my $self   = shift;
-	my @chunks = split(/ /, $Config::Config{cc}) or return;
-
-	# $Config{cc} may contain args; try to find out the program part
-	while (@chunks) {
-		return $self->can_run("@chunks") || (pop(@chunks), next);
-	}
-
-	return;
-}
-
-# Fix Cygwin bug on maybe_command();
-if ( $^O eq 'cygwin' ) {
-	require ExtUtils::MM_Cygwin;
-	require ExtUtils::MM_Win32;
-	if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) {
-		*ExtUtils::MM_Cygwin::maybe_command = sub {
-			my ($self, $file) = @_;
-			if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) {
-				ExtUtils::MM_Win32->maybe_command($file);
-			} else {
-				ExtUtils::MM_Unix->maybe_command($file);
-			}
-		}
-	}
-}
-
-1;
-
-__END__
-
-#line 156
@@ -1,93 +0,0 @@
-#line 1
-package Module::Install::Fetch;
-
-use strict;
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';
-	@ISA     = 'Module::Install::Base';
-	$ISCORE  = 1;
-}
-
-sub get_file {
-    my ($self, %args) = @_;
-    my ($scheme, $host, $path, $file) =
-        $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
-
-    if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) {
-        $args{url} = $args{ftp_url}
-            or (warn("LWP support unavailable!\n"), return);
-        ($scheme, $host, $path, $file) =
-            $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
-    }
-
-    $|++;
-    print "Fetching '$file' from $host... ";
-
-    unless (eval { require Socket; Socket::inet_aton($host) }) {
-        warn "'$host' resolve failed!\n";
-        return;
-    }
-
-    return unless $scheme eq 'ftp' or $scheme eq 'http';
-
-    require Cwd;
-    my $dir = Cwd::getcwd();
-    chdir $args{local_dir} or return if exists $args{local_dir};
-
-    if (eval { require LWP::Simple; 1 }) {
-        LWP::Simple::mirror($args{url}, $file);
-    }
-    elsif (eval { require Net::FTP; 1 }) { eval {
-        # use Net::FTP to get past firewall
-        my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600);
-        $ftp->login("anonymous", 'anonymous@example.com');
-        $ftp->cwd($path);
-        $ftp->binary;
-        $ftp->get($file) or (warn("$!\n"), return);
-        $ftp->quit;
-    } }
-    elsif (my $ftp = $self->can_run('ftp')) { eval {
-        # no Net::FTP, fallback to ftp.exe
-        require FileHandle;
-        my $fh = FileHandle->new;
-
-        local $SIG{CHLD} = 'IGNORE';
-        unless ($fh->open("|$ftp -n")) {
-            warn "Couldn't open ftp: $!\n";
-            chdir $dir; return;
-        }
-
-        my @dialog = split(/\n/, <<"END_FTP");
-open $host
-user anonymous anonymous\@example.com
-cd $path
-binary
-get $file $file
-quit
-END_FTP
-        foreach (@dialog) { $fh->print("$_\n") }
-        $fh->close;
-    } }
-    else {
-        warn "No working 'ftp' program available!\n";
-        chdir $dir; return;
-    }
-
-    unless (-f $file) {
-        warn "Fetching failed: $@\n";
-        chdir $dir; return;
-    }
-
-    return if exists $args{size} and -s $file != $args{size};
-    system($args{run}) if exists $args{run};
-    unlink($file) if $args{remove};
-
-    print(((!exists $args{check_for} or -e $args{check_for})
-        ? "done!" : "failed! ($!)"), "\n");
-    chdir $dir; return !$?;
-}
-
-1;
@@ -1,34 +0,0 @@
-#line 1
-package Module::Install::Include;
-
-use strict;
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';
-	@ISA     = 'Module::Install::Base';
-	$ISCORE  = 1;
-}
-
-sub include {
-	shift()->admin->include(@_);
-}
-
-sub include_deps {
-	shift()->admin->include_deps(@_);
-}
-
-sub auto_include {
-	shift()->admin->auto_include(@_);
-}
-
-sub auto_include_deps {
-	shift()->admin->auto_include_deps(@_);
-}
-
-sub auto_include_dependent_dists {
-	shift()->admin->auto_include_dependent_dists(@_);
-}
-
-1;
@@ -1,268 +0,0 @@
-#line 1
-package Module::Install::Makefile;
-
-use strict 'vars';
-use ExtUtils::MakeMaker   ();
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';
-	@ISA     = 'Module::Install::Base';
-	$ISCORE  = 1;
-}
-
-sub Makefile { $_[0] }
-
-my %seen = ();
-
-sub prompt {
-	shift;
-
-	# Infinite loop protection
-	my @c = caller();
-	if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) {
-		die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])";
-	}
-
-	# In automated testing, always use defaults
-	if ( $ENV{AUTOMATED_TESTING} and ! $ENV{PERL_MM_USE_DEFAULT} ) {
-		local $ENV{PERL_MM_USE_DEFAULT} = 1;
-		goto &ExtUtils::MakeMaker::prompt;
-	} else {
-		goto &ExtUtils::MakeMaker::prompt;
-	}
-}
-
-sub makemaker_args {
-	my $self = shift;
-	my $args = ( $self->{makemaker_args} ||= {} );
-	%$args = ( %$args, @_ );
-	return $args;
-}
-
-# For mm args that take multiple space-seperated args,
-# append an argument to the current list.
-sub makemaker_append {
-	my $self = sShift;
-	my $name = shift;
-	my $args = $self->makemaker_args;
-	$args->{name} = defined $args->{$name}
-		? join( ' ', $args->{name}, @_ )
-		: join( ' ', @_ );
-}
-
-sub build_subdirs {
-	my $self    = shift;
-	my $subdirs = $self->makemaker_args->{DIR} ||= [];
-	for my $subdir (@_) {
-		push @$subdirs, $subdir;
-	}
-}
-
-sub clean_files {
-	my $self  = shift;
-	my $clean = $self->makemaker_args->{clean} ||= {};
-	  %$clean = (
-		%$clean,
-		FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_),
-	);
-}
-
-sub realclean_files {
-	my $self      = shift;
-	my $realclean = $self->makemaker_args->{realclean} ||= {};
-	  %$realclean = (
-		%$realclean,
-		FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_),
-	);
-}
-
-sub libs {
-	my $self = shift;
-	my $libs = ref $_[0] ? shift : [ shift ];
-	$self->makemaker_args( LIBS => $libs );
-}
-
-sub inc {
-	my $self = shift;
-	$self->makemaker_args( INC => shift );
-}
-
-my %test_dir = ();
-
-sub _wanted_t {
-	/\.t$/ and -f $_ and $test_dir{$File::Find::dir} = 1;
-}
-
-sub tests_recursive {
-	my $self = shift;
-	if ( $self->tests ) {
-		die "tests_recursive will not work if tests are already defined";
-	}
-	my $dir = shift || 't';
-	unless ( -d $dir ) {
-		die "tests_recursive dir '$dir' does not exist";
-	}
-	%test_dir = ();
-	require File::Find;
-	File::Find::find( \&_wanted_t, $dir );
-	$self->tests( join ' ', map { "$_/*.t" } sort keys %test_dir );
-}
-
-sub write {
-	my $self = shift;
-	die "&Makefile->write() takes no arguments\n" if @_;
-
-	# Check the current Perl version
-	my $perl_version = $self->perl_version;
-	if ( $perl_version ) {
-		eval "use $perl_version; 1"
-			or die "ERROR: perl: Version $] is installed, "
-			. "but we need version >= $perl_version";
-	}
-
-	# Make sure we have a new enough MakeMaker
-	require ExtUtils::MakeMaker;
-
-	if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) {
-		# MakeMaker can complain about module versions that include
-		# an underscore, even though its own version may contain one!
-		# Hence the funny regexp to get rid of it.  See RT #35800
-		# for details.
-		$self->build_requires( 'ExtUtils::MakeMaker' => $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/ );
-		$self->configure_requires( 'ExtUtils::MakeMaker' => $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/ );
-	} else {
-		# Allow legacy-compatibility with 5.005 by depending on the
-		# most recent EU:MM that supported 5.005.
-		$self->build_requires( 'ExtUtils::MakeMaker' => 6.42 );
-		$self->configure_requires( 'ExtUtils::MakeMaker' => 6.42 );
-	}
-
-	# Generate the MakeMaker params
-	my $args = $self->makemaker_args;
-	$args->{DISTNAME} = $self->name;
-	$args->{NAME}     = $self->module_name || $self->name;
-	$args->{VERSION}  = $self->version;
-	$args->{NAME}     =~ s/-/::/g;
-	if ( $self->tests ) {
-		$args->{test} = { TESTS => $self->tests };
-	}
-	if ( $] >= 5.005 ) {
-		$args->{ABSTRACT} = $self->abstract;
-		$args->{AUTHOR}   = $self->author;
-	}
-	if ( eval($ExtUtils::MakeMaker::VERSION) >= 6.10 ) {
-		$args->{NO_META} = 1;
-	}
-	if ( eval($ExtUtils::MakeMaker::VERSION) > 6.17 and $self->sign ) {
-		$args->{SIGN} = 1;
-	}
-	unless ( $self->is_admin ) {
-		delete $args->{SIGN};
-	}
-
-	# Merge both kinds of requires into prereq_pm
-	my $prereq = ($args->{PREREQ_PM} ||= {});
-	%$prereq = ( %$prereq,
-		map { @$_ }
-		map { @$_ }
-		grep $_,
-		($self->configure_requires, $self->build_requires, $self->requires)
-	);
-
-	# Remove any reference to perl, PREREQ_PM doesn't support it
-	delete $args->{PREREQ_PM}->{perl};
-
-	# merge both kinds of requires into prereq_pm
-	my $subdirs = ($args->{DIR} ||= []);
-	if ($self->bundles) {
-		foreach my $bundle (@{ $self->bundles }) {
-			my ($file, $dir) = @$bundle;
-			push @$subdirs, $dir if -d $dir;
-			delete $prereq->{$file};
-		}
-	}
-
-	if ( my $perl_version = $self->perl_version ) {
-		eval "use $perl_version; 1"
-			or die "ERROR: perl: Version $] is installed, "
-			. "but we need version >= $perl_version";
-	}
-
-	$args->{INSTALLDIRS} = $self->installdirs;
-
-	my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_})} keys %$args;
-
-	my $user_preop = delete $args{dist}->{PREOP};
-	if (my $preop = $self->admin->preop($user_preop)) {
-		foreach my $key ( keys %$preop ) {
-			$args{dist}->{$key} = $preop->{$key};
-		}
-	}
-
-	my $mm = ExtUtils::MakeMaker::WriteMakefile(%args);
-	$self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile');
-}
-
-sub fix_up_makefile {
-	my $self          = shift;
-	my $makefile_name = shift;
-	my $top_class     = ref($self->_top) || '';
-	my $top_version   = $self->_top->VERSION || '';
-
-	my $preamble = $self->preamble
-		? "# Preamble by $top_class $top_version\n"
-			. $self->preamble
-		: '';
-	my $postamble = "# Postamble by $top_class $top_version\n"
-		. ($self->postamble || '');
-
-	local *MAKEFILE;
-	open MAKEFILE, "< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!";
-	my $makefile = do { local $/; <MAKEFILE> };
-	close MAKEFILE or die $!;
-
-	$makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /;
-	$makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g;
-	$makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g;
-	$makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m;
-	$makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m;
-
-	# Module::Install will never be used to build the Core Perl
-	# Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks
-	# PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist
-	$makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m;
-	#$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m;
-
-	# Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well.
-	$makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g;
-
-	# XXX - This is currently unused; not sure if it breaks other MM-users
-	# $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg;
-
-	open  MAKEFILE, "> $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!";
-	print MAKEFILE  "$preamble$makefile$postamble" or die $!;
-	close MAKEFILE  or die $!;
-
-	1;
-}
-
-sub preamble {
-	my ($self, $text) = @_;
-	$self->{preamble} = $text . $self->{preamble} if defined $text;
-	$self->{preamble};
-}
-
-sub postamble {
-	my ($self, $text) = @_;
-	$self->{postamble} ||= $self->admin->postamble;
-	$self->{postamble} .= $text if defined $text;
-	$self->{postamble}
-}
-
-1;
-
-__END__
-
-#line 394
@@ -1,624 +0,0 @@
-#line 1
-package Module::Install::Metadata;
-
-use strict 'vars';
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';
-	@ISA     = 'Module::Install::Base';
-	$ISCORE  = 1;
-}
-
-my @boolean_keys = qw{
-	sign
-};
-
-my @scalar_keys = qw{
-	name
-	module_name
-	abstract
-	author
-	version
-	distribution_type
-	tests
-	installdirs
-};
-
-my @tuple_keys = qw{
-	configure_requires
-	build_requires
-	requires
-	recommends
-	bundles
-	resources
-};
-
-my @resource_keys = qw{
-	homepage
-	bugtracker
-	repository
-};
-
-my @array_keys = qw{
-	keywords
-};
-
-sub Meta              { shift          }
-sub Meta_BooleanKeys  { @boolean_keys  }
-sub Meta_ScalarKeys   { @scalar_keys   }
-sub Meta_TupleKeys    { @tuple_keys    }
-sub Meta_ResourceKeys { @resource_keys }
-sub Meta_ArrayKeys    { @array_keys    }
-
-foreach my $key ( @boolean_keys ) {
-	*$key = sub {
-		my $self = shift;
-		if ( defined wantarray and not @_ ) {
-			return $self->{values}->{$key};
-		}
-		$self->{values}->{$key} = ( @_ ? $_[0] : 1 );
-		return $self;
-	};
-}
-
-foreach my $key ( @scalar_keys ) {
-	*$key = sub {
-		my $self = shift;
-		return $self->{values}->{$key} if defined wantarray and !@_;
-		$self->{values}->{$key} = shift;
-		return $self;
-	};
-}
-
-foreach my $key ( @array_keys ) {
-	*$key = sub {
-		my $self = shift;
-		return $self->{values}->{$key} if defined wantarray and !@_;
-		$self->{values}->{$key} ||= [];
-		push @{$self->{values}->{$key}}, @_;
-		return $self;
-	};
-}
-
-foreach my $key ( @resource_keys ) {
-	*$key = sub {
-		my $self = shift;
-		unless ( @_ ) {
-			return () unless $self->{values}->{resources};
-			return map  { $_->[1] }
-			       grep { $_->[0] eq $key }
-			       @{ $self->{values}->{resources} };
-		}
-		return $self->{values}->{resources}->{$key} unless @_;
-		my $uri = shift or die(
-			"Did not provide a value to $key()"
-		);
-		$self->resources( $key => $uri );
-		return 1;
-	};
-}
-
-foreach my $key ( grep { $_ ne "resources" } @tuple_keys) {
-	*$key = sub {
-		my $self = shift;
-		return $self->{values}->{$key} unless @_;
-		my @added;
-		while ( @_ ) {
-			my $module  = shift or last;
-			my $version = shift || 0;
-			push @added, [ $module, $version ];
-		}
-		push @{ $self->{values}->{$key} }, @added;
-		return map {@$_} @added;
-	};
-}
-
-# Resource handling
-my %lc_resource = map { $_ => 1 } qw{
-	homepage
-	license
-	bugtracker
-	repository
-};
-
-sub resources {
-	my $self = shift;
-	while ( @_ ) {
-		my $name  = shift or last;
-		my $value = shift or next;
-		if ( $name eq lc $name and ! $lc_resource{$name} ) {
-			die("Unsupported reserved lowercase resource '$name'");
-		}
-		$self->{values}->{resources} ||= [];
-		push @{ $self->{values}->{resources} }, [ $name, $value ];
-	}
-	$self->{values}->{resources};
-}
-
-# Aliases for build_requires that will have alternative
-# meanings in some future version of META.yml.
-sub test_requires     { shift->build_requires(@_) }
-sub install_requires  { shift->build_requires(@_) }
-
-# Aliases for installdirs options
-sub install_as_core   { $_[0]->installdirs('perl')   }
-sub install_as_cpan   { $_[0]->installdirs('site')   }
-sub install_as_site   { $_[0]->installdirs('site')   }
-sub install_as_vendor { $_[0]->installdirs('vendor') }
-
-sub dynamic_config {
-	my $self = shift;
-	unless ( @_ ) {
-		warn "You MUST provide an explicit true/false value to dynamic_config\n";
-		return $self;
-	}
-	$self->{values}->{dynamic_config} = $_[0] ? 1 : 0;
-	return 1;
-}
-
-sub perl_version {
-	my $self = shift;
-	return $self->{values}->{perl_version} unless @_;
-	my $version = shift or die(
-		"Did not provide a value to perl_version()"
-	);
-
-	# Normalize the version
-	$version = $self->_perl_version($version);
-
-	# We don't support the reall old versions
-	unless ( $version >= 5.005 ) {
-		die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n";
-	}
-
-	$self->{values}->{perl_version} = $version;
-}
-
-#Stolen from M::B
-my %license_urls = (
-    perl         => 'http://dev.perl.org/licenses/',
-    apache       => 'http://apache.org/licenses/LICENSE-2.0',
-    artistic     => 'http://opensource.org/licenses/artistic-license.php',
-    artistic_2   => 'http://opensource.org/licenses/artistic-license-2.0.php',
-    lgpl         => 'http://opensource.org/licenses/lgpl-license.php',
-    lgpl2        => 'http://opensource.org/licenses/lgpl-2.1.php',
-    lgpl3        => 'http://opensource.org/licenses/lgpl-3.0.html',
-    bsd          => 'http://opensource.org/licenses/bsd-license.php',
-    gpl          => 'http://opensource.org/licenses/gpl-license.php',
-    gpl2         => 'http://opensource.org/licenses/gpl-2.0.php',
-    gpl3         => 'http://opensource.org/licenses/gpl-3.0.html',
-    mit          => 'http://opensource.org/licenses/mit-license.php',
-    mozilla      => 'http://opensource.org/licenses/mozilla1.1.php',
-    open_source  => undef,
-    unrestricted => undef,
-    restrictive  => undef,
-    unknown      => undef,
-);
-
-sub license {
-	my $self = shift;
-	return $self->{values}->{license} unless @_;
-	my $license = shift or die(
-		'Did not provide a value to license()'
-	);
-	$self->{values}->{license} = $license;
-
-	# Automatically fill in license URLs
-	if ( $license_urls{$license} ) {
-		$self->resources( license => $license_urls{$license} );
-	}
-
-	return 1;
-}
-
-sub all_from {
-	my ( $self, $file ) = @_;
-
-	unless ( defined($file) ) {
-		my $name = $self->name or die(
-			"all_from called with no args without setting name() first"
-		);
-		$file = join('/', 'lib', split(/-/, $name)) . '.pm';
-		$file =~ s{.*/}{} unless -e $file;
-		unless ( -e $file ) {
-			die("all_from cannot find $file from $name");
-		}
-	}
-	unless ( -f $file ) {
-		die("The path '$file' does not exist, or is not a file");
-	}
-
-	# Some methods pull from POD instead of code.
-	# If there is a matching .pod, use that instead
-	my $pod = $file;
-	$pod =~ s/\.pm$/.pod/i;
-	$pod = $file unless -e $pod;
-
-	# Pull the different values
-	$self->name_from($file)         unless $self->name;
-	$self->version_from($file)      unless $self->version;
-	$self->perl_version_from($file) unless $self->perl_version;
-	$self->author_from($pod)        unless $self->author;
-	$self->license_from($pod)       unless $self->license;
-	$self->abstract_from($pod)      unless $self->abstract;
-
-	return 1;
-}
-
-sub provides {
-	my $self     = shift;
-	my $provides = ( $self->{values}->{provides} ||= {} );
-	%$provides = (%$provides, @_) if @_;
-	return $provides;
-}
-
-sub auto_provides {
-	my $self = shift;
-	return $self unless $self->is_admin;
-	unless (-e 'MANIFEST') {
-		warn "Cannot deduce auto_provides without a MANIFEST, skipping\n";
-		return $self;
-	}
-	# Avoid spurious warnings as we are not checking manifest here.
-	local $SIG{__WARN__} = sub {1};
-	require ExtUtils::Manifest;
-	local *ExtUtils::Manifest::manicheck = sub { return };
-
-	require Module::Build;
-	my $build = Module::Build->new(
-		dist_name    => $self->name,
-		dist_version => $self->version,
-		license      => $self->license,
-	);
-	$self->provides( %{ $build->find_dist_packages || {} } );
-}
-
-sub feature {
-	my $self     = shift;
-	my $name     = shift;
-	my $features = ( $self->{values}->{features} ||= [] );
-	my $mods;
-
-	if ( @_ == 1 and ref( $_[0] ) ) {
-		# The user used ->feature like ->features by passing in the second
-		# argument as a reference.  Accomodate for that.
-		$mods = $_[0];
-	} else {
-		$mods = \@_;
-	}
-
-	my $count = 0;
-	push @$features, (
-		$name => [
-			map {
-				ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_
-			} @$mods
-		]
-	);
-
-	return @$features;
-}
-
-sub features {
-	my $self = shift;
-	while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) {
-		$self->feature( $name, @$mods );
-	}
-	return $self->{values}->{features}
-		? @{ $self->{values}->{features} }
-		: ();
-}
-
-sub no_index {
-	my $self = shift;
-	my $type = shift;
-	push @{ $self->{values}->{no_index}->{$type} }, @_ if $type;
-	return $self->{values}->{no_index};
-}
-
-sub read {
-	my $self = shift;
-	$self->include_deps( 'YAML::Tiny', 0 );
-
-	require YAML::Tiny;
-	my $data = YAML::Tiny::LoadFile('META.yml');
-
-	# Call methods explicitly in case user has already set some values.
-	while ( my ( $key, $value ) = each %$data ) {
-		next unless $self->can($key);
-		if ( ref $value eq 'HASH' ) {
-			while ( my ( $module, $version ) = each %$value ) {
-				$self->can($key)->($self, $module => $version );
-			}
-		} else {
-			$self->can($key)->($self, $value);
-		}
-	}
-	return $self;
-}
-
-sub write {
-	my $self = shift;
-	return $self unless $self->is_admin;
-	$self->admin->write_meta;
-	return $self;
-}
-
-sub version_from {
-	require ExtUtils::MM_Unix;
-	my ( $self, $file ) = @_;
-	$self->version( ExtUtils::MM_Unix->parse_version($file) );
-}
-
-sub abstract_from {
-	require ExtUtils::MM_Unix;
-	my ( $self, $file ) = @_;
-	$self->abstract(
-		bless(
-			{ DISTNAME => $self->name },
-			'ExtUtils::MM_Unix'
-		)->parse_abstract($file)
-	 );
-}
-
-# Add both distribution and module name
-sub name_from {
-	my ($self, $file) = @_;
-	if (
-		Module::Install::_read($file) =~ m/
-		^ \s*
-		package \s*
-		([\w:]+)
-		\s* ;
-		/ixms
-	) {
-		my ($name, $module_name) = ($1, $1);
-		$name =~ s{::}{-}g;
-		$self->name($name);
-		unless ( $self->module_name ) {
-			$self->module_name($module_name);
-		}
-	} else {
-		die("Cannot determine name from $file\n");
-	}
-}
-
-sub perl_version_from {
-	my $self = shift;
-	if (
-		Module::Install::_read($_[0]) =~ m/
-		^
-		(?:use|require) \s*
-		v?
-		([\d_\.]+)
-		\s* ;
-		/ixms
-	) {
-		my $perl_version = $1;
-		$perl_version =~ s{_}{}g;
-		$self->perl_version($perl_version);
-	} else {
-		warn "Cannot determine perl version info from $_[0]\n";
-		return;
-	}
-}
-
-sub author_from {
-	my $self    = shift;
-	my $content = Module::Install::_read($_[0]);
-	if ($content =~ m/
-		=head \d \s+ (?:authors?)\b \s*
-		([^\n]*)
-		|
-		=head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s*
-		.*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s*
-		([^\n]*)
-	/ixms) {
-		my $author = $1 || $2;
-		$author =~ s{E<lt>}{<}g;
-		$author =~ s{E<gt>}{>}g;
-		$self->author($author);
-	} else {
-		warn "Cannot determine author info from $_[0]\n";
-	}
-}
-
-sub license_from {
-	my $self = shift;
-	if (
-		Module::Install::_read($_[0]) =~ m/
-		(
-			=head \d \s+
-			(?:licen[cs]e|licensing|copyright|legal)\b
-			.*?
-		)
-		(=head\\d.*|=cut.*|)
-		\z
-	/ixms ) {
-		my $license_text = $1;
-		my @phrases      = (
-			'under the same (?:terms|license) as (?:perl|the perl programming language) itself' => 'perl', 1,
-			'GNU general public license'         => 'gpl',         1,
-			'GNU public license'                 => 'gpl',         1,
-			'GNU lesser general public license'  => 'lgpl',        1,
-			'GNU lesser public license'          => 'lgpl',        1,
-			'GNU library general public license' => 'lgpl',        1,
-			'GNU library public license'         => 'lgpl',        1,
-			'BSD license'                        => 'bsd',         1,
-			'Artistic license'                   => 'artistic',    1,
-			'GPL'                                => 'gpl',         1,
-			'LGPL'                               => 'lgpl',        1,
-			'BSD'                                => 'bsd',         1,
-			'Artistic'                           => 'artistic',    1,
-			'MIT'                                => 'mit',         1,
-			'proprietary'                        => 'proprietary', 0,
-		);
-		while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) {
-			$pattern =~ s{\s+}{\\s+}g;
-			if ( $license_text =~ /\b$pattern\b/i ) {
-				$self->license($license);
-				return 1;
-			}
-		}
-	}
-
-	warn "Cannot determine license info from $_[0]\n";
-	return 'unknown';
-}
-
-sub _extract_bugtracker {
-	my @links   = $_[0] =~ m#L<(\Qhttp://rt.cpan.org/\E[^>]+)>#g;
-	my %links;
-	@links{@links}=();
-	@links=keys %links;
-	return @links;
-}
-
-sub bugtracker_from {
-	my $self    = shift;
-	my $content = Module::Install::_read($_[0]);
-	my @links   = _extract_bugtracker($content);
-	unless ( @links ) {
-		warn "Cannot determine bugtracker info from $_[0]\n";
-		return 0;
-	}
-	if ( @links > 1 ) {
-		warn "Found more than on rt.cpan.org link in $_[0]\n";
-		return 0;
-	}
-
-	# Set the bugtracker
-	bugtracker( $links[0] );
-	return 1;
-}
-
-sub requires_from {
-	my $self     = shift;
-	my $content  = Module::Install::_readperl($_[0]);
-	my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg;
-	while ( @requires ) {
-		my $module  = shift @requires;
-		my $version = shift @requires;
-		$self->requires( $module => $version );
-	}
-}
-
-sub test_requires_from {
-	my $self     = shift;
-	my $content  = Module::Install::_readperl($_[0]);
-	my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg;
-	while ( @requires ) {
-		my $module  = shift @requires;
-		my $version = shift @requires;
-		$self->test_requires( $module => $version );
-	}
-}
-
-# Convert triple-part versions (eg, 5.6.1 or 5.8.9) to
-# numbers (eg, 5.006001 or 5.008009).
-# Also, convert double-part versions (eg, 5.8)
-sub _perl_version {
-	my $v = $_[-1];
-	$v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e;
-	$v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e;
-	$v =~ s/(\.\d\d\d)000$/$1/;
-	$v =~ s/_.+$//;
-	if ( ref($v) ) {
-		# Numify
-		$v = $v + 0;
-	}
-	return $v;
-}
-
-
-
-
-
-######################################################################
-# MYMETA Support
-
-sub WriteMyMeta {
-	die "WriteMyMeta has been deprecated";
-}
-
-sub write_mymeta_yaml {
-	my $self = shift;
-
-	# We need YAML::Tiny to write the MYMETA.yml file
-	unless ( eval { require YAML::Tiny; 1; } ) {
-		return 1;
-	}
-
-	# Generate the data
-	my $meta = $self->_write_mymeta_data or return 1;
-
-	# Save as the MYMETA.yml file
-	print "Writing MYMETA.yml\n";
-	YAML::Tiny::DumpFile('MYMETA.yml', $meta);
-}
-
-sub write_mymeta_json {
-	my $self = shift;
-
-	# We need JSON to write the MYMETA.json file
-	unless ( eval { require JSON; 1; } ) {
-		return 1;
-	}
-
-	# Generate the data
-	my $meta = $self->_write_mymeta_data or return 1;
-
-	# Save as the MYMETA.yml file
-	print "Writing MYMETA.json\n";
-	Module::Install::_write(
-		'MYMETA.json',
-		JSON->new->pretty(1)->canonical->encode($meta),
-	);
-}
-
-sub _write_mymeta_data {
-	my $self = shift;
-
-	# If there's no existing META.yml there is nothing we can do
-	return undef unless -f 'META.yml';
-
-	# We need Parse::CPAN::Meta to load the file
-	unless ( eval { require Parse::CPAN::Meta; 1; } ) {
-		return undef;
-	}
-
-	# Merge the perl version into the dependencies
-	my $val  = $self->Meta->{values};
-	my $perl = delete $val->{perl_version};
-	if ( $perl ) {
-		$val->{requires} ||= [];
-		my $requires = $val->{requires};
-
-		# Canonize to three-dot version after Perl 5.6
-		if ( $perl >= 5.006 ) {
-			$perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e
-		}
-		unshift @$requires, [ perl => $perl ];
-	}
-
-	# Load the advisory META.yml file
-	my @yaml = Parse::CPAN::Meta::LoadFile('META.yml');
-	my $meta = $yaml[0];
-
-	# Overwrite the non-configure dependency hashs
-	delete $meta->{requires};
-	delete $meta->{build_requires};
-	delete $meta->{recommends};
-	if ( exists $val->{requires} ) {
-		$meta->{requires} = { map { @$_ } @{ $val->{requires} } };
-	}
-	if ( exists $val->{build_requires} ) {
-		$meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } };
-	}
-
-	return $meta;
-}
-
-1;
@@ -1,88 +0,0 @@
-#line 1
-package Module::Install::Repository;
-
-use strict;
-use 5.005;
-use vars qw($VERSION);
-$VERSION = '0.05';
-
-use base qw(Module::Install::Base);
-
-sub _execute {
-    my ($command) = @_;
-    `$command`;
-}
-
-sub auto_set_repository {
-    my $self = shift;
-
-    return unless $Module::Install::AUTHOR;
-
-    my $repo = _find_repo(\&_execute);
-    if ($repo) {
-        $self->repository($repo);
-    } else {
-        warn "Cannot determine repository URL\n";
-    }
-}
-
-sub _find_repo {
-    my ($execute) = @_;
-
-    if (-e ".git") {
-        # TODO support remote besides 'origin'?
-        if ($execute->('git remote show -n origin') =~ /URL: (.*)$/m) {
-            # XXX Make it public clone URL, but this only works with github
-            my $git_url = $1;
-            $git_url =~ s![\w\-]+\@([^:]+):!git://$1/!;
-            return $git_url;
-        } elsif ($execute->('git svn info') =~ /URL: (.*)$/m) {
-            return $1;
-        }
-    } elsif (-e ".svn") {
-        if (`svn info` =~ /URL: (.*)$/m) {
-            return $1;
-        }
-    } elsif (-e "_darcs") {
-        # defaultrepo is better, but that is more likely to be ssh, not http
-        if (my $query_repo = `darcs query repo`) {
-            if ($query_repo =~ m!Default Remote: (http://.+)!) {
-                return $1;
-            }
-        }
-
-        open my $handle, '<', '_darcs/prefs/repos' or return;
-        while (<$handle>) {
-            chomp;
-            return $_ if m!^http://!;
-        }
-    } elsif (-e ".hg") {
-        if ($execute->('hg paths') =~ /default = (.*)$/m) {
-            my $mercurial_url = $1;
-            $mercurial_url =~ s!^ssh://hg\@(bitbucket\.org/)!https://$1!;
-            return $mercurial_url;
-        }
-    } elsif (-e "$ENV{HOME}/.svk") {
-        # Is there an explicit way to check if it's an svk checkout?
-        my $svk_info = `svk info` or return;
-        SVK_INFO: {
-            if ($svk_info =~ /Mirrored From: (.*), Rev\./) {
-                return $1;
-            }
-
-            if ($svk_info =~ m!Merged From: (/mirror/.*), Rev\.!) {
-                $svk_info = `svk info /$1` or return;
-                redo SVK_INFO;
-            }
-        }
-
-        return;
-    }
-}
-
-1;
-__END__
-
-=encoding utf-8
-
-#line 128
@@ -1,29 +0,0 @@
-#line 1
-package Module::Install::TestBase;
-use strict;
-use warnings;
-
-use Module::Install::Base;
-
-use vars qw($VERSION @ISA);
-BEGIN {
-    $VERSION = '0.11';
-    @ISA     = 'Module::Install::Base';
-}
-
-sub use_test_base {
-    my $self = shift;
-    $self->include('Test::Base');
-    $self->include('Test::Base::Filter');
-    $self->include('Spiffy');
-    $self->include('Test::More');
-    $self->include('Test::Builder');
-    $self->include('Test::Builder::Module');
-    $self->requires('Filter::Util::Call');
-}
-
-1;
-
-=encoding utf8
-
-#line 70
@@ -1,64 +0,0 @@
-#line 1
-package Module::Install::Win32;
-
-use strict;
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';
-	@ISA     = 'Module::Install::Base';
-	$ISCORE  = 1;
-}
-
-# determine if the user needs nmake, and download it if needed
-sub check_nmake {
-	my $self = shift;
-	$self->load('can_run');
-	$self->load('get_file');
-
-	require Config;
-	return unless (
-		$^O eq 'MSWin32'                     and
-		$Config::Config{make}                and
-		$Config::Config{make} =~ /^nmake\b/i and
-		! $self->can_run('nmake')
-	);
-
-	print "The required 'nmake' executable not found, fetching it...\n";
-
-	require File::Basename;
-	my $rv = $self->get_file(
-		url       => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe',
-		ftp_url   => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe',
-		local_dir => File::Basename::dirname($^X),
-		size      => 51928,
-		run       => 'Nmake15.exe /o > nul',
-		check_for => 'Nmake.exe',
-		remove    => 1,
-	);
-
-	die <<'END_MESSAGE' unless $rv;
-
--------------------------------------------------------------------------------
-
-Since you are using Microsoft Windows, you will need the 'nmake' utility
-before installation. It's available at:
-
-  http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe
-      or
-  ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe
-
-Please download the file manually, save it to a directory in %PATH% (e.g.
-C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to
-that directory, and run "Nmake15.exe" from there; that will create the
-'nmake.exe' file needed by this module.
-
-You may then resume the installation process described in README.
-
--------------------------------------------------------------------------------
-END_MESSAGE
-
-}
-
-1;
@@ -1,60 +0,0 @@
-#line 1
-package Module::Install::WriteAll;
-
-use strict;
-use Module::Install::Base ();
-
-use vars qw{$VERSION @ISA $ISCORE};
-BEGIN {
-	$VERSION = '0.91';;
-	@ISA     = qw{Module::Install::Base};
-	$ISCORE  = 1;
-}
-
-sub WriteAll {
-	my $self = shift;
-	my %args = (
-		meta        => 1,
-		sign        => 0,
-		inline      => 0,
-		check_nmake => 1,
-		@_,
-	);
-
-	$self->sign(1)                if $args{sign};
-	$self->admin->WriteAll(%args) if $self->is_admin;
-
-	$self->check_nmake if $args{check_nmake};
-	unless ( $self->makemaker_args->{PL_FILES} ) {
-		$self->makemaker_args( PL_FILES => {} );
-	}
-
-	# Until ExtUtils::MakeMaker support MYMETA.yml, make sure
-	# we clean it up properly ourself.
-	$self->realclean_files('MYMETA.yml');
-
-	if ( $args{inline} ) {
-		$self->Inline->write;
-	} else {
-		$self->Makefile->write;
-	}
-
-	# The Makefile write process adds a couple of dependencies,
-	# so write the META.yml files after the Makefile.
-	if ( $args{meta} ) {
-		$self->Meta->write;
-	}
-
-	# Experimental support for MYMETA
-	if ( $ENV{X_MYMETA} ) {
-		if ( $ENV{X_MYMETA} eq 'JSON' ) {
-			$self->Meta->write_mymeta_json;
-		} else {
-			$self->Meta->write_mymeta_yaml;
-		}
-	}
-
-	return 1;
-}
-
-1;
@@ -1,430 +0,0 @@
-#line 1
-package Module::Install;
-
-# For any maintainers:
-# The load order for Module::Install is a bit magic.
-# It goes something like this...
-#
-# IF ( host has Module::Install installed, creating author mode ) {
-#     1. Makefile.PL calls "use inc::Module::Install"
-#     2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install
-#     3. The installed version of inc::Module::Install loads
-#     4. inc::Module::Install calls "require Module::Install"
-#     5. The ./inc/ version of Module::Install loads
-# } ELSE {
-#     1. Makefile.PL calls "use inc::Module::Install"
-#     2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install
-#     3. The ./inc/ version of Module::Install loads
-# }
-
-use 5.005;
-use strict 'vars';
-
-use vars qw{$VERSION $MAIN};
-BEGIN {
-	# All Module::Install core packages now require synchronised versions.
-	# This will be used to ensure we don't accidentally load old or
-	# different versions of modules.
-	# This is not enforced yet, but will be some time in the next few
-	# releases once we can make sure it won't clash with custom
-	# Module::Install extensions.
-	$VERSION = '0.91';
-
-	# Storage for the pseudo-singleton
-	$MAIN    = undef;
-
-	*inc::Module::Install::VERSION = *VERSION;
-	@inc::Module::Install::ISA     = __PACKAGE__;
-
-}
-
-
-
-
-
-# Whether or not inc::Module::Install is actually loaded, the
-# $INC{inc/Module/Install.pm} is what will still get set as long as
-# the caller loaded module this in the documented manner.
-# If not set, the caller may NOT have loaded the bundled version, and thus
-# they may not have a MI version that works with the Makefile.PL. This would
-# result in false errors or unexpected behaviour. And we don't want that.
-my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm';
-unless ( $INC{$file} ) { die <<"END_DIE" }
-
-Please invoke ${\__PACKAGE__} with:
-
-	use inc::${\__PACKAGE__};
-
-not:
-
-	use ${\__PACKAGE__};
-
-END_DIE
-
-
-
-
-
-# If the script that is loading Module::Install is from the future,
-# then make will detect this and cause it to re-run over and over
-# again. This is bad. Rather than taking action to touch it (which
-# is unreliable on some platforms and requires write permissions)
-# for now we should catch this and refuse to run.
-if ( -f $0 ) {
-	my $s = (stat($0))[9];
-
-	# If the modification time is only slightly in the future,
-	# sleep briefly to remove the problem.
-	my $a = $s - time;
-	if ( $a > 0 and $a < 5 ) { sleep 5 }
-
-	# Too far in the future, throw an error.
-	my $t = time;
-	if ( $s > $t ) { die <<"END_DIE" }
-
-Your installer $0 has a modification time in the future ($s > $t).
-
-This is known to create infinite loops in make.
-
-Please correct this, then run $0 again.
-
-END_DIE
-}
-
-
-
-
-
-# Build.PL was formerly supported, but no longer is due to excessive
-# difficulty in implementing every single feature twice.
-if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" }
-
-Module::Install no longer supports Build.PL.
-
-It was impossible to maintain duel backends, and has been deprecated.
-
-Please remove all Build.PL files and only use the Makefile.PL installer.
-
-END_DIE
-
-
-
-
-
-# To save some more typing in Module::Install installers, every...
-# use inc::Module::Install
-# ...also acts as an implicit use strict.
-$^H |= strict::bits(qw(refs subs vars));
-
-
-
-
-
-use Cwd        ();
-use File::Find ();
-use File::Path ();
-use FindBin;
-
-sub autoload {
-	my $self = shift;
-	my $who  = $self->_caller;
-	my $cwd  = Cwd::cwd();
-	my $sym  = "${who}::AUTOLOAD";
-	$sym->{$cwd} = sub {
-		my $pwd = Cwd::cwd();
-		if ( my $code = $sym->{$pwd} ) {
-			# Delegate back to parent dirs
-			goto &$code unless $cwd eq $pwd;
-		}
-		$$sym =~ /([^:]+)$/ or die "Cannot autoload $who - $sym";
-		my $method = $1;
-		if ( uc($method) eq $method ) {
-			# Do nothing
-			return;
-		} elsif ( $method =~ /^_/ and $self->can($method) ) {
-			# Dispatch to the root M:I class
-			return $self->$method(@_);
-		}
-
-		# Dispatch to the appropriate plugin
-		unshift @_, ( $self, $1 );
-		goto &{$self->can('call')};
-	};
-}
-
-sub import {
-	my $class = shift;
-	my $self  = $class->new(@_);
-	my $who   = $self->_caller;
-
-	unless ( -f $self->{file} ) {
-		require "$self->{path}/$self->{dispatch}.pm";
-		File::Path::mkpath("$self->{prefix}/$self->{author}");
-		$self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self );
-		$self->{admin}->init;
-		@_ = ($class, _self => $self);
-		goto &{"$self->{name}::import"};
-	}
-
-	*{"${who}::AUTOLOAD"} = $self->autoload;
-	$self->preload;
-
-	# Unregister loader and worker packages so subdirs can use them again
-	delete $INC{"$self->{file}"};
-	delete $INC{"$self->{path}.pm"};
-
-	# Save to the singleton
-	$MAIN = $self;
-
-	return 1;
-}
-
-sub preload {
-	my $self = shift;
-	unless ( $self->{extensions} ) {
-		$self->load_extensions(
-			"$self->{prefix}/$self->{path}", $self
-		);
-	}
-
-	my @exts = @{$self->{extensions}};
-	unless ( @exts ) {
-		@exts = $self->{admin}->load_all_extensions;
-	}
-
-	my %seen;
-	foreach my $obj ( @exts ) {
-		while (my ($method, $glob) = each %{ref($obj) . '::'}) {
-			next unless $obj->can($method);
-			next if $method =~ /^_/;
-			next if $method eq uc($method);
-			$seen{$method}++;
-		}
-	}
-
-	my $who = $self->_caller;
-	foreach my $name ( sort keys %seen ) {
-		*{"${who}::$name"} = sub {
-			${"${who}::AUTOLOAD"} = "${who}::$name";
-			goto &{"${who}::AUTOLOAD"};
-		};
-	}
-}
-
-sub new {
-	my ($class, %args) = @_;
-
-	# ignore the prefix on extension modules built from top level.
-	my $base_path = Cwd::abs_path($FindBin::Bin);
-	unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) {
-		delete $args{prefix};
-	}
-
-	return $args{_self} if $args{_self};
-
-	$args{dispatch} ||= 'Admin';
-	$args{prefix}   ||= 'inc';
-	$args{author}   ||= ($^O eq 'VMS' ? '_author' : '.author');
-	$args{bundle}   ||= 'inc/BUNDLES';
-	$args{base}     ||= $base_path;
-	$class =~ s/^\Q$args{prefix}\E:://;
-	$args{name}     ||= $class;
-	$args{version}  ||= $class->VERSION;
-	unless ( $args{path} ) {
-		$args{path}  = $args{name};
-		$args{path}  =~ s!::!/!g;
-	}
-	$args{file}     ||= "$args{base}/$args{prefix}/$args{path}.pm";
-	$args{wrote}      = 0;
-
-	bless( \%args, $class );
-}
-
-sub call {
-	my ($self, $method) = @_;
-	my $obj = $self->load($method) or return;
-        splice(@_, 0, 2, $obj);
-	goto &{$obj->can($method)};
-}
-
-sub load {
-	my ($self, $method) = @_;
-
-	$self->load_extensions(
-		"$self->{prefix}/$self->{path}", $self
-	) unless $self->{extensions};
-
-	foreach my $obj (@{$self->{extensions}}) {
-		return $obj if $obj->can($method);
-	}
-
-	my $admin = $self->{admin} or die <<"END_DIE";
-The '$method' method does not exist in the '$self->{prefix}' path!
-Please remove the '$self->{prefix}' directory and run $0 again to load it.
-END_DIE
-
-	my $obj = $admin->load($method, 1);
-	push @{$self->{extensions}}, $obj;
-
-	$obj;
-}
-
-sub load_extensions {
-	my ($self, $path, $top) = @_;
-
-	unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) {
-		unshift @INC, $self->{prefix};
-	}
-
-	foreach my $rv ( $self->find_extensions($path) ) {
-		my ($file, $pkg) = @{$rv};
-		next if $self->{pathnames}{$pkg};
-
-		local $@;
-		my $new = eval { require $file; $pkg->can('new') };
-		unless ( $new ) {
-			warn $@ if $@;
-			next;
-		}
-		$self->{pathnames}{$pkg} = delete $INC{$file};
-		push @{$self->{extensions}}, &{$new}($pkg, _top => $top );
-	}
-
-	$self->{extensions} ||= [];
-}
-
-sub find_extensions {
-	my ($self, $path) = @_;
-
-	my @found;
-	File::Find::find( sub {
-		my $file = $File::Find::name;
-		return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is;
-		my $subpath = $1;
-		return if lc($subpath) eq lc($self->{dispatch});
-
-		$file = "$self->{path}/$subpath.pm";
-		my $pkg = "$self->{name}::$subpath";
-		$pkg =~ s!/!::!g;
-
-		# If we have a mixed-case package name, assume case has been preserved
-		# correctly.  Otherwise, root through the file to locate the case-preserved
-		# version of the package name.
-		if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) {
-			my $content = Module::Install::_read($subpath . '.pm');
-			my $in_pod  = 0;
-			foreach ( split //, $content ) {
-				$in_pod = 1 if /^=\w/;
-				$in_pod = 0 if /^=cut/;
-				next if ($in_pod || /^=cut/);  # skip pod text
-				next if /^\s*#/;               # and comments
-				if ( m/^\s*package\s+($pkg)\s*;/i ) {
-					$pkg = $1;
-					last;
-				}
-			}
-		}
-
-		push @found, [ $file, $pkg ];
-	}, $path ) if -d $path;
-
-	@found;
-}
-
-
-
-
-
-#####################################################################
-# Common Utility Functions
-
-sub _caller {
-	my $depth = 0;
-	my $call  = caller($depth);
-	while ( $call eq __PACKAGE__ ) {
-		$depth++;
-		$call = caller($depth);
-	}
-	return $call;
-}
-
-sub _read {
-	local *FH;
-	if ( $] >= 5.006 ) {
-		open( FH, '<', $_[0] ) or die "open($_[0]): $!";
-	} else {
-		open( FH, "< $_[0]"  ) or die "open($_[0]): $!";
-	}
-	my $string = do { local $/; <FH> };
-	close FH or die "close($_[0]): $!";
-	return $string;
-}
-
-sub _readperl {
-	my $string = Module::Install::_read($_[0]);
-	$string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg;
-	$string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s;
-	$string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg;
-	return $string;
-}
-
-sub _readpod {
-	my $string = Module::Install::_read($_[0]);
-	$string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg;
-	return $string if $_[0] =~ /\.pod\z/;
-	$string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg;
-	$string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg;
-	$string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg;
-	$string =~ s/^\n+//s;
-	return $string;
-}
-
-sub _write {
-	local *FH;
-	if ( $] >= 5.006 ) {
-		open( FH, '>', $_[0] ) or die "open($_[0]): $!";
-	} else {
-		open( FH, "> $_[0]"  ) or die "open($_[0]): $!";
-	}
-	foreach ( 1 .. $#_ ) {
-		print FH $_[$_] or die "print($_[0]): $!";
-	}
-	close FH or die "close($_[0]): $!";
-}
-
-# _version is for processing module versions (eg, 1.03_05) not
-# Perl versions (eg, 5.8.1).
-sub _version ($) {
-	my $s = shift || 0;
-	my $d =()= $s =~ /(\.)/g;
-	if ( $d >= 2 ) {
-		# Normalise multipart versions
-		$s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg;
-	}
-	$s =~ s/^(\d+)\.?//;
-	my $l = $1 || 0;
-	my @v = map {
-		$_ . '0' x (3 - length $_)
-	} $s =~ /(\d{1,3})\D?/g;
-	$l = $l . '.' . join '', @v if @v;
-	return $l + 0;
-}
-
-sub _cmp ($$) {
-	_version($_[0]) <=> _version($_[1]);
-}
-
-# Cloned from Params::Util::_CLASS
-sub _CLASS ($) {
-	(
-		defined $_[0]
-		and
-		! ref $_[0]
-		and
-		$_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s
-	) ? $_[0] : undef;
-}
-
-1;
-
-# Copyright 2008 - 2009 Adam Kennedy.
@@ -1,539 +0,0 @@
-#line 1
-package Spiffy;
-use strict;
-use 5.006001;
-use warnings;
-use Carp;
-require Exporter;
-our $VERSION = '0.30';
-our @EXPORT = ();
-our @EXPORT_BASE = qw(field const stub super);
-our @EXPORT_OK = (@EXPORT_BASE, qw(id WWW XXX YYY ZZZ));
-our %EXPORT_TAGS = (XXX => [qw(WWW XXX YYY ZZZ)]);
-
-my $stack_frame = 0; 
-my $dump = 'yaml';
-my $bases_map = {};
-
-sub WWW; sub XXX; sub YYY; sub ZZZ;
-
-# This line is here to convince "autouse" into believing we are autousable.
-sub can {
-    ($_[1] eq 'import' and caller()->isa('autouse'))
-        ? \&Exporter::import        # pacify autouse's equality test
-        : $_[0]->SUPER::can($_[1])  # normal case
-}
-
-# TODO
-#
-# Exported functions like field and super should be hidden so as not to
-# be confused with methods that can be inherited.
-#
-
-sub new {
-    my $class = shift;
-    $class = ref($class) || $class;
-    my $self = bless {}, $class;
-    while (@_) {
-        my $method = shift;
-        $self->$method(shift);
-    }
-    return $self;    
-}
-
-my $filtered_files = {};
-my $filter_dump = 0;
-my $filter_save = 0;
-our $filter_result = '';
-sub import {
-    no strict 'refs'; 
-    no warnings;
-    my $self_package = shift;
-
-    # XXX Using parse_arguments here might cause confusion, because the
-    # subclass's boolean_arguments and paired_arguments can conflict, causing
-    # difficult debugging. Consider using something truly local.
-    my ($args, @export_list) = do {
-        local *boolean_arguments = sub { 
-            qw(
-                -base -Base -mixin -selfless 
-                -XXX -dumper -yaml 
-                -filter_dump -filter_save
-            ) 
-        };
-        local *paired_arguments = sub { qw(-package) };
-        $self_package->parse_arguments(@_);
-    };
-    return spiffy_mixin_import(scalar(caller(0)), $self_package, @export_list)
-      if $args->{-mixin};
-
-    $filter_dump = 1 if $args->{-filter_dump};
-    $filter_save = 1 if $args->{-filter_save};
-    $dump = 'yaml' if $args->{-yaml};
-    $dump = 'dumper' if $args->{-dumper};
-
-    local @EXPORT_BASE = @EXPORT_BASE;
-
-    if ($args->{-XXX}) {
-        push @EXPORT_BASE, @{$EXPORT_TAGS{XXX}}
-          unless grep /^XXX$/, @EXPORT_BASE;
-    }
-
-    spiffy_filter() 
-      if ($args->{-selfless} or $args->{-Base}) and 
-         not $filtered_files->{(caller($stack_frame))[1]}++;
-
-    my $caller_package = $args->{-package} || caller($stack_frame);
-    push @{"$caller_package\::ISA"}, $self_package
-      if $args->{-Base} or $args->{-base};
-
-    for my $class (@{all_my_bases($self_package)}) {
-        next unless $class->isa('Spiffy');
-        my @export = grep {
-            not defined &{"$caller_package\::$_"};
-        } ( @{"$class\::EXPORT"}, 
-            ($args->{-Base} or $args->{-base})
-              ? @{"$class\::EXPORT_BASE"} : (),
-          );
-        my @export_ok = grep {
-            not defined &{"$caller_package\::$_"};
-        } @{"$class\::EXPORT_OK"};
-
-        # Avoid calling the expensive Exporter::export 
-        # if there is nothing to do (optimization)
-        my %exportable = map { ($_, 1) } @export, @export_ok;
-        next unless keys %exportable;
-
-        my @export_save = @{"$class\::EXPORT"};
-        my @export_ok_save = @{"$class\::EXPORT_OK"};
-        @{"$class\::EXPORT"} = @export;
-        @{"$class\::EXPORT_OK"} = @export_ok;
-        my @list = grep {
-            (my $v = $_) =~ s/^[\!\:]//;
-            $exportable{$v} or ${"$class\::EXPORT_TAGS"}{$v};
-        } @export_list;
-        Exporter::export($class, $caller_package, @list);
-        @{"$class\::EXPORT"} = @export_save;
-        @{"$class\::EXPORT_OK"} = @export_ok_save;
-    }
-}
-
-sub spiffy_filter {
-    require Filter::Util::Call;
-    my $done = 0;
-    Filter::Util::Call::filter_add(
-        sub {
-            return 0 if $done;
-            my ($data, $end) = ('', '');
-            while (my $status = Filter::Util::Call::filter_read()) {
-                return $status if $status < 0;
-                if (/^__(?:END|DATA)__\r?$/) {
-                    $end = $_;
-                    last;
-                }
-                $data .= $_;
-                $_ = '';
-            }
-            $_ = $data;
-            my @my_subs;
-            s[^(sub\s+\w+\s+\{)(.*\n)]
-             [${1}my \$self = shift;$2]gm;
-            s[^(sub\s+\w+)\s*\(\s*\)(\s+\{.*\n)]
-             [${1}${2}]gm;
-            s[^my\s+sub\s+(\w+)(\s+\{)(.*)((?s:.*?\n))\}\n]
-             [push @my_subs, $1; "\$$1 = sub$2my \$self = shift;$3$4\};\n"]gem;
-            my $preclare = '';
-            if (@my_subs) {
-                $preclare = join ',', map "\$$_", @my_subs;
-                $preclare = "my($preclare);";
-            }
-            $_ = "use strict;use warnings;$preclare${_};1;\n$end";
-            if ($filter_dump) { print; exit }
-            if ($filter_save) { $filter_result = $_; $_ = $filter_result; }
-            $done = 1;
-        }
-    );
-}
-
-sub base {
-    push @_, -base;
-    goto &import;
-}
-
-sub all_my_bases {
-    my $class = shift;
-
-    return $bases_map->{$class} 
-      if defined $bases_map->{$class};
-
-    my @bases = ($class);
-    no strict 'refs';
-    for my $base_class (@{"${class}::ISA"}) {
-        push @bases, @{all_my_bases($base_class)};
-    }
-    my $used = {};
-    $bases_map->{$class} = [grep {not $used->{$_}++} @bases];
-}
-
-my %code = ( 
-    sub_start => 
-      "sub {\n",
-    set_default => 
-      "  \$_[0]->{%s} = %s\n    unless exists \$_[0]->{%s};\n",
-    init =>
-      "  return \$_[0]->{%s} = do { my \$self = \$_[0]; %s }\n" .
-      "    unless \$#_ > 0 or defined \$_[0]->{%s};\n",
-    weak_init =>
-      "  return do {\n" .
-      "    \$_[0]->{%s} = do { my \$self = \$_[0]; %s };\n" .
-      "    Scalar::Util::weaken(\$_[0]->{%s}) if ref \$_[0]->{%s};\n" .
-      "    \$_[0]->{%s};\n" .
-      "  } unless \$#_ > 0 or defined \$_[0]->{%s};\n",
-    return_if_get => 
-      "  return \$_[0]->{%s} unless \$#_ > 0;\n",
-    set => 
-      "  \$_[0]->{%s} = \$_[1];\n",
-    weaken => 
-      "  Scalar::Util::weaken(\$_[0]->{%s}) if ref \$_[0]->{%s};\n",
-    sub_end => 
-      "  return \$_[0]->{%s};\n}\n",
-);
-
-sub field {
-    my $package = caller;
-    my ($args, @values) = do {
-        no warnings;
-        local *boolean_arguments = sub { (qw(-weak)) };
-        local *paired_arguments = sub { (qw(-package -init)) };
-        Spiffy->parse_arguments(@_);
-    };
-    my ($field, $default) = @values;
-    $package = $args->{-package} if defined $args->{-package};
-    die "Cannot have a default for a weakened field ($field)"
-        if defined $default && $args->{-weak};
-    return if defined &{"${package}::$field"};
-    require Scalar::Util if $args->{-weak};
-    my $default_string =
-        ( ref($default) eq 'ARRAY' and not @$default )
-        ? '[]'
-        : (ref($default) eq 'HASH' and not keys %$default )
-          ? '{}'
-          : default_as_code($default);
-
-    my $code = $code{sub_start};
-    if ($args->{-init}) {
-        my $fragment = $args->{-weak} ? $code{weak_init} : $code{init};
-        $code .= sprintf $fragment, $field, $args->{-init}, ($field) x 4;
-    }
-    $code .= sprintf $code{set_default}, $field, $default_string, $field
-      if defined $default;
-    $code .= sprintf $code{return_if_get}, $field;
-    $code .= sprintf $code{set}, $field;
-    $code .= sprintf $code{weaken}, $field, $field 
-      if $args->{-weak};
-    $code .= sprintf $code{sub_end}, $field;
-
-    my $sub = eval $code;
-    die $@ if $@;
-    no strict 'refs';
-    *{"${package}::$field"} = $sub;
-    return $code if defined wantarray;
-}
-
-sub default_as_code {
-    require Data::Dumper;
-    local $Data::Dumper::Sortkeys = 1;
-    my $code = Data::Dumper::Dumper(shift);
-    $code =~ s/^\$VAR1 = //;
-    $code =~ s/;$//;
-    return $code;
-}
-
-sub const {
-    my $package = caller;
-    my ($args, @values) = do {
-        no warnings;
-        local *paired_arguments = sub { (qw(-package)) };
-        Spiffy->parse_arguments(@_);
-    };
-    my ($field, $default) = @values;
-    $package = $args->{-package} if defined $args->{-package};
-    no strict 'refs';
-    return if defined &{"${package}::$field"};
-    *{"${package}::$field"} = sub { $default }
-}
-
-sub stub {
-    my $package = caller;
-    my ($args, @values) = do {
-        no warnings;
-        local *paired_arguments = sub { (qw(-package)) };
-        Spiffy->parse_arguments(@_);
-    };
-    my ($field, $default) = @values;
-    $package = $args->{-package} if defined $args->{-package};
-    no strict 'refs';
-    return if defined &{"${package}::$field"};
-    *{"${package}::$field"} = 
-    sub { 
-        require Carp;
-        Carp::confess 
-          "Method $field in package $package must be subclassed";
-    }
-}
-
-sub parse_arguments {
-    my $class = shift;
-    my ($args, @values) = ({}, ());
-    my %booleans = map { ($_, 1) } $class->boolean_arguments;
-    my %pairs = map { ($_, 1) } $class->paired_arguments;
-    while (@_) {
-        my $elem = shift;
-        if (defined $elem and defined $booleans{$elem}) {
-            $args->{$elem} = (@_ and $_[0] =~ /^[01]$/)
-            ? shift
-            : 1;
-        }
-        elsif (defined $elem and defined $pairs{$elem} and @_) {
-            $args->{$elem} = shift;
-        }
-        else {
-            push @values, $elem;
-        }
-    }
-    return wantarray ? ($args, @values) : $args;        
-}
-
-sub boolean_arguments { () }
-sub paired_arguments { () }
-
-# get a unique id for any node
-sub id {
-    if (not ref $_[0]) {
-        return 'undef' if not defined $_[0];
-        \$_[0] =~ /\((\w+)\)$/o or die;
-        return "$1-S";
-    }
-    require overload;
-    overload::StrVal($_[0]) =~ /\((\w+)\)$/o or die;
-    return $1;
-}
-
-#===============================================================================
-# It's super, man.
-#===============================================================================
-package DB;
-{
-    no warnings 'redefine';
-    sub super_args { 
-        my @dummy = caller(@_ ? $_[0] : 2); 
-        return @DB::args;
-    }
-}
-
-package Spiffy;
-sub super {
-    my $method;
-    my $frame = 1;
-    while ($method = (caller($frame++))[3]) {
-        $method =~ s/.*::// and last;
-    }
-    my @args = DB::super_args($frame);
-    @_ = @_ ? ($args[0], @_) : @args;
-    my $class = ref $_[0] ? ref $_[0] : $_[0];
-    my $caller_class = caller;
-    my $seen = 0;
-    my @super_classes = reverse grep {
-        ($seen or $seen = ($_ eq $caller_class)) ? 0 : 1;
-    } reverse @{all_my_bases($class)};
-    for my $super_class (@super_classes) {
-        no strict 'refs';
-        next if $super_class eq $class;
-        if (defined &{"${super_class}::$method"}) {
-            ${"$super_class\::AUTOLOAD"} = ${"$class\::AUTOLOAD"}
-              if $method eq 'AUTOLOAD';
-            return &{"${super_class}::$method"};
-        }
-    }
-    return;
-}
-
-#===============================================================================
-# This code deserves a spanking, because it is being very naughty.
-# It is exchanging base.pm's import() for its own, so that people
-# can use base.pm with Spiffy modules, without being the wiser.
-#===============================================================================
-my $real_base_import;
-my $real_mixin_import;
-
-BEGIN {
-    require base unless defined $INC{'base.pm'};
-    $INC{'mixin.pm'} ||= 'Spiffy/mixin.pm';
-    $real_base_import = \&base::import;
-    $real_mixin_import = \&mixin::import;
-    no warnings;
-    *base::import = \&spiffy_base_import;
-    *mixin::import = \&spiffy_mixin_import;
-}
-
-# my $i = 0;
-# while (my $caller = caller($i++)) {
-#     next unless $caller eq 'base' or $caller eq 'mixin';
-#     croak <<END;
-# Spiffy.pm must be loaded before calling 'use base' or 'use mixin' with a
-# Spiffy module. See the documentation of Spiffy.pm for details.
-# END
-# }
-
-sub spiffy_base_import {
-    my @base_classes = @_;
-    shift @base_classes;
-    no strict 'refs';
-    goto &$real_base_import
-      unless grep {
-          eval "require $_" unless %{"$_\::"};
-          $_->isa('Spiffy');
-      } @base_classes;
-    my $inheritor = caller(0);
-    for my $base_class (@base_classes) {
-        next if $inheritor->isa($base_class);
-        croak "Can't mix Spiffy and non-Spiffy classes in 'use base'.\n", 
-              "See the documentation of Spiffy.pm for details\n  "
-          unless $base_class->isa('Spiffy');
-        $stack_frame = 1; # tell import to use different caller
-        import($base_class, '-base');
-        $stack_frame = 0;
-    }
-}
-
-sub mixin {
-    my $self = shift;
-    my $target_class = ref($self);
-    spiffy_mixin_import($target_class, @_)
-}
-
-sub spiffy_mixin_import {
-    my $target_class = shift;
-    $target_class = caller(0)
-      if $target_class eq 'mixin';
-    my $mixin_class = shift
-      or die "Nothing to mixin";
-    eval "require $mixin_class";
-    my @roles = @_;
-    my $pseudo_class = join '-', $target_class, $mixin_class, @roles;
-    my %methods = spiffy_mixin_methods($mixin_class, @roles);
-    no strict 'refs';
-    no warnings;
-    @{"$pseudo_class\::ISA"} = @{"$target_class\::ISA"};
-    @{"$target_class\::ISA"} = ($pseudo_class);
-    for (keys %methods) {
-        *{"$pseudo_class\::$_"} = $methods{$_};
-    }
-}
-
-sub spiffy_mixin_methods {
-    my $mixin_class = shift;
-    no strict 'refs';
-    my %methods = spiffy_all_methods($mixin_class);
-    map {
-        $methods{$_}
-          ? ($_, \ &{"$methods{$_}\::$_"})
-          : ($_, \ &{"$mixin_class\::$_"})
-    } @_ 
-      ? (get_roles($mixin_class, @_))
-      : (keys %methods);
-}
-
-sub get_roles {
-    my $mixin_class = shift;
-    my @roles = @_;
-    while (grep /^!*:/, @roles) {
-        @roles = map {
-            s/!!//g;
-            /^!:(.*)/ ? do { 
-                my $m = "_role_$1"; 
-                map("!$_", $mixin_class->$m);
-            } :
-            /^:(.*)/ ? do {
-                my $m = "_role_$1"; 
-                ($mixin_class->$m);
-            } :
-            ($_)
-        } @roles;
-    }
-    if (@roles and $roles[0] =~ /^!/) {
-        my %methods = spiffy_all_methods($mixin_class);
-        unshift @roles, keys(%methods);
-    }
-    my %roles;
-    for (@roles) {
-        s/!!//g;
-        delete $roles{$1}, next
-          if /^!(.*)/;
-        $roles{$_} = 1;
-    }
-    keys %roles;
-}
-
-sub spiffy_all_methods {
-    no strict 'refs';
-    my $class = shift;
-    return if $class eq 'Spiffy';
-    my %methods = map {
-        ($_, $class)
-    } grep {
-        defined &{"$class\::$_"} and not /^_/
-    } keys %{"$class\::"};
-    my %super_methods;
-    %super_methods = spiffy_all_methods(${"$class\::ISA"}[0])
-      if @{"$class\::ISA"};
-    %{{%super_methods, %methods}};
-}
-
-
-# END of naughty code.
-#===============================================================================
-# Debugging support
-#===============================================================================
-sub spiffy_dump {
-    no warnings;
-    if ($dump eq 'dumper') {
-        require Data::Dumper;
-        $Data::Dumper::Sortkeys = 1;
-        $Data::Dumper::Indent = 1;
-        return Data::Dumper::Dumper(@_);
-    }
-    require YAML;
-    $YAML::UseVersion = 0;
-    return YAML::Dump(@_) . "...\n";
-}
-
-sub at_line_number {
-    my ($file_path, $line_number) = (caller(1))[1,2];
-    "  at $file_path line $line_number\n";
-}
-
-sub WWW {
-    warn spiffy_dump(@_) . at_line_number;
-    return wantarray ? @_ : $_[0];
-}
-
-sub XXX {
-    die spiffy_dump(@_) . at_line_number;
-}
-
-sub YYY {
-    print spiffy_dump(@_) . at_line_number;
-    return wantarray ? @_ : $_[0];
-}
-
-sub ZZZ {
-    require Carp;
-    Carp::confess spiffy_dump(@_);
-}
-
-1;
-
-__END__
-
-#line 1066
@@ -1,344 +0,0 @@
-#line 1
-#. TODO:
-#.
-
-#===============================================================================
-# This is the default class for handling Test::Base data filtering.
-#===============================================================================
-package Test::Base::Filter;
-use Spiffy -Base;
-use Spiffy ':XXX';
-
-field 'current_block';
-
-our $arguments;
-sub current_arguments {
-    return undef unless defined $arguments;
-    my $args = $arguments;
-    $args =~ s/(\\s)/ /g;
-    $args =~ s/(\\[a-z])/'"' . $1 . '"'/gee;
-    return $args;
-}
-
-sub assert_scalar {
-    return if @_ == 1;
-    require Carp;
-    my $filter = (caller(1))[3];
-    $filter =~ s/.*:://;
-    Carp::croak "Input to the '$filter' filter must be a scalar, not a list";
-}
-
-sub _apply_deepest {
-    my $method = shift;
-    return () unless @_;
-    if (ref $_[0] eq 'ARRAY') {
-        for my $aref (@_) {
-            @$aref = $self->_apply_deepest($method, @$aref);
-        }
-        return @_;
-    }
-    $self->$method(@_);
-}
-
-sub _split_array {
-    map {
-        [$self->split($_)];
-    } @_;
-}
-
-sub _peel_deepest {
-    return () unless @_;
-    if (ref $_[0] eq 'ARRAY') {
-        if (ref $_[0]->[0] eq 'ARRAY') {
-            for my $aref (@_) {
-                @$aref = $self->_peel_deepest(@$aref);
-            }
-            return @_;
-        }
-        return map { $_->[0] } @_;
-    }
-    return @_;
-}
-
-#===============================================================================
-# these filters work on the leaves of nested arrays
-#===============================================================================
-sub Join { $self->_peel_deepest($self->_apply_deepest(join => @_)) }
-sub Reverse { $self->_apply_deepest(reverse => @_) }
-sub Split { $self->_apply_deepest(_split_array => @_) }
-sub Sort { $self->_apply_deepest(sort => @_) }
-
-
-sub append {
-    my $suffix = $self->current_arguments;
-    map { $_ . $suffix } @_;
-}
-
-sub array {
-    return [@_];
-}
-
-sub base64_decode {
-    $self->assert_scalar(@_);
-    require MIME::Base64;
-    MIME::Base64::decode_base64(shift);
-}
-
-sub base64_encode {
-    $self->assert_scalar(@_);
-    require MIME::Base64;
-    MIME::Base64::encode_base64(shift);
-}
-
-sub chomp {
-    map { CORE::chomp; $_ } @_;
-}
-
-sub chop {
-    map { CORE::chop; $_ } @_;
-}
-
-sub dumper {
-    no warnings 'once';
-    require Data::Dumper;
-    local $Data::Dumper::Sortkeys = 1;
-    local $Data::Dumper::Indent = 1;
-    local $Data::Dumper::Terse = 1;
-    Data::Dumper::Dumper(@_);
-}
-
-sub escape {
-    $self->assert_scalar(@_);
-    my $text = shift;
-    $text =~ s/(\\.)/eval "qq{$1}"/ge;
-    return $text;
-}
-
-sub eval {
-    $self->assert_scalar(@_);
-    my @return = CORE::eval(shift);
-    return $@ if $@;
-    return @return;
-}
-
-sub eval_all {
-    $self->assert_scalar(@_);
-    my $out = '';
-    my $err = '';
-    Test::Base::tie_output(*STDOUT, $out);
-    Test::Base::tie_output(*STDERR, $err);
-    my $return = CORE::eval(shift);
-    no warnings;
-    untie *STDOUT;
-    untie *STDERR;
-    return $return, $@, $out, $err;
-}
-
-sub eval_stderr {
-    $self->assert_scalar(@_);
-    my $output = '';
-    Test::Base::tie_output(*STDERR, $output);
-    CORE::eval(shift);
-    no warnings;
-    untie *STDERR;
-    return $output;
-}
-
-sub eval_stdout {
-    $self->assert_scalar(@_);
-    my $output = '';
-    Test::Base::tie_output(*STDOUT, $output);
-    CORE::eval(shift);
-    no warnings;
-    untie *STDOUT;
-    return $output;
-}
-
-sub exec_perl_stdout {
-    my $tmpfile = "/tmp/test-blocks-$$";
-    $self->_write_to($tmpfile, @_);
-    open my $execution, "$^X $tmpfile 2>&1 |"
-      or die "Couldn't open subprocess: $!\n";
-    local $/;
-    my $output = <$execution>;
-    close $execution;
-    unlink($tmpfile)
-      or die "Couldn't unlink $tmpfile: $!\n";
-    return $output;
-}
-
-sub flatten {
-    $self->assert_scalar(@_);
-    my $ref = shift;
-    if (ref($ref) eq 'HASH') {
-        return map {
-            ($_, $ref->{$_});
-        } sort keys %$ref;
-    }
-    if (ref($ref) eq 'ARRAY') {
-        return @$ref;
-    }
-    die "Can only flatten a hash or array ref";
-}
-
-sub get_url {
-    $self->assert_scalar(@_);
-    my $url = shift;
-    CORE::chomp($url);
-    require LWP::Simple;
-    LWP::Simple::get($url);
-}
-
-sub hash {
-    return +{ @_ };
-}
-
-sub head {
-    my $size = $self->current_arguments || 1;
-    return splice(@_, 0, $size);
-}
-
-sub join {
-    my $string = $self->current_arguments;
-    $string = '' unless defined $string;
-    CORE::join $string, @_;
-}
-
-sub lines {
-    $self->assert_scalar(@_);
-    my $text = shift;
-    return () unless length $text;
-    my @lines = ($text =~ /^(.*\n?)/gm);
-    return @lines;
-}
-
-sub norm {
-    $self->assert_scalar(@_);
-    my $text = shift;
-    $text = '' unless defined $text;
-    $text =~ s/\015\012/\n/g;
-    $text =~ s/\r/\n/g;
-    return $text;
-}
-
-sub prepend {
-    my $prefix = $self->current_arguments;
-    map { $prefix . $_ } @_;
-}
-
-sub read_file {
-    $self->assert_scalar(@_);
-    my $file = shift;
-    CORE::chomp $file;
-    open my $fh, $file
-      or die "Can't open '$file' for input:\n$!";
-    CORE::join '', <$fh>;
-}
-
-sub regexp {
-    $self->assert_scalar(@_);
-    my $text = shift;
-    my $flags = $self->current_arguments;
-    if ($text =~ /\n.*?\n/s) {
-        $flags = 'xism'
-          unless defined $flags;
-    }
-    else {
-        CORE::chomp($text);
-    }
-    $flags ||= '';
-    my $regexp = eval "qr{$text}$flags";
-    die $@ if $@;
-    return $regexp;
-}
-
-sub reverse {
-    CORE::reverse(@_);
-}
-
-sub slice {
-    die "Invalid args for slice"
-      unless $self->current_arguments =~ /^(\d+)(?:,(\d))?$/;
-    my ($x, $y) = ($1, $2);
-    $y = $x if not defined $y;
-    die "Invalid args for slice"
-      if $x > $y;
-    return splice(@_, $x, 1 + $y - $x);
-}
-
-sub sort {
-    CORE::sort(@_);
-}
-
-sub split {
-    $self->assert_scalar(@_);
-    my $separator = $self->current_arguments;
-    if (defined $separator and $separator =~ s{^/(.*)/$}{$1}) {
-        my $regexp = $1;
-        $separator = qr{$regexp};
-    }
-    $separator = qr/\s+/ unless $separator;
-    CORE::split $separator, shift;
-}
-
-sub strict {
-    $self->assert_scalar(@_);
-    <<'...' . shift;
-use strict;
-use warnings;
-...
-}
-
-sub tail {
-    my $size = $self->current_arguments || 1;
-    return splice(@_, @_ - $size, $size);
-}
-
-sub trim {
-    map {
-        s/\A([ \t]*\n)+//;
-        s/(?<=\n)\s*\z//g;
-        $_;
-    } @_;
-}
-
-sub unchomp {
-    map { $_ . "\n" } @_;
-}
-
-sub write_file {
-    my $file = $self->current_arguments
-      or die "No file specified for write_file filter";
-    if ($file =~ /(.*)[\\\/]/) {
-        my $dir = $1;
-        if (not -e $dir) {
-            require File::Path;
-            File::Path::mkpath($dir)
-              or die "Can't create $dir";
-        }
-    }
-    open my $fh, ">$file"
-      or die "Can't open '$file' for output\n:$!";
-    print $fh @_;
-    close $fh;
-    return $file;
-}
-
-sub yaml {
-    $self->assert_scalar(@_);
-    require YAML;
-    return YAML::Load(shift);
-}
-
-sub _write_to {
-    my $filename = shift;
-    open my $script, ">$filename"
-      or die "Couldn't open $filename: $!\n";
-    print $script @_;
-    close $script
-      or die "Couldn't close $filename: $!\n";
-}
-
-__DATA__
-
-#line 639
@@ -1,684 +0,0 @@
-#line 1
-# TODO:
-#
-package Test::Base;
-use 5.006001;
-use Spiffy 0.30 -Base;
-use Spiffy ':XXX';
-our $VERSION = '0.58';
-
-my @test_more_exports;
-BEGIN {
-    @test_more_exports = qw(
-        ok isnt like unlike is_deeply cmp_ok
-        skip todo_skip pass fail
-        eq_array eq_hash eq_set
-        plan can_ok isa_ok diag
-        use_ok
-        $TODO
-    );
-}
-
-use Test::More import => \@test_more_exports;
-use Carp;
-
-our @EXPORT = (@test_more_exports, qw(
-    is no_diff
-
-    blocks next_block first_block
-    delimiters spec_file spec_string 
-    filters filters_delay filter_arguments
-    run run_compare run_is run_is_deeply run_like run_unlike 
-    skip_all_unless_require is_deep run_is_deep
-    WWW XXX YYY ZZZ
-    tie_output no_diag_on_only
-
-    find_my_self default_object
-
-    croak carp cluck confess
-));
-
-field '_spec_file';
-field '_spec_string';
-field _filters => [qw(norm trim)];
-field _filters_map => {};
-field spec =>
-      -init => '$self->_spec_init';
-field block_list =>
-      -init => '$self->_block_list_init';
-field _next_list => [];
-field block_delim =>
-      -init => '$self->block_delim_default';
-field data_delim =>
-      -init => '$self->data_delim_default';
-field _filters_delay => 0;
-field _no_diag_on_only => 0;
-
-field block_delim_default => '===';
-field data_delim_default => '---';
-
-my $default_class;
-my $default_object;
-my $reserved_section_names = {};
-
-sub default_object { 
-    $default_object ||= $default_class->new;
-    return $default_object;
-}
-
-my $import_called = 0;
-sub import() {
-    $import_called = 1;
-    my $class = (grep /^-base$/i, @_) 
-    ? scalar(caller)
-    : $_[0];
-    if (not defined $default_class) {
-        $default_class = $class;
-    }
-#     else {
-#         croak "Can't use $class after using $default_class"
-#           unless $default_class->isa($class);
-#     }
-
-    unless (grep /^-base$/i, @_) {
-        my @args;
-        for (my $ii = 1; $ii <= $#_; ++$ii) {
-            if ($_[$ii] eq '-package') {
-                ++$ii;
-            } else {
-                push @args, $_[$ii];
-            }
-        }
-        Test::More->import(import => \@test_more_exports, @args)
-            if @args;
-     }
-    
-    _strict_warnings();
-    goto &Spiffy::import;
-}
-
-# Wrap Test::Builder::plan
-my $plan_code = \&Test::Builder::plan;
-my $Have_Plan = 0;
-{
-    no warnings 'redefine';
-    *Test::Builder::plan = sub {
-        $Have_Plan = 1;
-        goto &$plan_code;
-    };
-}
-
-my $DIED = 0;
-$SIG{__DIE__} = sub { $DIED = 1; die @_ };
-
-sub block_class  { $self->find_class('Block') }
-sub filter_class { $self->find_class('Filter') }
-
-sub find_class {
-    my $suffix = shift;
-    my $class = ref($self) . "::$suffix";
-    return $class if $class->can('new');
-    $class = __PACKAGE__ . "::$suffix";
-    return $class if $class->can('new');
-    eval "require $class";
-    return $class if $class->can('new');
-    die "Can't find a class for $suffix";
-}
-
-sub check_late {
-    if ($self->{block_list}) {
-        my $caller = (caller(1))[3];
-        $caller =~ s/.*:://;
-        croak "Too late to call $caller()"
-    }
-}
-
-sub find_my_self() {
-    my $self = ref($_[0]) eq $default_class
-    ? splice(@_, 0, 1)
-    : default_object();
-    return $self, @_;
-}
-
-sub blocks() {
-    (my ($self), @_) = find_my_self(@_);
-
-    croak "Invalid arguments passed to 'blocks'"
-      if @_ > 1;
-    croak sprintf("'%s' is invalid argument to blocks()", shift(@_))
-      if @_ && $_[0] !~ /^[a-zA-Z]\w*$/;
-
-    my $blocks = $self->block_list;
-    
-    my $section_name = shift || '';
-    my @blocks = $section_name
-    ? (grep { exists $_->{$section_name} } @$blocks)
-    : (@$blocks);
-
-    return scalar(@blocks) unless wantarray;
-    
-    return (@blocks) if $self->_filters_delay;
-
-    for my $block (@blocks) {
-        $block->run_filters
-          unless $block->is_filtered;
-    }
-
-    return (@blocks);
-}
-
-sub next_block() {
-    (my ($self), @_) = find_my_self(@_);
-    my $list = $self->_next_list;
-    if (@$list == 0) {
-        $list = [@{$self->block_list}, undef];
-        $self->_next_list($list);
-    }
-    my $block = shift @$list;
-    if (defined $block and not $block->is_filtered) {
-        $block->run_filters;
-    }
-    return $block;
-}
-
-sub first_block() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_next_list([]);
-    $self->next_block;
-}
-
-sub filters_delay() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_filters_delay(defined $_[0] ? shift : 1);
-}
-
-sub no_diag_on_only() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_no_diag_on_only(defined $_[0] ? shift : 1);
-}
-
-sub delimiters() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->check_late;
-    my ($block_delimiter, $data_delimiter) = @_;
-    $block_delimiter ||= $self->block_delim_default;
-    $data_delimiter ||= $self->data_delim_default;
-    $self->block_delim($block_delimiter);
-    $self->data_delim($data_delimiter);
-    return $self;
-}
-
-sub spec_file() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->check_late;
-    $self->_spec_file(shift);
-    return $self;
-}
-
-sub spec_string() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->check_late;
-    $self->_spec_string(shift);
-    return $self;
-}
-
-sub filters() {
-    (my ($self), @_) = find_my_self(@_);
-    if (ref($_[0]) eq 'HASH') {
-        $self->_filters_map(shift);
-    }
-    else {    
-        my $filters = $self->_filters;
-        push @$filters, @_;
-    }
-    return $self;
-}
-
-sub filter_arguments() {
-    $Test::Base::Filter::arguments;
-}
-
-sub have_text_diff {
-    eval { require Text::Diff; 1 } &&
-        $Text::Diff::VERSION >= 0.35 &&
-        $Algorithm::Diff::VERSION >= 1.15;
-}
-
-sub is($$;$) {
-    (my ($self), @_) = find_my_self(@_);
-    my ($actual, $expected, $name) = @_;
-    local $Test::Builder::Level = $Test::Builder::Level + 1;
-    if ($ENV{TEST_SHOW_NO_DIFFS} or
-         not defined $actual or
-         not defined $expected or
-         $actual eq $expected or 
-         not($self->have_text_diff) or 
-         $expected !~ /\n./s
-    ) {
-        Test::More::is($actual, $expected, $name);
-    }
-    else {
-        $name = '' unless defined $name;
-        ok $actual eq $expected,
-           $name . "\n" . Text::Diff::diff(\$expected, \$actual);
-    }
-}
-
-sub run(&;$) {
-    (my ($self), @_) = find_my_self(@_);
-    my $callback = shift;
-    for my $block (@{$self->block_list}) {
-        $block->run_filters unless $block->is_filtered;
-        &{$callback}($block);
-    }
-}
-
-my $name_error = "Can't determine section names";
-sub _section_names {
-    return @_ if @_ == 2;
-    my $block = $self->first_block
-      or croak $name_error;
-    my @names = grep {
-        $_ !~ /^(ONLY|LAST|SKIP)$/;
-    } @{$block->{_section_order}[0] || []};
-    croak "$name_error. Need two sections in first block"
-      unless @names == 2;
-    return @names;
-}
-
-sub _assert_plan {
-    plan('no_plan') unless $Have_Plan;
-}
-
-sub END {
-    run_compare() unless $Have_Plan or $DIED or not $import_called;
-}
-
-sub run_compare() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_assert_plan;
-    my ($x, $y) = $self->_section_names(@_);
-    local $Test::Builder::Level = $Test::Builder::Level + 1;
-    for my $block (@{$self->block_list}) {
-        next unless exists($block->{$x}) and exists($block->{$y});
-        $block->run_filters unless $block->is_filtered;
-        if (ref $block->$x) {
-            is_deeply($block->$x, $block->$y,
-                $block->name ? $block->name : ());
-        }
-        elsif (ref $block->$y eq 'Regexp') {
-            my $regexp = ref $y ? $y : $block->$y;
-            like($block->$x, $regexp, $block->name ? $block->name : ());
-        }
-        else {
-            is($block->$x, $block->$y, $block->name ? $block->name : ());
-        }
-    }
-}
-
-sub run_is() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_assert_plan;
-    my ($x, $y) = $self->_section_names(@_);
-    local $Test::Builder::Level = $Test::Builder::Level + 1;
-    for my $block (@{$self->block_list}) {
-        next unless exists($block->{$x}) and exists($block->{$y});
-        $block->run_filters unless $block->is_filtered;
-        is($block->$x, $block->$y, 
-           $block->name ? $block->name : ()
-          );
-    }
-}
-
-sub run_is_deeply() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_assert_plan;
-    my ($x, $y) = $self->_section_names(@_);
-    for my $block (@{$self->block_list}) {
-        next unless exists($block->{$x}) and exists($block->{$y});
-        $block->run_filters unless $block->is_filtered;
-        is_deeply($block->$x, $block->$y, 
-           $block->name ? $block->name : ()
-          );
-    }
-}
-
-sub run_like() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_assert_plan;
-    my ($x, $y) = $self->_section_names(@_);
-    for my $block (@{$self->block_list}) {
-        next unless exists($block->{$x}) and defined($y);
-        $block->run_filters unless $block->is_filtered;
-        my $regexp = ref $y ? $y : $block->$y;
-        like($block->$x, $regexp,
-             $block->name ? $block->name : ()
-            );
-    }
-}
-
-sub run_unlike() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_assert_plan;
-    my ($x, $y) = $self->_section_names(@_);
-    for my $block (@{$self->block_list}) {
-        next unless exists($block->{$x}) and defined($y);
-        $block->run_filters unless $block->is_filtered;
-        my $regexp = ref $y ? $y : $block->$y;
-        unlike($block->$x, $regexp,
-               $block->name ? $block->name : ()
-              );
-    }
-}
-
-sub skip_all_unless_require() {
-    (my ($self), @_) = find_my_self(@_);
-    my $module = shift;
-    eval "require $module; 1"
-        or Test::More::plan(
-            skip_all => "$module failed to load"
-        );
-}
-
-sub is_deep() {
-    (my ($self), @_) = find_my_self(@_);
-    require Test::Deep;
-    Test::Deep::cmp_deeply(@_);
-}
-
-sub run_is_deep() {
-    (my ($self), @_) = find_my_self(@_);
-    $self->_assert_plan;
-    my ($x, $y) = $self->_section_names(@_);
-    for my $block (@{$self->block_list}) {
-        next unless exists($block->{$x}) and exists($block->{$y});
-        $block->run_filters unless $block->is_filtered;
-        is_deep($block->$x, $block->$y, 
-           $block->name ? $block->name : ()
-          );
-    }
-}
-
-sub _pre_eval {
-    my $spec = shift;
-    return $spec unless $spec =~
-      s/\A\s*<<<(.*?)>>>\s*$//sm;
-    my $eval_code = $1;
-    eval "package main; $eval_code";
-    croak $@ if $@;
-    return $spec;
-}
-
-sub _block_list_init {
-    my $spec = $self->spec;
-    $spec = $self->_pre_eval($spec);
-    my $cd = $self->block_delim;
-    my @hunks = ($spec =~ /^(\Q${cd}\E.*?(?=^\Q${cd}\E|\z))/msg);
-    my $blocks = $self->_choose_blocks(@hunks);
-    $self->block_list($blocks); # Need to set early for possible filter use
-    my $seq = 1;
-    for my $block (@$blocks) {
-        $block->blocks_object($self);
-        $block->seq_num($seq++);
-    }
-    return $blocks;
-}
-
-sub _choose_blocks {
-    my $blocks = [];
-    for my $hunk (@_) {
-        my $block = $self->_make_block($hunk);
-        if (exists $block->{ONLY}) {
-            diag "I found ONLY: maybe you're debugging?"
-                unless $self->_no_diag_on_only;
-            return [$block];
-        }
-        next if exists $block->{SKIP};
-        push @$blocks, $block;
-        if (exists $block->{LAST}) {
-            return $blocks;
-        }
-    }
-    return $blocks;
-}
-
-sub _check_reserved {
-    my $id = shift;
-    croak "'$id' is a reserved name. Use something else.\n"
-      if $reserved_section_names->{$id} or
-         $id =~ /^_/;
-}
-
-sub _make_block {
-    my $hunk = shift;
-    my $cd = $self->block_delim;
-    my $dd = $self->data_delim;
-    my $block = $self->block_class->new;
-    $hunk =~ s/\A\Q${cd}\E[ \t]*(.*)\s+// or die;
-    my $name = $1;
-    my @parts = split /^\Q${dd}\E +\(?(\w+)\)? *(.*)?\n/m, $hunk;
-    my $description = shift @parts;
-    $description ||= '';
-    unless ($description =~ /\S/) {
-        $description = $name;
-    }
-    $description =~ s/\s*\z//;
-    $block->set_value(description => $description);
-    
-    my $section_map = {};
-    my $section_order = [];
-    while (@parts) {
-        my ($type, $filters, $value) = splice(@parts, 0, 3);
-        $self->_check_reserved($type);
-        $value = '' unless defined $value;
-        $filters = '' unless defined $filters;
-        if ($filters =~ /:(\s|\z)/) {
-            croak "Extra lines not allowed in '$type' section"
-              if $value =~ /\S/;
-            ($filters, $value) = split /\s*:(?:\s+|\z)/, $filters, 2;
-            $value = '' unless defined $value;
-            $value =~ s/^\s*(.*?)\s*$/$1/;
-        }
-        $section_map->{$type} = {
-            filters => $filters,
-        };
-        push @$section_order, $type;
-        $block->set_value($type, $value);
-    }
-    $block->set_value(name => $name);
-    $block->set_value(_section_map => $section_map);
-    $block->set_value(_section_order => $section_order);
-    return $block;
-}
-
-sub _spec_init {
-    return $self->_spec_string
-      if $self->_spec_string;
-    local $/;
-    my $spec;
-    if (my $spec_file = $self->_spec_file) {
-        open FILE, $spec_file or die $!;
-        $spec = <FILE>;
-        close FILE;
-    }
-    else {    
-        $spec = do { 
-            package main; 
-            no warnings 'once';
-            <DATA>;
-        };
-    }
-    return $spec;
-}
-
-sub _strict_warnings() {
-    require Filter::Util::Call;
-    my $done = 0;
-    Filter::Util::Call::filter_add(
-        sub {
-            return 0 if $done;
-            my ($data, $end) = ('', '');
-            while (my $status = Filter::Util::Call::filter_read()) {
-                return $status if $status < 0;
-                if (/^__(?:END|DATA)__\r?$/) {
-                    $end = $_;
-                    last;
-                }
-                $data .= $_;
-                $_ = '';
-            }
-            $_ = "use strict;use warnings;$data$end";
-            $done = 1;
-        }
-    );
-}
-
-sub tie_output() {
-    my $handle = shift;
-    die "No buffer to tie" unless @_;
-    tie $handle, 'Test::Base::Handle', $_[0];
-}
-
-sub no_diff {
-    $ENV{TEST_SHOW_NO_DIFFS} = 1;
-}
-
-package Test::Base::Handle;
-
-sub TIEHANDLE() {
-    my $class = shift;
-    bless \ $_[0], $class;
-}
-
-sub PRINT {
-    $$self .= $_ for @_;
-}
-
-#===============================================================================
-# Test::Base::Block
-#
-# This is the default class for accessing a Test::Base block object.
-#===============================================================================
-package Test::Base::Block;
-our @ISA = qw(Spiffy);
-
-our @EXPORT = qw(block_accessor);
-
-sub AUTOLOAD {
-    return;
-}
-
-sub block_accessor() {
-    my $accessor = shift;
-    no strict 'refs';
-    return if defined &$accessor;
-    *$accessor = sub {
-        my $self = shift;
-        if (@_) {
-            Carp::croak "Not allowed to set values for '$accessor'";
-        }
-        my @list = @{$self->{$accessor} || []};
-        return wantarray
-        ? (@list)
-        : $list[0];
-    };
-}
-
-block_accessor 'name';
-block_accessor 'description';
-Spiffy::field 'seq_num';
-Spiffy::field 'is_filtered';
-Spiffy::field 'blocks_object';
-Spiffy::field 'original_values' => {};
-
-sub set_value {
-    no strict 'refs';
-    my $accessor = shift;
-    block_accessor $accessor
-      unless defined &$accessor;
-    $self->{$accessor} = [@_];
-}
-
-sub run_filters {
-    my $map = $self->_section_map;
-    my $order = $self->_section_order;
-    Carp::croak "Attempt to filter a block twice"
-      if $self->is_filtered;
-    for my $type (@$order) {
-        my $filters = $map->{$type}{filters};
-        my @value = $self->$type;
-        $self->original_values->{$type} = $value[0];
-        for my $filter ($self->_get_filters($type, $filters)) {
-            $Test::Base::Filter::arguments =
-              $filter =~ s/=(.*)$// ? $1 : undef;
-            my $function = "main::$filter";
-            no strict 'refs';
-            if (defined &$function) {
-                local $_ =
-                    (@value == 1 and not defined($value[0])) ? undef :
-                        join '', @value;
-                my $old = $_;
-                @value = &$function(@value);
-                if (not(@value) or 
-                    @value == 1 and defined($value[0]) and $value[0] =~ /\A(\d+|)\z/
-                ) {
-                    if ($value[0] && $_ eq $old) {
-                        Test::Base::diag("Filters returning numbers are supposed to do munging \$_: your filter '$function' apparently doesn't.");
-                    }
-                    @value = ($_);
-                }
-            }
-            else {
-                my $filter_object = $self->blocks_object->filter_class->new;
-                die "Can't find a function or method for '$filter' filter\n"
-                  unless $filter_object->can($filter);
-                $filter_object->current_block($self);
-                @value = $filter_object->$filter(@value);
-            }
-            # Set the value after each filter since other filters may be
-            # introspecting.
-            $self->set_value($type, @value);
-        }
-    }
-    $self->is_filtered(1);
-}
-
-sub _get_filters {
-    my $type = shift;
-    my $string = shift || '';
-    $string =~ s/\s*(.*?)\s*/$1/;
-    my @filters = ();
-    my $map_filters = $self->blocks_object->_filters_map->{$type} || [];
-    $map_filters = [ $map_filters ] unless ref $map_filters;
-    my @append = ();
-    for (
-        @{$self->blocks_object->_filters}, 
-        @$map_filters,
-        split(/\s+/, $string),
-    ) {
-        my $filter = $_;
-        last unless length $filter;
-        if ($filter =~ s/^-//) {
-            @filters = grep { $_ ne $filter } @filters;
-        }
-        elsif ($filter =~ s/^\+//) {
-            push @append, $filter;
-        }
-        else {
-            push @filters, $filter;
-        }
-    }
-    return @filters, @append;
-}
-
-{
-    %$reserved_section_names = map {
-        ($_, 1);
-    } keys(%Test::Base::Block::), qw( new DESTROY );
-}
-
-__DATA__
-
-=encoding utf8
-
-#line 1376
@@ -1,81 +0,0 @@
-#line 1
-package Test::Builder::Module;
-
-use strict;
-
-use Test::Builder;
-
-require Exporter;
-our @ISA = qw(Exporter);
-
-our $VERSION = '0.92';
-$VERSION = eval $VERSION;      ## no critic (BuiltinFunctions::ProhibitStringyEval)
-
-# 5.004's Exporter doesn't have export_to_level.
-my $_export_to_level = sub {
-    my $pkg   = shift;
-    my $level = shift;
-    (undef) = shift;    # redundant arg
-    my $callpkg = caller($level);
-    $pkg->export( $callpkg, @_ );
-};
-
-#line 82
-
-sub import {
-    my($class) = shift;
-
-    # Don't run all this when loading ourself.
-    return 1 if $class eq 'Test::Builder::Module';
-
-    my $test = $class->builder;
-
-    my $caller = caller;
-
-    $test->exported_to($caller);
-
-    $class->import_extra( \@_ );
-    my(@imports) = $class->_strip_imports( \@_ );
-
-    $test->plan(@_);
-
-    $class->$_export_to_level( 1, $class, @imports );
-}
-
-sub _strip_imports {
-    my $class = shift;
-    my $list  = shift;
-
-    my @imports = ();
-    my @other   = ();
-    my $idx     = 0;
-    while( $idx <= $#{$list} ) {
-        my $item = $list->[$idx];
-
-        if( defined $item and $item eq 'import' ) {
-            push @imports, @{ $list->[ $idx + 1 ] };
-            $idx++;
-        }
-        else {
-            push @other, $item;
-        }
-
-        $idx++;
-    }
-
-    @$list = @other;
-
-    return @imports;
-}
-
-#line 145
-
-sub import_extra { }
-
-#line 175
-
-sub builder {
-    return Test::Builder->new;
-}
-
-1;
@@ -1,1413 +0,0 @@
-#line 1
-package Test::Builder;
-
-use 5.006;
-use strict;
-use warnings;
-
-our $VERSION = '0.92';
-$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
-
-BEGIN {
-    if( $] < 5.008 ) {
-        require Test::Builder::IO::Scalar;
-    }
-}
-
-
-# Make Test::Builder thread-safe for ithreads.
-BEGIN {
-    use Config;
-    # Load threads::shared when threads are turned on.
-    # 5.8.0's threads are so busted we no longer support them.
-    if( $] >= 5.008001 && $Config{useithreads} && $INC{'threads.pm'} ) {
-        require threads::shared;
-
-        # Hack around YET ANOTHER threads::shared bug.  It would
-        # occassionally forget the contents of the variable when sharing it.
-        # So we first copy the data, then share, then put our copy back.
-        *share = sub (\[$@%]) {
-            my $type = ref $_[0];
-            my $data;
-
-            if( $type eq 'HASH' ) {
-                %$data = %{ $_[0] };
-            }
-            elsif( $type eq 'ARRAY' ) {
-                @$data = @{ $_[0] };
-            }
-            elsif( $type eq 'SCALAR' ) {
-                $$data = ${ $_[0] };
-            }
-            else {
-                die( "Unknown type: " . $type );
-            }
-
-            $_[0] = &threads::shared::share( $_[0] );
-
-            if( $type eq 'HASH' ) {
-                %{ $_[0] } = %$data;
-            }
-            elsif( $type eq 'ARRAY' ) {
-                @{ $_[0] } = @$data;
-            }
-            elsif( $type eq 'SCALAR' ) {
-                ${ $_[0] } = $$data;
-            }
-            else {
-                die( "Unknown type: " . $type );
-            }
-
-            return $_[0];
-        };
-    }
-    # 5.8.0's threads::shared is busted when threads are off
-    # and earlier Perls just don't have that module at all.
-    else {
-        *share = sub { return $_[0] };
-        *lock  = sub { 0 };
-    }
-}
-
-#line 117
-
-my $Test = Test::Builder->new;
-
-sub new {
-    my($class) = shift;
-    $Test ||= $class->create;
-    return $Test;
-}
-
-#line 139
-
-sub create {
-    my $class = shift;
-
-    my $self = bless {}, $class;
-    $self->reset;
-
-    return $self;
-}
-
-#line 158
-
-our $Level;
-
-sub reset {    ## no critic (Subroutines::ProhibitBuiltinHomonyms)
-    my($self) = @_;
-
-    # We leave this a global because it has to be localized and localizing
-    # hash keys is just asking for pain.  Also, it was documented.
-    $Level = 1;
-
-    $self->{Have_Plan}    = 0;
-    $self->{No_Plan}      = 0;
-    $self->{Have_Output_Plan} = 0;
-
-    $self->{Original_Pid} = $$;
-
-    share( $self->{Curr_Test} );
-    $self->{Curr_Test} = 0;
-    $self->{Test_Results} = &share( [] );
-
-    $self->{Exported_To}    = undef;
-    $self->{Expected_Tests} = 0;
-
-    $self->{Skip_All} = 0;
-
-    $self->{Use_Nums} = 1;
-
-    $self->{No_Header} = 0;
-    $self->{No_Ending} = 0;
-
-    $self->{Todo}       = undef;
-    $self->{Todo_Stack} = [];
-    $self->{Start_Todo} = 0;
-    $self->{Opened_Testhandles} = 0;
-
-    $self->_dup_stdhandles;
-
-    return;
-}
-
-#line 219
-
-my %plan_cmds = (
-    no_plan     => \&no_plan,
-    skip_all    => \&skip_all,
-    tests       => \&_plan_tests,
-);
-
-sub plan {
-    my( $self, $cmd, $arg ) = @_;
-
-    return unless $cmd;
-
-    local $Level = $Level + 1;
-
-    $self->croak("You tried to plan twice") if $self->{Have_Plan};
-
-    if( my $method = $plan_cmds{$cmd} ) {
-        local $Level = $Level + 1;
-        $self->$method($arg);
-    }
-    else {
-        my @args = grep { defined } ( $cmd, $arg );
-        $self->croak("plan() doesn't understand @args");
-    }
-
-    return 1;
-}
-
-
-sub _plan_tests {
-    my($self, $arg) = @_;
-
-    if($arg) {
-        local $Level = $Level + 1;
-        return $self->expected_tests($arg);
-    }
-    elsif( !defined $arg ) {
-        $self->croak("Got an undefined number of tests");
-    }
-    else {
-        $self->croak("You said to run 0 tests");
-    }
-
-    return;
-}
-
-
-#line 275
-
-sub expected_tests {
-    my $self = shift;
-    my($max) = @_;
-
-    if(@_) {
-        $self->croak("Number of tests must be a positive integer.  You gave it '$max'")
-          unless $max =~ /^\+?\d+$/;
-
-        $self->{Expected_Tests} = $max;
-        $self->{Have_Plan}      = 1;
-
-        $self->_output_plan($max) unless $self->no_header;
-    }
-    return $self->{Expected_Tests};
-}
-
-#line 299
-
-sub no_plan {
-    my($self, $arg) = @_;
-
-    $self->carp("no_plan takes no arguments") if $arg;
-
-    $self->{No_Plan}   = 1;
-    $self->{Have_Plan} = 1;
-
-    return 1;
-}
-
-
-#line 333
-
-sub _output_plan {
-    my($self, $max, $directive, $reason) = @_;
-
-    $self->carp("The plan was already output") if $self->{Have_Output_Plan};
-
-    my $plan = "1..$max";
-    $plan .= " # $directive" if defined $directive;
-    $plan .= " $reason"      if defined $reason;
-
-    $self->_print("$plan\n");
-
-    $self->{Have_Output_Plan} = 1;
-
-    return;
-}
-
-#line 384
-
-sub done_testing {
-    my($self, $num_tests) = @_;
-
-    # If done_testing() specified the number of tests, shut off no_plan.
-    if( defined $num_tests ) {
-        $self->{No_Plan} = 0;
-    }
-    else {
-        $num_tests = $self->current_test;
-    }
-
-    if( $self->{Done_Testing} ) {
-        my($file, $line) = @{$self->{Done_Testing}}[1,2];
-        $self->ok(0, "done_testing() was already called at $file line $line");
-        return;
-    }
-
-    $self->{Done_Testing} = [caller];
-
-    if( $self->expected_tests && $num_tests != $self->expected_tests ) {
-        $self->ok(0, "planned to run @{[ $self->expected_tests ]} ".
-                     "but done_testing() expects $num_tests");
-    }
-    else {
-        $self->{Expected_Tests} = $num_tests;
-    }
-
-    $self->_output_plan($num_tests) unless $self->{Have_Output_Plan};
-
-    $self->{Have_Plan} = 1;
-
-    return 1;
-}
-
-
-#line 429
-
-sub has_plan {
-    my $self = shift;
-
-    return( $self->{Expected_Tests} ) if $self->{Expected_Tests};
-    return('no_plan') if $self->{No_Plan};
-    return(undef);
-}
-
-#line 446
-
-sub skip_all {
-    my( $self, $reason ) = @_;
-
-    $self->{Skip_All} = 1;
-
-    $self->_output_plan(0, "SKIP", $reason) unless $self->no_header;
-    exit(0);
-}
-
-#line 468
-
-sub exported_to {
-    my( $self, $pack ) = @_;
-
-    if( defined $pack ) {
-        $self->{Exported_To} = $pack;
-    }
-    return $self->{Exported_To};
-}
-
-#line 498
-
-sub ok {
-    my( $self, $test, $name ) = @_;
-
-    # $test might contain an object which we don't want to accidentally
-    # store, so we turn it into a boolean.
-    $test = $test ? 1 : 0;
-
-    lock $self->{Curr_Test};
-    $self->{Curr_Test}++;
-
-    # In case $name is a string overloaded object, force it to stringify.
-    $self->_unoverload_str( \$name );
-
-    $self->diag(<<"ERR") if defined $name and $name =~ /^[\d\s]+$/;
-    You named your test '$name'.  You shouldn't use numbers for your test names.
-    Very confusing.
-ERR
-
-    # Capture the value of $TODO for the rest of this ok() call
-    # so it can more easily be found by other routines.
-    my $todo    = $self->todo();
-    my $in_todo = $self->in_todo;
-    local $self->{Todo} = $todo if $in_todo;
-
-    $self->_unoverload_str( \$todo );
-
-    my $out;
-    my $result = &share( {} );
-
-    unless($test) {
-        $out .= "not ";
-        @$result{ 'ok', 'actual_ok' } = ( ( $self->in_todo ? 1 : 0 ), 0 );
-    }
-    else {
-        @$result{ 'ok', 'actual_ok' } = ( 1, $test );
-    }
-
-    $out .= "ok";
-    $out .= " $self->{Curr_Test}" if $self->use_numbers;
-
-    if( defined $name ) {
-        $name =~ s|#|\\#|g;    # # in a name can confuse Test::Harness.
-        $out .= " - $name";
-        $result->{name} = $name;
-    }
-    else {
-        $result->{name} = '';
-    }
-
-    if( $self->in_todo ) {
-        $out .= " # TODO $todo";
-        $result->{reason} = $todo;
-        $result->{type}   = 'todo';
-    }
-    else {
-        $result->{reason} = '';
-        $result->{type}   = '';
-    }
-
-    $self->{Test_Results}[ $self->{Curr_Test} - 1 ] = $result;
-    $out .= "\n";
-
-    $self->_print($out);
-
-    unless($test) {
-        my $msg = $self->in_todo ? "Failed (TODO)" : "Failed";
-        $self->_print_to_fh( $self->_diag_fh, "\n" ) if $ENV{HARNESS_ACTIVE};
-
-        my( undef, $file, $line ) = $self->caller;
-        if( defined $name ) {
-            $self->diag(qq[  $msg test '$name'\n]);
-            $self->diag(qq[  at $file line $line.\n]);
-        }
-        else {
-            $self->diag(qq[  $msg test at $file line $line.\n]);
-        }
-    }
-
-    return $test ? 1 : 0;
-}
-
-sub _unoverload {
-    my $self = shift;
-    my $type = shift;
-
-    $self->_try(sub { require overload; }, die_on_fail => 1);
-
-    foreach my $thing (@_) {
-        if( $self->_is_object($$thing) ) {
-            if( my $string_meth = overload::Method( $$thing, $type ) ) {
-                $$thing = $$thing->$string_meth();
-            }
-        }
-    }
-
-    return;
-}
-
-sub _is_object {
-    my( $self, $thing ) = @_;
-
-    return $self->_try( sub { ref $thing && $thing->isa('UNIVERSAL') } ) ? 1 : 0;
-}
-
-sub _unoverload_str {
-    my $self = shift;
-
-    return $self->_unoverload( q[""], @_ );
-}
-
-sub _unoverload_num {
-    my $self = shift;
-
-    $self->_unoverload( '0+', @_ );
-
-    for my $val (@_) {
-        next unless $self->_is_dualvar($$val);
-        $$val = $$val + 0;
-    }
-
-    return;
-}
-
-# This is a hack to detect a dualvar such as $!
-sub _is_dualvar {
-    my( $self, $val ) = @_;
-
-    # Objects are not dualvars.
-    return 0 if ref $val;
-
-    no warnings 'numeric';
-    my $numval = $val + 0;
-    return $numval != 0 and $numval ne $val ? 1 : 0;
-}
-
-#line 649
-
-sub is_eq {
-    my( $self, $got, $expect, $name ) = @_;
-    local $Level = $Level + 1;
-
-    $self->_unoverload_str( \$got, \$expect );
-
-    if( !defined $got || !defined $expect ) {
-        # undef only matches undef and nothing else
-        my $test = !defined $got && !defined $expect;
-
-        $self->ok( $test, $name );
-        $self->_is_diag( $got, 'eq', $expect ) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok( $got, 'eq', $expect, $name );
-}
-
-sub is_num {
-    my( $self, $got, $expect, $name ) = @_;
-    local $Level = $Level + 1;
-
-    $self->_unoverload_num( \$got, \$expect );
-
-    if( !defined $got || !defined $expect ) {
-        # undef only matches undef and nothing else
-        my $test = !defined $got && !defined $expect;
-
-        $self->ok( $test, $name );
-        $self->_is_diag( $got, '==', $expect ) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok( $got, '==', $expect, $name );
-}
-
-sub _diag_fmt {
-    my( $self, $type, $val ) = @_;
-
-    if( defined $$val ) {
-        if( $type eq 'eq' or $type eq 'ne' ) {
-            # quote and force string context
-            $$val = "'$$val'";
-        }
-        else {
-            # force numeric context
-            $self->_unoverload_num($val);
-        }
-    }
-    else {
-        $$val = 'undef';
-    }
-
-    return;
-}
-
-sub _is_diag {
-    my( $self, $got, $type, $expect ) = @_;
-
-    $self->_diag_fmt( $type, $_ ) for \$got, \$expect;
-
-    local $Level = $Level + 1;
-    return $self->diag(<<"DIAGNOSTIC");
-         got: $got
-    expected: $expect
-DIAGNOSTIC
-
-}
-
-sub _isnt_diag {
-    my( $self, $got, $type ) = @_;
-
-    $self->_diag_fmt( $type, \$got );
-
-    local $Level = $Level + 1;
-    return $self->diag(<<"DIAGNOSTIC");
-         got: $got
-    expected: anything else
-DIAGNOSTIC
-}
-
-#line 746
-
-sub isnt_eq {
-    my( $self, $got, $dont_expect, $name ) = @_;
-    local $Level = $Level + 1;
-
-    if( !defined $got || !defined $dont_expect ) {
-        # undef only matches undef and nothing else
-        my $test = defined $got || defined $dont_expect;
-
-        $self->ok( $test, $name );
-        $self->_isnt_diag( $got, 'ne' ) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok( $got, 'ne', $dont_expect, $name );
-}
-
-sub isnt_num {
-    my( $self, $got, $dont_expect, $name ) = @_;
-    local $Level = $Level + 1;
-
-    if( !defined $got || !defined $dont_expect ) {
-        # undef only matches undef and nothing else
-        my $test = defined $got || defined $dont_expect;
-
-        $self->ok( $test, $name );
-        $self->_isnt_diag( $got, '!=' ) unless $test;
-        return $test;
-    }
-
-    return $self->cmp_ok( $got, '!=', $dont_expect, $name );
-}
-
-#line 797
-
-sub like {
-    my( $self, $this, $regex, $name ) = @_;
-
-    local $Level = $Level + 1;
-    return $self->_regex_ok( $this, $regex, '=~', $name );
-}
-
-sub unlike {
-    my( $self, $this, $regex, $name ) = @_;
-
-    local $Level = $Level + 1;
-    return $self->_regex_ok( $this, $regex, '!~', $name );
-}
-
-#line 821
-
-my %numeric_cmps = map { ( $_, 1 ) } ( "<", "<=", ">", ">=", "==", "!=", "<=>" );
-
-sub cmp_ok {
-    my( $self, $got, $type, $expect, $name ) = @_;
-
-    my $test;
-    my $error;
-    {
-        ## no critic (BuiltinFunctions::ProhibitStringyEval)
-
-        local( $@, $!, $SIG{__DIE__} );    # isolate eval
-
-        my($pack, $file, $line) = $self->caller();
-
-        $test = eval qq[
-#line 1 "cmp_ok [from $file line $line]"
-\$got $type \$expect;
-];
-        $error = $@;
-    }
-    local $Level = $Level + 1;
-    my $ok = $self->ok( $test, $name );
-
-    # Treat overloaded objects as numbers if we're asked to do a
-    # numeric comparison.
-    my $unoverload
-      = $numeric_cmps{$type}
-      ? '_unoverload_num'
-      : '_unoverload_str';
-
-    $self->diag(<<"END") if $error;
-An error occurred while using $type:
-------------------------------------
-$error
-------------------------------------
-END
-
-    unless($ok) {
-        $self->$unoverload( \$got, \$expect );
-
-        if( $type =~ /^(eq|==)$/ ) {
-            $self->_is_diag( $got, $type, $expect );
-        }
-        elsif( $type =~ /^(ne|!=)$/ ) {
-            $self->_isnt_diag( $got, $type );
-        }
-        else {
-            $self->_cmp_diag( $got, $type, $expect );
-        }
-    }
-    return $ok;
-}
-
-sub _cmp_diag {
-    my( $self, $got, $type, $expect ) = @_;
-
-    $got    = defined $got    ? "'$got'"    : 'undef';
-    $expect = defined $expect ? "'$expect'" : 'undef';
-
-    local $Level = $Level + 1;
-    return $self->diag(<<"DIAGNOSTIC");
-    $got
-        $type
-    $expect
-DIAGNOSTIC
-}
-
-sub _caller_context {
-    my $self = shift;
-
-    my( $pack, $file, $line ) = $self->caller(1);
-
-    my $code = '';
-    $code .= "#line $line $file\n" if defined $file and defined $line;
-
-    return $code;
-}
-
-#line 920
-
-sub BAIL_OUT {
-    my( $self, $reason ) = @_;
-
-    $self->{Bailed_Out} = 1;
-    $self->_print("Bail out!  $reason");
-    exit 255;
-}
-
-#line 933
-
-*BAILOUT = \&BAIL_OUT;
-
-#line 944
-
-sub skip {
-    my( $self, $why ) = @_;
-    $why ||= '';
-    $self->_unoverload_str( \$why );
-
-    lock( $self->{Curr_Test} );
-    $self->{Curr_Test}++;
-
-    $self->{Test_Results}[ $self->{Curr_Test} - 1 ] = &share(
-        {
-            'ok'      => 1,
-            actual_ok => 1,
-            name      => '',
-            type      => 'skip',
-            reason    => $why,
-        }
-    );
-
-    my $out = "ok";
-    $out .= " $self->{Curr_Test}" if $self->use_numbers;
-    $out .= " # skip";
-    $out .= " $why"               if length $why;
-    $out .= "\n";
-
-    $self->_print($out);
-
-    return 1;
-}
-
-#line 985
-
-sub todo_skip {
-    my( $self, $why ) = @_;
-    $why ||= '';
-
-    lock( $self->{Curr_Test} );
-    $self->{Curr_Test}++;
-
-    $self->{Test_Results}[ $self->{Curr_Test} - 1 ] = &share(
-        {
-            'ok'      => 1,
-            actual_ok => 0,
-            name      => '',
-            type      => 'todo_skip',
-            reason    => $why,
-        }
-    );
-
-    my $out = "not ok";
-    $out .= " $self->{Curr_Test}" if $self->use_numbers;
-    $out .= " # TODO & SKIP $why\n";
-
-    $self->_print($out);
-
-    return 1;
-}
-
-#line 1062
-
-sub maybe_regex {
-    my( $self, $regex ) = @_;
-    my $usable_regex = undef;
-
-    return $usable_regex unless defined $regex;
-
-    my( $re, $opts );
-
-    # Check for qr/foo/
-    if( _is_qr($regex) ) {
-        $usable_regex = $regex;
-    }
-    # Check for '/foo/' or 'm,foo,'
-    elsif(( $re, $opts )        = $regex =~ m{^ /(.*)/ (\w*) $ }sx              or
-          ( undef, $re, $opts ) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx
-    )
-    {
-        $usable_regex = length $opts ? "(?$opts)$re" : $re;
-    }
-
-    return $usable_regex;
-}
-
-sub _is_qr {
-    my $regex = shift;
-
-    # is_regexp() checks for regexes in a robust manner, say if they're
-    # blessed.
-    return re::is_regexp($regex) if defined &re::is_regexp;
-    return ref $regex eq 'Regexp';
-}
-
-sub _regex_ok {
-    my( $self, $this, $regex, $cmp, $name ) = @_;
-
-    my $ok           = 0;
-    my $usable_regex = $self->maybe_regex($regex);
-    unless( defined $usable_regex ) {
-        local $Level = $Level + 1;
-        $ok = $self->ok( 0, $name );
-        $self->diag("    '$regex' doesn't look much like a regex to me.");
-        return $ok;
-    }
-
-    {
-        ## no critic (BuiltinFunctions::ProhibitStringyEval)
-
-        my $test;
-        my $code = $self->_caller_context;
-
-        local( $@, $!, $SIG{__DIE__} );    # isolate eval
-
-        # Yes, it has to look like this or 5.4.5 won't see the #line
-        # directive.
-        # Don't ask me, man, I just work here.
-        $test = eval "
-$code" . q{$test = $this =~ /$usable_regex/ ? 1 : 0};
-
-        $test = !$test if $cmp eq '!~';
-
-        local $Level = $Level + 1;
-        $ok = $self->ok( $test, $name );
-    }
-
-    unless($ok) {
-        $this = defined $this ? "'$this'" : 'undef';
-        my $match = $cmp eq '=~' ? "doesn't match" : "matches";
-
-        local $Level = $Level + 1;
-        $self->diag( sprintf <<'DIAGNOSTIC', $this, $match, $regex );
-                  %s
-    %13s '%s'
-DIAGNOSTIC
-
-    }
-
-    return $ok;
-}
-
-# I'm not ready to publish this.  It doesn't deal with array return
-# values from the code or context.
-
-#line 1162
-
-sub _try {
-    my( $self, $code, %opts ) = @_;
-
-    my $error;
-    my $return;
-    {
-        local $!;               # eval can mess up $!
-        local $@;               # don't set $@ in the test
-        local $SIG{__DIE__};    # don't trip an outside DIE handler.
-        $return = eval { $code->() };
-        $error = $@;
-    }
-
-    die $error if $error and $opts{die_on_fail};
-
-    return wantarray ? ( $return, $error ) : $return;
-}
-
-#line 1191
-
-sub is_fh {
-    my $self     = shift;
-    my $maybe_fh = shift;
-    return 0 unless defined $maybe_fh;
-
-    return 1 if ref $maybe_fh  eq 'GLOB';    # its a glob ref
-    return 1 if ref \$maybe_fh eq 'GLOB';    # its a glob
-
-    return eval { $maybe_fh->isa("IO::Handle") } ||
-           # 5.5.4's tied() and can() doesn't like getting undef
-           eval { ( tied($maybe_fh) || '' )->can('TIEHANDLE') };
-}
-
-#line 1235
-
-sub level {
-    my( $self, $level ) = @_;
-
-    if( defined $level ) {
-        $Level = $level;
-    }
-    return $Level;
-}
-
-#line 1267
-
-sub use_numbers {
-    my( $self, $use_nums ) = @_;
-
-    if( defined $use_nums ) {
-        $self->{Use_Nums} = $use_nums;
-    }
-    return $self->{Use_Nums};
-}
-
-#line 1300
-
-foreach my $attribute (qw(No_Header No_Ending No_Diag)) {
-    my $method = lc $attribute;
-
-    my $code = sub {
-        my( $self, $no ) = @_;
-
-        if( defined $no ) {
-            $self->{$attribute} = $no;
-        }
-        return $self->{$attribute};
-    };
-
-    no strict 'refs';    ## no critic
-    *{ __PACKAGE__ . '::' . $method } = $code;
-}
-
-#line 1353
-
-sub diag {
-    my $self = shift;
-
-    $self->_print_comment( $self->_diag_fh, @_ );
-}
-
-#line 1368
-
-sub note {
-    my $self = shift;
-
-    $self->_print_comment( $self->output, @_ );
-}
-
-sub _diag_fh {
-    my $self = shift;
-
-    local $Level = $Level + 1;
-    return $self->in_todo ? $self->todo_output : $self->failure_output;
-}
-
-sub _print_comment {
-    my( $self, $fh, @msgs ) = @_;
-
-    return if $self->no_diag;
-    return unless @msgs;
-
-    # Prevent printing headers when compiling (i.e. -c)
-    return if $^C;
-
-    # Smash args together like print does.
-    # Convert undef to 'undef' so its readable.
-    my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs;
-
-    # Escape the beginning, _print will take care of the rest.
-    $msg =~ s/^/# /;
-
-    local $Level = $Level + 1;
-    $self->_print_to_fh( $fh, $msg );
-
-    return 0;
-}
-
-#line 1418
-
-sub explain {
-    my $self = shift;
-
-    return map {
-        ref $_
-          ? do {
-            $self->_try(sub { require Data::Dumper }, die_on_fail => 1);
-
-            my $dumper = Data::Dumper->new( [$_] );
-            $dumper->Indent(1)->Terse(1);
-            $dumper->Sortkeys(1) if $dumper->can("Sortkeys");
-            $dumper->Dump;
-          }
-          : $_
-    } @_;
-}
-
-#line 1447
-
-sub _print {
-    my $self = shift;
-    return $self->_print_to_fh( $self->output, @_ );
-}
-
-sub _print_to_fh {
-    my( $self, $fh, @msgs ) = @_;
-
-    # Prevent printing headers when only compiling.  Mostly for when
-    # tests are deparsed with B::Deparse
-    return if $^C;
-
-    my $msg = join '', @msgs;
-
-    local( $\, $", $, ) = ( undef, ' ', '' );
-
-    # Escape each line after the first with a # so we don't
-    # confuse Test::Harness.
-    $msg =~ s{\n(?!\z)}{\n# }sg;
-
-    # Stick a newline on the end if it needs it.
-    $msg .= "\n" unless $msg =~ /\n\z/;
-
-    return print $fh $msg;
-}
-
-#line 1506
-
-sub output {
-    my( $self, $fh ) = @_;
-
-    if( defined $fh ) {
-        $self->{Out_FH} = $self->_new_fh($fh);
-    }
-    return $self->{Out_FH};
-}
-
-sub failure_output {
-    my( $self, $fh ) = @_;
-
-    if( defined $fh ) {
-        $self->{Fail_FH} = $self->_new_fh($fh);
-    }
-    return $self->{Fail_FH};
-}
-
-sub todo_output {
-    my( $self, $fh ) = @_;
-
-    if( defined $fh ) {
-        $self->{Todo_FH} = $self->_new_fh($fh);
-    }
-    return $self->{Todo_FH};
-}
-
-sub _new_fh {
-    my $self = shift;
-    my($file_or_fh) = shift;
-
-    my $fh;
-    if( $self->is_fh($file_or_fh) ) {
-        $fh = $file_or_fh;
-    }
-    elsif( ref $file_or_fh eq 'SCALAR' ) {
-        # Scalar refs as filehandles was added in 5.8.
-        if( $] >= 5.008 ) {
-            open $fh, ">>", $file_or_fh
-              or $self->croak("Can't open scalar ref $file_or_fh: $!");
-        }
-        # Emulate scalar ref filehandles with a tie.
-        else {
-            $fh = Test::Builder::IO::Scalar->new($file_or_fh)
-              or $self->croak("Can't tie scalar ref $file_or_fh");
-        }
-    }
-    else {
-        open $fh, ">", $file_or_fh
-          or $self->croak("Can't open test output log $file_or_fh: $!");
-        _autoflush($fh);
-    }
-
-    return $fh;
-}
-
-sub _autoflush {
-    my($fh) = shift;
-    my $old_fh = select $fh;
-    $| = 1;
-    select $old_fh;
-
-    return;
-}
-
-my( $Testout, $Testerr );
-
-sub _dup_stdhandles {
-    my $self = shift;
-
-    $self->_open_testhandles;
-
-    # Set everything to unbuffered else plain prints to STDOUT will
-    # come out in the wrong order from our own prints.
-    _autoflush($Testout);
-    _autoflush( \*STDOUT );
-    _autoflush($Testerr);
-    _autoflush( \*STDERR );
-
-    $self->reset_outputs;
-
-    return;
-}
-
-sub _open_testhandles {
-    my $self = shift;
-
-    return if $self->{Opened_Testhandles};
-
-    # We dup STDOUT and STDERR so people can change them in their
-    # test suites while still getting normal test output.
-    open( $Testout, ">&STDOUT" ) or die "Can't dup STDOUT:  $!";
-    open( $Testerr, ">&STDERR" ) or die "Can't dup STDERR:  $!";
-
-    #    $self->_copy_io_layers( \*STDOUT, $Testout );
-    #    $self->_copy_io_layers( \*STDERR, $Testerr );
-
-    $self->{Opened_Testhandles} = 1;
-
-    return;
-}
-
-sub _copy_io_layers {
-    my( $self, $src, $dst ) = @_;
-
-    $self->_try(
-        sub {
-            require PerlIO;
-            my @src_layers = PerlIO::get_layers($src);
-
-            binmode $dst, join " ", map ":$_", @src_layers if @src_layers;
-        }
-    );
-
-    return;
-}
-
-#line 1631
-
-sub reset_outputs {
-    my $self = shift;
-
-    $self->output        ($Testout);
-    $self->failure_output($Testerr);
-    $self->todo_output   ($Testout);
-
-    return;
-}
-
-#line 1657
-
-sub _message_at_caller {
-    my $self = shift;
-
-    local $Level = $Level + 1;
-    my( $pack, $file, $line ) = $self->caller;
-    return join( "", @_ ) . " at $file line $line.\n";
-}
-
-sub carp {
-    my $self = shift;
-    return warn $self->_message_at_caller(@_);
-}
-
-sub croak {
-    my $self = shift;
-    return die $self->_message_at_caller(@_);
-}
-
-
-#line 1697
-
-sub current_test {
-    my( $self, $num ) = @_;
-
-    lock( $self->{Curr_Test} );
-    if( defined $num ) {
-        $self->{Curr_Test} = $num;
-
-        # If the test counter is being pushed forward fill in the details.
-        my $test_results = $self->{Test_Results};
-        if( $num > @$test_results ) {
-            my $start = @$test_results ? @$test_results : 0;
-            for( $start .. $num - 1 ) {
-                $test_results->[$_] = &share(
-                    {
-                        'ok'      => 1,
-                        actual_ok => undef,
-                        reason    => 'incrementing test number',
-                        type      => 'unknown',
-                        name      => undef
-                    }
-                );
-            }
-        }
-        # If backward, wipe history.  Its their funeral.
-        elsif( $num < @$test_results ) {
-            $#{$test_results} = $num - 1;
-        }
-    }
-    return $self->{Curr_Test};
-}
-
-#line 1739
-
-sub summary {
-    my($self) = shift;
-
-    return map { $_->{'ok'} } @{ $self->{Test_Results} };
-}
-
-#line 1794
-
-sub details {
-    my $self = shift;
-    return @{ $self->{Test_Results} };
-}
-
-#line 1823
-
-sub todo {
-    my( $self, $pack ) = @_;
-
-    return $self->{Todo} if defined $self->{Todo};
-
-    local $Level = $Level + 1;
-    my $todo = $self->find_TODO($pack);
-    return $todo if defined $todo;
-
-    return '';
-}
-
-#line 1845
-
-sub find_TODO {
-    my( $self, $pack ) = @_;
-
-    $pack = $pack || $self->caller(1) || $self->exported_to;
-    return unless $pack;
-
-    no strict 'refs';    ## no critic
-    return ${ $pack . '::TODO' };
-}
-
-#line 1863
-
-sub in_todo {
-    my $self = shift;
-
-    local $Level = $Level + 1;
-    return( defined $self->{Todo} || $self->find_TODO ) ? 1 : 0;
-}
-
-#line 1913
-
-sub todo_start {
-    my $self = shift;
-    my $message = @_ ? shift : '';
-
-    $self->{Start_Todo}++;
-    if( $self->in_todo ) {
-        push @{ $self->{Todo_Stack} } => $self->todo;
-    }
-    $self->{Todo} = $message;
-
-    return;
-}
-
-#line 1935
-
-sub todo_end {
-    my $self = shift;
-
-    if( !$self->{Start_Todo} ) {
-        $self->croak('todo_end() called without todo_start()');
-    }
-
-    $self->{Start_Todo}--;
-
-    if( $self->{Start_Todo} && @{ $self->{Todo_Stack} } ) {
-        $self->{Todo} = pop @{ $self->{Todo_Stack} };
-    }
-    else {
-        delete $self->{Todo};
-    }
-
-    return;
-}
-
-#line 1968
-
-sub caller {    ## no critic (Subroutines::ProhibitBuiltinHomonyms)
-    my( $self, $height ) = @_;
-    $height ||= 0;
-
-    my $level = $self->level + $height + 1;
-    my @caller;
-    do {
-        @caller = CORE::caller( $level );
-        $level--;
-    } until @caller;
-    return wantarray ? @caller : $caller[0];
-}
-
-#line 1985
-
-#line 1999
-
-#'#
-sub _sanity_check {
-    my $self = shift;
-
-    $self->_whoa( $self->{Curr_Test} < 0, 'Says here you ran a negative number of tests!' );
-    $self->_whoa( $self->{Curr_Test} != @{ $self->{Test_Results} },
-        'Somehow you got a different number of results than tests ran!' );
-
-    return;
-}
-
-#line 2020
-
-sub _whoa {
-    my( $self, $check, $desc ) = @_;
-    if($check) {
-        local $Level = $Level + 1;
-        $self->croak(<<"WHOA");
-WHOA!  $desc
-This should never happen!  Please contact the author immediately!
-WHOA
-    }
-
-    return;
-}
-
-#line 2044
-
-sub _my_exit {
-    $? = $_[0];    ## no critic (Variables::RequireLocalizedPunctuationVars)
-
-    return 1;
-}
-
-#line 2056
-
-sub _ending {
-    my $self = shift;
-
-    my $real_exit_code = $?;
-
-    # Don't bother with an ending if this is a forked copy.  Only the parent
-    # should do the ending.
-    if( $self->{Original_Pid} != $$ ) {
-        return;
-    }
-
-    # Ran tests but never declared a plan or hit done_testing
-    if( !$self->{Have_Plan} and $self->{Curr_Test} ) {
-        $self->diag("Tests were run but no plan was declared and done_testing() was not seen.");
-    }
-
-    # Exit if plan() was never called.  This is so "require Test::Simple"
-    # doesn't puke.
-    if( !$self->{Have_Plan} ) {
-        return;
-    }
-
-    # Don't do an ending if we bailed out.
-    if( $self->{Bailed_Out} ) {
-        return;
-    }
-
-    # Figure out if we passed or failed and print helpful messages.
-    my $test_results = $self->{Test_Results};
-    if(@$test_results) {
-        # The plan?  We have no plan.
-        if( $self->{No_Plan} ) {
-            $self->_output_plan($self->{Curr_Test}) unless $self->no_header;
-            $self->{Expected_Tests} = $self->{Curr_Test};
-        }
-
-        # Auto-extended arrays and elements which aren't explicitly
-        # filled in with a shared reference will puke under 5.8.0
-        # ithreads.  So we have to fill them in by hand. :(
-        my $empty_result = &share( {} );
-        for my $idx ( 0 .. $self->{Expected_Tests} - 1 ) {
-            $test_results->[$idx] = $empty_result
-              unless defined $test_results->[$idx];
-        }
-
-        my $num_failed = grep !$_->{'ok'}, @{$test_results}[ 0 .. $self->{Curr_Test} - 1 ];
-
-        my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests};
-
-        if( $num_extra != 0 ) {
-            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
-            $self->diag(<<"FAIL");
-Looks like you planned $self->{Expected_Tests} test$s but ran $self->{Curr_Test}.
-FAIL
-        }
-
-        if($num_failed) {
-            my $num_tests = $self->{Curr_Test};
-            my $s = $num_failed == 1 ? '' : 's';
-
-            my $qualifier = $num_extra == 0 ? '' : ' run';
-
-            $self->diag(<<"FAIL");
-Looks like you failed $num_failed test$s of $num_tests$qualifier.
-FAIL
-        }
-
-        if($real_exit_code) {
-            $self->diag(<<"FAIL");
-Looks like your test exited with $real_exit_code just after $self->{Curr_Test}.
-FAIL
-
-            _my_exit($real_exit_code) && return;
-        }
-
-        my $exit_code;
-        if($num_failed) {
-            $exit_code = $num_failed <= 254 ? $num_failed : 254;
-        }
-        elsif( $num_extra != 0 ) {
-            $exit_code = 255;
-        }
-        else {
-            $exit_code = 0;
-        }
-
-        _my_exit($exit_code) && return;
-    }
-    elsif( $self->{Skip_All} ) {
-        _my_exit(0) && return;
-    }
-    elsif($real_exit_code) {
-        $self->diag(<<"FAIL");
-Looks like your test exited with $real_exit_code before it could output anything.
-FAIL
-        _my_exit($real_exit_code) && return;
-    }
-    else {
-        $self->diag("No tests run!\n");
-        _my_exit(255) && return;
-    }
-
-    $self->_whoa( 1, "We fell off the end of _ending()" );
-}
-
-END {
-    $Test->_ending if defined $Test and !$Test->no_ending;
-}
-
-#line 2236
-
-1;
-
@@ -1,735 +0,0 @@
-#line 1
-package Test::More;
-
-use 5.006;
-use strict;
-use warnings;
-
-#---- perlcritic exemptions. ----#
-
-# We use a lot of subroutine prototypes
-## no critic (Subroutines::ProhibitSubroutinePrototypes)
-
-# Can't use Carp because it might cause use_ok() to accidentally succeed
-# even though the module being used forgot to use Carp.  Yes, this
-# actually happened.
-sub _carp {
-    my( $file, $line ) = ( caller(1) )[ 1, 2 ];
-    return warn @_, " at $file line $line\n";
-}
-
-our $VERSION = '0.92';
-$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
-
-use Test::Builder::Module;
-our @ISA    = qw(Test::Builder::Module);
-our @EXPORT = qw(ok use_ok require_ok
-  is isnt like unlike is_deeply
-  cmp_ok
-  skip todo todo_skip
-  pass fail
-  eq_array eq_hash eq_set
-  $TODO
-  plan
-  done_testing
-  can_ok isa_ok new_ok
-  diag note explain
-  BAIL_OUT
-);
-
-#line 163
-
-sub plan {
-    my $tb = Test::More->builder;
-
-    return $tb->plan(@_);
-}
-
-# This implements "use Test::More 'no_diag'" but the behavior is
-# deprecated.
-sub import_extra {
-    my $class = shift;
-    my $list  = shift;
-
-    my @other = ();
-    my $idx   = 0;
-    while( $idx <= $#{$list} ) {
-        my $item = $list->[$idx];
-
-        if( defined $item and $item eq 'no_diag' ) {
-            $class->builder->no_diag(1);
-        }
-        else {
-            push @other, $item;
-        }
-
-        $idx++;
-    }
-
-    @$list = @other;
-
-    return;
-}
-
-#line 216
-
-sub done_testing {
-    my $tb = Test::More->builder;
-    $tb->done_testing(@_);
-}
-
-#line 289
-
-sub ok ($;$) {
-    my( $test, $name ) = @_;
-    my $tb = Test::More->builder;
-
-    return $tb->ok( $test, $name );
-}
-
-#line 367
-
-sub is ($$;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->is_eq(@_);
-}
-
-sub isnt ($$;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->isnt_eq(@_);
-}
-
-*isn't = \&isnt;
-
-#line 411
-
-sub like ($$;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->like(@_);
-}
-
-#line 426
-
-sub unlike ($$;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->unlike(@_);
-}
-
-#line 471
-
-sub cmp_ok($$$;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->cmp_ok(@_);
-}
-
-#line 506
-
-sub can_ok ($@) {
-    my( $proto, @methods ) = @_;
-    my $class = ref $proto || $proto;
-    my $tb = Test::More->builder;
-
-    unless($class) {
-        my $ok = $tb->ok( 0, "->can(...)" );
-        $tb->diag('    can_ok() called with empty class or reference');
-        return $ok;
-    }
-
-    unless(@methods) {
-        my $ok = $tb->ok( 0, "$class->can(...)" );
-        $tb->diag('    can_ok() called with no methods');
-        return $ok;
-    }
-
-    my @nok = ();
-    foreach my $method (@methods) {
-        $tb->_try( sub { $proto->can($method) } ) or push @nok, $method;
-    }
-
-    my $name = (@methods == 1) ? "$class->can('$methods[0]')" :
-                                 "$class->can(...)"           ;
-
-    my $ok = $tb->ok( !@nok, $name );
-
-    $tb->diag( map "    $class->can('$_') failed\n", @nok );
-
-    return $ok;
-}
-
-#line 572
-
-sub isa_ok ($$;$) {
-    my( $object, $class, $obj_name ) = @_;
-    my $tb = Test::More->builder;
-
-    my $diag;
-
-    if( !defined $object ) {
-        $obj_name = 'The thing' unless defined $obj_name;
-        $diag = "$obj_name isn't defined";
-    }
-    else {
-        my $whatami = ref $object ? 'object' : 'class';
-        # We can't use UNIVERSAL::isa because we want to honor isa() overrides
-        my( $rslt, $error ) = $tb->_try( sub { $object->isa($class) } );
-        if($error) {
-            if( $error =~ /^Can't call method "isa" on unblessed reference/ ) {
-                # Its an unblessed reference
-                $obj_name = 'The reference' unless defined $obj_name;
-                if( !UNIVERSAL::isa( $object, $class ) ) {
-                    my $ref = ref $object;
-                    $diag = "$obj_name isn't a '$class' it's a '$ref'";
-                }
-            }
-            elsif( $error =~ /Can't call method "isa" without a package/ ) {
-                # It's something that can't even be a class
-                $diag = "$obj_name isn't a class or reference";
-            }
-            else {
-                die <<WHOA;
-WHOA! I tried to call ->isa on your $whatami and got some weird error.
-Here's the error.
-$error
-WHOA
-            }
-        }
-        else {
-            $obj_name = "The $whatami" unless defined $obj_name;
-            if( !$rslt ) {
-                my $ref = ref $object;
-                $diag = "$obj_name isn't a '$class' it's a '$ref'";
-            }
-        }
-    }
-
-    my $name = "$obj_name isa $class";
-    my $ok;
-    if($diag) {
-        $ok = $tb->ok( 0, $name );
-        $tb->diag("    $diag\n");
-    }
-    else {
-        $ok = $tb->ok( 1, $name );
-    }
-
-    return $ok;
-}
-
-#line 650
-
-sub new_ok {
-    my $tb = Test::More->builder;
-    $tb->croak("new_ok() must be given at least a class") unless @_;
-
-    my( $class, $args, $object_name ) = @_;
-
-    $args ||= [];
-    $object_name = "The object" unless defined $object_name;
-
-    my $obj;
-    my( $success, $error ) = $tb->_try( sub { $obj = $class->new(@$args); 1 } );
-    if($success) {
-        local $Test::Builder::Level = $Test::Builder::Level + 1;
-        isa_ok $obj, $class, $object_name;
-    }
-    else {
-        $tb->ok( 0, "new() died" );
-        $tb->diag("    Error was:  $error");
-    }
-
-    return $obj;
-}
-
-#line 690
-
-sub pass (;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->ok( 1, @_ );
-}
-
-sub fail (;$) {
-    my $tb = Test::More->builder;
-
-    return $tb->ok( 0, @_ );
-}
-
-#line 753
-
-sub use_ok ($;@) {
-    my( $module, @imports ) = @_;
-    @imports = () unless @imports;
-    my $tb = Test::More->builder;
-
-    my( $pack, $filename, $line ) = caller;
-
-    my $code;
-    if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
-        # probably a version check.  Perl needs to see the bare number
-        # for it to work with non-Exporter based modules.
-        $code = <<USE;
-package $pack;
-use $module $imports[0];
-1;
-USE
-    }
-    else {
-        $code = <<USE;
-package $pack;
-use $module \@{\$args[0]};
-1;
-USE
-    }
-
-    my( $eval_result, $eval_error ) = _eval( $code, \@imports );
-    my $ok = $tb->ok( $eval_result, "use $module;" );
-
-    unless($ok) {
-        chomp $eval_error;
-        $@ =~ s{^BEGIN failed--compilation aborted at .*$}
-                {BEGIN failed--compilation aborted at $filename line $line.}m;
-        $tb->diag(<<DIAGNOSTIC);
-    Tried to use '$module'.
-    Error:  $eval_error
-DIAGNOSTIC
-
-    }
-
-    return $ok;
-}
-
-sub _eval {
-    my( $code, @args ) = @_;
-
-    # Work around oddities surrounding resetting of $@ by immediately
-    # storing it.
-    my( $sigdie, $eval_result, $eval_error );
-    {
-        local( $@, $!, $SIG{__DIE__} );    # isolate eval
-        $eval_result = eval $code;              ## no critic (BuiltinFunctions::ProhibitStringyEval)
-        $eval_error  = $@;
-        $sigdie      = $SIG{__DIE__} || undef;
-    }
-    # make sure that $code got a chance to set $SIG{__DIE__}
-    $SIG{__DIE__} = $sigdie if defined $sigdie;
-
-    return( $eval_result, $eval_error );
-}
-
-#line 822
-
-sub require_ok ($) {
-    my($module) = shift;
-    my $tb = Test::More->builder;
-
-    my $pack = caller;
-
-    # Try to deterine if we've been given a module name or file.
-    # Module names must be barewords, files not.
-    $module = qq['$module'] unless _is_module_name($module);
-
-    my $code = <<REQUIRE;
-package $pack;
-require $module;
-1;
-REQUIRE
-
-    my( $eval_result, $eval_error ) = _eval($code);
-    my $ok = $tb->ok( $eval_result, "require $module;" );
-
-    unless($ok) {
-        chomp $eval_error;
-        $tb->diag(<<DIAGNOSTIC);
-    Tried to require '$module'.
-    Error:  $eval_error
-DIAGNOSTIC
-
-    }
-
-    return $ok;
-}
-
-sub _is_module_name {
-    my $module = shift;
-
-    # Module names start with a letter.
-    # End with an alphanumeric.
-    # The rest is an alphanumeric or ::
-    $module =~ s/\b::\b//g;
-
-    return $module =~ /^[a-zA-Z]\w*$/ ? 1 : 0;
-}
-
-#line 899
-
-our( @Data_Stack, %Refs_Seen );
-my $DNE = bless [], 'Does::Not::Exist';
-
-sub _dne {
-    return ref $_[0] eq ref $DNE;
-}
-
-## no critic (Subroutines::RequireArgUnpacking)
-sub is_deeply {
-    my $tb = Test::More->builder;
-
-    unless( @_ == 2 or @_ == 3 ) {
-        my $msg = <<'WARNING';
-is_deeply() takes two or three args, you gave %d.
-This usually means you passed an array or hash instead 
-of a reference to it
-WARNING
-        chop $msg;    # clip off newline so carp() will put in line/file
-
-        _carp sprintf $msg, scalar @_;
-
-        return $tb->ok(0);
-    }
-
-    my( $got, $expected, $name ) = @_;
-
-    $tb->_unoverload_str( \$expected, \$got );
-
-    my $ok;
-    if( !ref $got and !ref $expected ) {    # neither is a reference
-        $ok = $tb->is_eq( $got, $expected, $name );
-    }
-    elsif( !ref $got xor !ref $expected ) {    # one's a reference, one isn't
-        $ok = $tb->ok( 0, $name );
-        $tb->diag( _format_stack({ vals => [ $got, $expected ] }) );
-    }
-    else {                                     # both references
-        local @Data_Stack = ();
-        if( _deep_check( $got, $expected ) ) {
-            $ok = $tb->ok( 1, $name );
-        }
-        else {
-            $ok = $tb->ok( 0, $name );
-            $tb->diag( _format_stack(@Data_Stack) );
-        }
-    }
-
-    return $ok;
-}
-
-sub _format_stack {
-    my(@Stack) = @_;
-
-    my $var       = '$FOO';
-    my $did_arrow = 0;
-    foreach my $entry (@Stack) {
-        my $type = $entry->{type} || '';
-        my $idx = $entry->{'idx'};
-        if( $type eq 'HASH' ) {
-            $var .= "->" unless $did_arrow++;
-            $var .= "{$idx}";
-        }
-        elsif( $type eq 'ARRAY' ) {
-            $var .= "->" unless $did_arrow++;
-            $var .= "[$idx]";
-        }
-        elsif( $type eq 'REF' ) {
-            $var = "\${$var}";
-        }
-    }
-
-    my @vals = @{ $Stack[-1]{vals} }[ 0, 1 ];
-    my @vars = ();
-    ( $vars[0] = $var ) =~ s/\$FOO/     \$got/;
-    ( $vars[1] = $var ) =~ s/\$FOO/\$expected/;
-
-    my $out = "Structures begin differing at:\n";
-    foreach my $idx ( 0 .. $#vals ) {
-        my $val = $vals[$idx];
-        $vals[$idx]
-          = !defined $val ? 'undef'
-          : _dne($val)    ? "Does not exist"
-          : ref $val      ? "$val"
-          :                 "'$val'";
-    }
-
-    $out .= "$vars[0] = $vals[0]\n";
-    $out .= "$vars[1] = $vals[1]\n";
-
-    $out =~ s/^/    /msg;
-    return $out;
-}
-
-sub _type {
-    my $thing = shift;
-
-    return '' if !ref $thing;
-
-    for my $type (qw(ARRAY HASH REF SCALAR GLOB CODE Regexp)) {
-        return $type if UNIVERSAL::isa( $thing, $type );
-    }
-
-    return '';
-}
-
-#line 1059
-
-sub diag {
-    return Test::More->builder->diag(@_);
-}
-
-sub note {
-    return Test::More->builder->note(@_);
-}
-
-#line 1085
-
-sub explain {
-    return Test::More->builder->explain(@_);
-}
-
-#line 1151
-
-## no critic (Subroutines::RequireFinalReturn)
-sub skip {
-    my( $why, $how_many ) = @_;
-    my $tb = Test::More->builder;
-
-    unless( defined $how_many ) {
-        # $how_many can only be avoided when no_plan is in use.
-        _carp "skip() needs to know \$how_many tests are in the block"
-          unless $tb->has_plan eq 'no_plan';
-        $how_many = 1;
-    }
-
-    if( defined $how_many and $how_many =~ /\D/ ) {
-        _carp
-          "skip() was passed a non-numeric number of tests.  Did you get the arguments backwards?";
-        $how_many = 1;
-    }
-
-    for( 1 .. $how_many ) {
-        $tb->skip($why);
-    }
-
-    no warnings 'exiting';
-    last SKIP;
-}
-
-#line 1238
-
-sub todo_skip {
-    my( $why, $how_many ) = @_;
-    my $tb = Test::More->builder;
-
-    unless( defined $how_many ) {
-        # $how_many can only be avoided when no_plan is in use.
-        _carp "todo_skip() needs to know \$how_many tests are in the block"
-          unless $tb->has_plan eq 'no_plan';
-        $how_many = 1;
-    }
-
-    for( 1 .. $how_many ) {
-        $tb->todo_skip($why);
-    }
-
-    no warnings 'exiting';
-    last TODO;
-}
-
-#line 1293
-
-sub BAIL_OUT {
-    my $reason = shift;
-    my $tb     = Test::More->builder;
-
-    $tb->BAIL_OUT($reason);
-}
-
-#line 1332
-
-#'#
-sub eq_array {
-    local @Data_Stack = ();
-    _deep_check(@_);
-}
-
-sub _eq_array {
-    my( $a1, $a2 ) = @_;
-
-    if( grep _type($_) ne 'ARRAY', $a1, $a2 ) {
-        warn "eq_array passed a non-array ref";
-        return 0;
-    }
-
-    return 1 if $a1 eq $a2;
-
-    my $ok = 1;
-    my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2;
-    for( 0 .. $max ) {
-        my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_];
-        my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_];
-
-        push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [ $e1, $e2 ] };
-        $ok = _deep_check( $e1, $e2 );
-        pop @Data_Stack if $ok;
-
-        last unless $ok;
-    }
-
-    return $ok;
-}
-
-sub _deep_check {
-    my( $e1, $e2 ) = @_;
-    my $tb = Test::More->builder;
-
-    my $ok = 0;
-
-    # Effectively turn %Refs_Seen into a stack.  This avoids picking up
-    # the same referenced used twice (such as [\$a, \$a]) to be considered
-    # circular.
-    local %Refs_Seen = %Refs_Seen;
-
-    {
-        # Quiet uninitialized value warnings when comparing undefs.
-        no warnings 'uninitialized';
-
-        $tb->_unoverload_str( \$e1, \$e2 );
-
-        # Either they're both references or both not.
-        my $same_ref = !( !ref $e1 xor !ref $e2 );
-        my $not_ref = ( !ref $e1 and !ref $e2 );
-
-        if( defined $e1 xor defined $e2 ) {
-            $ok = 0;
-        }
-        elsif( !defined $e1 and !defined $e2 ) {
-            # Shortcut if they're both defined.
-            $ok = 1;
-        }
-        elsif( _dne($e1) xor _dne($e2) ) {
-            $ok = 0;
-        }
-        elsif( $same_ref and( $e1 eq $e2 ) ) {
-            $ok = 1;
-        }
-        elsif($not_ref) {
-            push @Data_Stack, { type => '', vals => [ $e1, $e2 ] };
-            $ok = 0;
-        }
-        else {
-            if( $Refs_Seen{$e1} ) {
-                return $Refs_Seen{$e1} eq $e2;
-            }
-            else {
-                $Refs_Seen{$e1} = "$e2";
-            }
-
-            my $type = _type($e1);
-            $type = 'DIFFERENT' unless _type($e2) eq $type;
-
-            if( $type eq 'DIFFERENT' ) {
-                push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] };
-                $ok = 0;
-            }
-            elsif( $type eq 'ARRAY' ) {
-                $ok = _eq_array( $e1, $e2 );
-            }
-            elsif( $type eq 'HASH' ) {
-                $ok = _eq_hash( $e1, $e2 );
-            }
-            elsif( $type eq 'REF' ) {
-                push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] };
-                $ok = _deep_check( $$e1, $$e2 );
-                pop @Data_Stack if $ok;
-            }
-            elsif( $type eq 'SCALAR' ) {
-                push @Data_Stack, { type => 'REF', vals => [ $e1, $e2 ] };
-                $ok = _deep_check( $$e1, $$e2 );
-                pop @Data_Stack if $ok;
-            }
-            elsif($type) {
-                push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] };
-                $ok = 0;
-            }
-            else {
-                _whoa( 1, "No type in _deep_check" );
-            }
-        }
-    }
-
-    return $ok;
-}
-
-sub _whoa {
-    my( $check, $desc ) = @_;
-    if($check) {
-        die <<"WHOA";
-WHOA!  $desc
-This should never happen!  Please contact the author immediately!
-WHOA
-    }
-}
-
-#line 1465
-
-sub eq_hash {
-    local @Data_Stack = ();
-    return _deep_check(@_);
-}
-
-sub _eq_hash {
-    my( $a1, $a2 ) = @_;
-
-    if( grep _type($_) ne 'HASH', $a1, $a2 ) {
-        warn "eq_hash passed a non-hash ref";
-        return 0;
-    }
-
-    return 1 if $a1 eq $a2;
-
-    my $ok = 1;
-    my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2;
-    foreach my $k ( keys %$bigger ) {
-        my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE;
-        my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE;
-
-        push @Data_Stack, { type => 'HASH', idx => $k, vals => [ $e1, $e2 ] };
-        $ok = _deep_check( $e1, $e2 );
-        pop @Data_Stack if $ok;
-
-        last unless $ok;
-    }
-
-    return $ok;
-}
-
-#line 1522
-
-sub eq_set {
-    my( $a1, $a2 ) = @_;
-    return 0 unless @$a1 == @$a2;
-
-    no warnings 'uninitialized';
-
-    # It really doesn't matter how we sort them, as long as both arrays are
-    # sorted with the same algorithm.
-    #
-    # Ensure that references are not accidentally treated the same as a
-    # string containing the reference.
-    #
-    # Have to inline the sort routine due to a threading/sort bug.
-    # See [rt.cpan.org 6782]
-    #
-    # I don't know how references would be sorted so we just don't sort
-    # them.  This means eq_set doesn't really work with refs.
-    return eq_array(
-        [ grep( ref, @$a1 ), sort( grep( !ref, @$a1 ) ) ],
-        [ grep( ref, @$a2 ), sort( grep( !ref, @$a2 ) ) ],
-    );
-}
-
-#line 1735
-
-1;
@@ -1,17 +1,26 @@
 package Test::Synopsis;
+
 use strict;
+use warnings;
 use 5.008_001;
-our $VERSION = '0.06';
+
+our $VERSION = '0.10'; # VERSION
 
 use base qw( Test::Builder::Module );
 our @EXPORT = qw( synopsis_ok all_synopsis_ok );
 
 use ExtUtils::Manifest qw( maniread );
-
+my %ARGS;
+ # = ( dump_all_code_on_error => 1 ); ### REMOVE THIS FOR PRODUCTION!!!
 sub all_synopsis_ok {
+    %ARGS = @_;
+
     my $manifest = maniread();
     my @files = grep m!^lib/.*\.p(od|m)$!, keys %$manifest;
-    __PACKAGE__->builder->plan(tests => 1 * @files);
+    __PACKAGE__->builder->plan(@files
+        ? (tests => 1 * @files)
+        : (skip_all => 'No files in lib to test')
+    );
     synopsis_ok(@files);
 }
 
@@ -28,30 +37,127 @@ sub synopsis_ok {
         my $option = join(";", @option);
         my $test   = qq(#line $line "$module"\n$option; sub { $code });
         my $ok     = _compile($test);
-        __PACKAGE__->builder->ok($ok, $module);
-        __PACKAGE__->builder->diag($@) unless $ok;
+
+        # See if the user is trying to skip this test using the =for block
+        if ( !$ok and $@=~/^SKIP:.+BEGIN failed--compilation aborted/si ) {
+          $@ =~ s/^SKIP:\s*//;
+          $@ =~ s/\nBEGIN failed--compilation aborted at.+//s;
+          __PACKAGE__->builder->skip($@, 1);
+        }
+        else {
+          __PACKAGE__->builder->ok($ok, $module);
+          __PACKAGE__->builder->diag(
+              $ARGS{dump_all_code_on_error}
+              ? "$@\nEVALED CODE:\n$test"
+              : $@
+            ) unless $ok;
+        }
     }
 }
 
+my $sandbox = 0;
 sub _compile {
     package
         Test::Synopsis::Sandbox;
-    eval $_[0]; ## no critic
+    eval sprintf "package\nTest::Synopsis::Sandbox%d;\n%s",
+      ++$sandbox, $_[0]; ## no critic
 }
 
+### WARNING: DESPITE THE NAME OF THIS SUBROUTINE (no underscore)
+### IT'S A PRIVATE SUB; DO NOT USE IT DIRECTLY IN YOUR CODE!
 sub extract_synopsis {
     my $file = shift;
 
-    my $content = do {
-        local $/;
-        open my $fh, "<", $file or die "$file: $!";
-        <$fh>;
-    };
+    my $parser = Test::Synopsis::Parser->new;
+    $parser->parse_from_file ($file);
+    my $test_synopsis = $parser->{'test_synopsis'} || '';
+
+    # don't want __END__ blocks in SYNOPSIS chopping our '}' in wrapper sub
+    # same goes for __DATA__ and although we'll be sticking an extra '}'
+    # into its contents; it shouldn't matter since the code shouldn't be
+    # run anyways.
+    $test_synopsis =~ s/(?=(?:__END__|__DATA__)\s*$)/}\n/m;
+
+    # trim indent whitespace to make HEREDOCs work properly
+    # we'll assume the indent of the first line is the proper indent
+    # to use for the whole block
+    $test_synopsis =~ s/(\A(\s+).+)/ (my $x = $1) =~ s{^$2}{}gm; $x /se;
+
+    # Correct the reported line number of the error, depending on what
+    # =for options we were supplied with.
+    my $options_lines = join '', @{ $parser->{'test_synopsis_options'} };
+    $options_lines = $options_lines =~ tr/\n/\n/;
+
+    return (
+      $test_synopsis,
+      ($parser->{'test_synopsis_linenum'} || 0) - ($options_lines || 0),
+      @{ $parser->{'test_synopsis_options'} }
+    );
+}
+
+package
+  Test::Synopsis::Parser; # on new line to avoid indexing
 
-    my $code = ($content =~ m/^=head1\s+SYNOPSIS(.+?)^=head1/ms)[0];
-    my $line = ($` || '') =~ tr/\n/\n/;
+### Parser patch by Kevin Ryde
 
-    return $code, $line-1, ($content =~ m/^=for\s+test_synopsis\s+(.+?)^=/msg);
+use base 'Pod::Parser';
+sub new {
+    my $class = shift;
+    return $class->SUPER::new(
+      @_, within_begin => '', test_synopsis_options => []
+    );
+}
+
+sub command {
+    my $self = shift;
+    my ($command, $text) = @_;
+    ## print "command: '$command' -- '$text'\n";
+
+    if ($command eq 'for') {
+        if ($text =~ /^test_synopsis\s+(.*)/s) {
+            push @{$self->{'test_synopsis_options'}}, $1;
+        }
+    } elsif ($command eq 'begin') {
+        $self->{'within_begin'} = $text;
+    } elsif ($command eq 'end') {
+        $self->{'within_begin'} = '';
+    } elsif ($command eq 'pod') {
+        # resuming pod, retain begin/end/synopsis state
+    } else {
+        # Synopsis is "=head1 SYNOPSIS" through to next command other than
+        # the above "=for", "=begin", "=end", "=pod".  This means
+        #     * "=for" directives for other programs are skipped
+        #       (eg. HTML::Scrubber)
+        #     * "=begin" to "=end" for other program are skipped
+        #       (eg. Date::Simple)
+        #     * "=cut" to "=pod" actual code is skipped (perhaps unlikely in
+        #       practice)
+        #
+        # Could think about not stopping at "=head2" etc subsections of a
+        # synopsis, but a synopsis with subsections usually means different
+        # sample bits meant for different places and so probably won't
+        # actually run.
+        #
+        $self->{'within_synopsis'}
+          = ($command eq 'head1' && $text =~ /^SYNOPSIS\s*$/);
+    }
+    return '';
+}
+
+sub verbatim {
+    my ( $self, $text, $linenum ) = @_;
+    if ( $self->{'within_begin'} =~ /^test_synopsis\b/ ) {
+        push @{$self->{'test_synopsis_options'}}, $text;
+
+    } elsif ( $self->{'within_synopsis'} && ! $self->{'within_begin'} ) {
+        $self->{'test_synopsis_linenum'} = $linenum; # first occurance
+        $self->{'test_synopsis'} .= $text;
+    }
+    return '';
+}
+sub textblock {
+    # ignore text paragraphs, only take "verbatim" blocks to be code
+    return '';
 }
 
 1;
@@ -59,7 +165,10 @@ __END__
 
 =encoding utf-8
 
-=for stopwords Goro blogged
+=for Pod::Coverage extract_synopsis
+
+=for stopwords Goro blogged Znet Zoffix DOHERTY Doherty
+  KRYDE Ryde ZOFFIX Gr nauer Grünauer pm HEREDOC HEREDOCs
 
 =for test_synopsis $main::for_checked=1
 
@@ -86,21 +195,22 @@ under your I<lib> directory and then make sure the example snippet
 code in your I<SYNOPSIS> section passes the perl compile check.
 
 Note that this module only checks the perl syntax (by wrapping the
-code with C<sub>) and doesn't actually run the code.
+code with C<sub>) and doesn't actually run the code, B<UNLESS>
+that code is a C<BEGIN {}> block or a C<use> statement.
 
 Suppose you have the following POD in your module.
 
   =head1 NAME
-  
+
   Awesome::Template - My awesome template
-  
+
   =head1 SYNOPSIS
-    
+
     use Awesome::Template;
-    
+
     my $template = Awesome::Template->new;
     $tempalte->render("template.at");
-  
+
   =head1 DESCRIPTION
 
 An user of your module would try copy-paste this synopsis code and
@@ -114,7 +224,7 @@ Sometimes you might want to put some undeclared variables in your
 synopsis, like:
 
   =head1 SYNOPSIS
-    
+
     use Data::Dumper::Names;
     print Dumper($scalar, \@array, \%hash);
 
@@ -139,6 +249,89 @@ prepended before your SYNOPSIS code when being evaluated, so those
 variable name errors will go away, without adding unnecessary bits in
 SYNOPSIS which might confuse users.
 
+=head1 SKIPPING TEST FROM INSIDE THE POD
+
+You can use a C<BEGIN{}> block in the C<=for test_synopsis> to check for
+specific conditions (e.g. if a module is present), and possibly skip
+the test.
+
+If you C<die()> inside the C<BEGIN{}> block and the die message begins
+with sequence C<SKIP:> (note the colon at the end), the test
+will be skipped for that document.
+
+  =head1 SYNOPSIS
+
+  =for test_synopsis BEGIN { die "SKIP: skip this pod, it's horrible!\n"; }
+
+      $x; # undeclared variable, but we skipped the test!
+
+  =end
+
+=head1 EXPORTED SUBROUTINES
+
+=head2 C<all_synopsis_ok>
+
+  all_synopsis_ok();
+
+  all_synopsis_ok( dump_all_code_on_error => 1 );
+
+Checks the SYNOPSIS code in all your modules. Takes B<optional>
+arguments as key/value pairs. Possible arguments are as follows:
+
+=head3 C<dump_all_code_on_error>
+
+  all_synopsis_ok( dump_all_code_on_error => 1 );
+
+Takes true or false values as a value. B<Defaults to:> false. When
+set to a true value, if an error is discovered in the SYNOPSIS code,
+the test will dump the entire snippet of code it tried to test. Use this
+if you want to copy/paste and play around with the code until the error
+is fixed.
+
+The dumped code will include any of the C<=for> code you specified (see
+L<VARIABLE DECLARATIONS> section above) as well as a few internal bits
+this test module uses to make SYNOPSIS code checking possible.
+
+B<Note:> you will likely have to remove the C<#> and a space at the start
+of each line (C<perl -pi -e 's/^#\s//;' TEMP_FILE_WITH_CODE>)
+
+=head2 C<synopsis_ok>
+
+  use Test::More tests => 1;
+  use Test::Synopsis;
+  synopsis_ok("t/lib/NoPod.pm");
+  synopsis_ok(qw/Pod1.pm  Pod2.pm  Pod3.pm/);
+
+Lets you test a single file. B<Note:> you must setup your own plan if
+you use this subroutine (e.g. with C<< use Test::More tests => 1; >>).
+B<Takes> a list of filenames for documents containing SYNOPSIS code to test.
+
+=head1 CAVEATS
+
+This module will not check code past the C<__END__> or
+C<__DATA__> tokens, if one is
+present in the SYNOPSIS code.
+
+This module will actually execute C<use> statements and any code
+you specify in the C<BEGIN {}> blocks in the SYNOPSIS.
+
+If you're using HEREDOCs in your SYNOPSIS, you will need to place
+the ending of the HEREDOC at the same indent as the
+first line of the code of your SYNOPSIS.
+
+=head1 REPOSITORY
+
+Fork this module on GitHub:
+L<https://github.com/miyagawa/Test-Synopsis>
+
+=head1 BUGS
+
+To report bugs or request features, please use
+L<https://github.com/miyagawa/Test-Synopsis/issues>
+
+If you can't access GitHub, you can email your request
+to C<bug-Test-Synopsis at rt.cpan.org>
+
 =head1 AUTHOR
 
 Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
@@ -147,13 +340,35 @@ Goro Fuji blogged about the original idea at
 L<http://d.hatena.ne.jp/gfx/20090224/1235449381> based on the testing
 code taken from L<Test::Weaken>.
 
+=head1 MAINTAINER
+
+Zoffix Znet <cpan (at) zoffix.com>
+
+=head1 CONTRIBUTORS
+
+=over 4
+
+=item * Kevin Ryde (L<KRYDE|https://metacpan.org/author/KRYDE>)
+
+=item * Marcel Grünauer (L<MARCEL|https://metacpan.org/author/MARCEL>)
+
+=item * Mike Doherty (L<DOHERTY|https://metacpan.org/author/DOHERTY>)
+
+=item * Zoffix Znet (L<ZOFFIX|https://metacpan.org/author/ZOFFIX>)
+
+=back
+
 =head1 LICENSE
 
 This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=head1 COPYRIGHT
+
+This library is Copyright (c) Tatsuhiko Miyagawa
+
 =head1 SEE ALSO
 
-L<Test::Pod>, L<Test::UseAllModules>, L<Test::Inline>, L<Test::Snippet>
+L<Test::Pod>, L<Test::UseAllModules>, L<Test::Inline>
 
 =cut
@@ -0,0 +1,50 @@
+use 5.006;
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.039
+
+use Test::More  tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0);
+
+
+
+my @module_files = (
+    'Test/Synopsis.pm'
+);
+
+
+
+# no fake home requested
+
+my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib';
+
+use File::Spec;
+use IPC::Open3;
+use IO::Handle;
+
+open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!";
+
+my @warnings;
+for my $lib (@module_files)
+{
+    # see L<perlfaq8/How can I capture STDERR from an external command?>
+    my $stderr = IO::Handle->new;
+
+    my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]");
+    binmode $stderr, ':crlf' if $^O eq 'MSWin32';
+    my @_warnings = <$stderr>;
+    waitpid($pid, 0);
+    is($?, 0, "$lib loaded ok");
+
+    if (@_warnings)
+    {
+        warn @_warnings;
+        push @warnings, @_warnings;
+    }
+}
+
+
+
+is(scalar(@warnings), 0, 'no warnings found') if $ENV{AUTHOR_TESTING};
+
+
@@ -1,4 +0,0 @@
-use strict;
-use Test::More tests => 1;
-
-BEGIN { use_ok 'Test::Synopsis' }
@@ -0,0 +1,13 @@
+use Test::Builder::Tester tests => 1;
+use Test::More;
+use Test::Synopsis;
+
+# Test whether we indeed can detect errors in SYNOPSIS codes
+
+test_out('not ok 1 - t/lib/BrokenSYNOPSIS01.pm');
+test_diag(q{  Failed test 't/lib/BrokenSYNOPSIS01.pm'},
+    q{  at t/01-fail-if-SYNOPSIS-has-errors.t line } . line_num(+4) . q{.},
+    q{Global symbol "$x" requires explicit package name at t/lib/BrokenSYNOPSIS01.pm line 20.},
+);
+synopsis_ok("t/lib/BrokenSYNOPSIS01.pm");
+test_test("synopsis fail works");
@@ -0,0 +1,13 @@
+use Test::Builder::Tester tests => 1;
+use Test::More;
+use Test::Synopsis;
+
+# Test whether we indeed can detect errors in SYNOPSIS codes
+
+test_out('not ok 1 - t/lib/ENDInPodWithError.pm');
+test_diag(q{  Failed test 't/lib/ENDInPodWithError.pm'},
+    q{  at t/02-END-token-errors.t line } . line_num(+4) . q{.},
+    q{Global symbol "$x" requires explicit package name at t/lib/ENDInPodWithError.pm line 30.},
+);
+synopsis_ok("t/lib/ENDInPodWithError.pm");
+test_test("synopsis fail works");
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+use Test::Synopsis;
+synopsis_ok("t/lib/ENDInPod.pm");
+
+
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+use Test::Synopsis;
+synopsis_ok("t/lib/Test04HEREDOC.pm");
+
+
@@ -0,0 +1,8 @@
+use Test::More tests => 2;
+use Test::Synopsis;
+
+# Test tests whether SYNOPSIS in separate files clashes
+# See RT#76856
+
+synopsis_ok("t/lib/Test03.pm");
+synopsis_ok("t/lib/Test03Other.pm");
@@ -0,0 +1,6 @@
+no warnings;
+use Test::Synopsis;
+use Test::More tests => 2;
+
+synopsis_ok("lib/Test/Synopsis.pm");
+is $main::for_checked, 1;
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+use Test::Synopsis;
+synopsis_ok("t/lib/NoPod.pm");
+
+
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+use Test::Synopsis;
+synopsis_ok("t/lib/PlainTextInPod.pm");
+
+
@@ -0,0 +1,4 @@
+use Test::Synopsis;
+all_synopsis_ok(dump_all_code_on_error => 1);
+
+
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+use Test::Synopsis;
+synopsis_ok("t/lib/Test10InPodSkipWithBegin.pm");
+
+
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+use Test::Synopsis;
+synopsis_ok("t/lib/Test11DATAInPod.pm");
+
+
@@ -0,0 +1,13 @@
+use Test::Builder::Tester tests => 1;
+use Test::More;
+use Test::Synopsis;
+
+# Test whether we indeed can detect errors in SYNOPSIS codes
+
+test_out('not ok 1 - t/lib/Test12DATAInPodWithError.pm');
+test_diag(q{  Failed test 't/lib/Test12DATAInPodWithError.pm'},
+    q{  at t/12-DATA-token-errors.t line } . line_num(+4) . q{.},
+    q{Global symbol "$x" requires explicit package name at t/lib/Test12DATAInPodWithError.pm line 28.},
+);
+synopsis_ok("t/lib/Test12DATAInPodWithError.pm");
+test_test("synopsis fail works");
@@ -1,6 +0,0 @@
-no warnings;
-use Test::Synopsis;
-use Test::More tests => 2;
-
-synopsis_ok("lib/Test/Synopsis.pm");
-is $main::for_checked, 1;
@@ -0,0 +1,24 @@
+package Test::Synopsis::__TestBait_BrokenSYNOPSIS01;
+
+# Used by 01-fail-if-SYNOPSIS-has-errors.t
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+    print "Foos!\n";
+
+    $x; # undeclared
+
+=head1 DESCRIPTION
+
+bleh
+
+=cut
@@ -0,0 +1,32 @@
+package Test::Synopsis::__TestBait_ENDinPod;
+
+# Dummy module used during testing of Test::Synopsis. Needs to be in the lib/
+# dir of the Test-Synopsis distribution to Test::Synopsis can find it.
+#
+# This module has an __END__ in the synopsis code; it shouldn't
+# break Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    print "Foos!\n";
+
+    __END__
+
+    BLARGHS!
+
+=head1 DESCRIPTION
+
+bleh
+
+=cut
@@ -0,0 +1,34 @@
+package Test::Synopsis::__TestBait_ENDinPodWithError;
+
+# Dummy module used during testing of Test::Synopsis. Needs to be in the lib/
+# dir of the Test-Synopsis distribution to Test::Synopsis can find it.
+#
+# This module does not has an __END__ in the synopsis code; it should
+# break Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    print "Foos!\n";
+
+    $x; # undeclared
+
+    __END__
+
+    BLARGHS!
+
+=head1 DESCRIPTION
+
+bleh
+
+=cut
@@ -9,6 +9,6 @@ package Test::Synopsis::__TestBait_NoPod;
 use strict;
 use warnings;
 
-our $VERSION = '0.05';
+# VERSION
 
 1;
@@ -0,0 +1,34 @@
+package Test::Synopsis::__TestBait_PlainTextInPod;
+
+# Dummy module used during testing of Test::Synopsis. Needs to be in the lib/
+# dir of the Test-Synopsis distribution to Test::Synopsis can find it.
+#
+# This module has plain text in the middle of the SYNOPSIS code; we should
+# ignore it
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Print some foos:
+
+    print "Foos!\n";
+
+Blarg away:
+
+    BLARGHS();
+
+MOAR BLARGHS!
+
+=head1 DESCRIPTION
+
+bleh
+
+=cut
@@ -0,0 +1,19 @@
+package Test::Synopsis::__TestBait_Test03;
+# Dummy module used during testing of Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    BEGIN { our $Foo = 42; }
+
+=cut
\ No newline at end of file
@@ -0,0 +1,22 @@
+package Test::Synopsis::__TestBait_Test03Other;
+# Dummy module used during testing of Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    BEGIN {
+        no strict 'refs';
+        die "CLASHING!" if grep $_ eq 'Foo', keys %{ __PACKAGE__ .'::' };
+    }
+
+=cut
\ No newline at end of file
@@ -0,0 +1,21 @@
+package Test::Synopsis::__TestBait_Test04HEREDOC;
+# Dummy module used during testing of Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    my $x = <<'END';
+        blargs
+    END
+
+=cut
\ No newline at end of file
@@ -0,0 +1,21 @@
+package Test::Synopsis::__TestBait_Test10HEREDOC;
+# Dummy module used during testing of Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    my $x = <<'END';
+        blargs
+    END
+
+=cut
\ No newline at end of file
@@ -0,0 +1,19 @@
+package Test::Synopsis::__TestBait_Test10InPodSkipWithBegin;
+# Dummy module used during testing of Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+=for test_synopsis BEGIN { die "SKIP: testing skipping stuff \\o/\n"; }
+
+    $x;
+
+=cut
\ No newline at end of file
@@ -0,0 +1,32 @@
+package Test::Synopsis::__TestBait_Test11DATAInPod;
+
+# Dummy module used during testing of Test::Synopsis. Needs to be in the lib/
+# dir of the Test-Synopsis distribution to Test::Synopsis can find it.
+#
+# This module has a __DATA__ in the synopsis code; it shouldn't
+# break Test::Synopsis
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    print "Foos!\n";
+
+    __DATA__
+
+    $x; # uninitialized!
+
+=head1 DESCRIPTION
+
+bleh
+
+=cut
@@ -0,0 +1,32 @@
+package Test::Synopsis::__TestBait_Test11DATAInPod;
+
+# Dummy module used during testing of Test::Synopsis. Needs to be in the lib/
+# dir of the Test-Synopsis distribution to Test::Synopsis can find it.
+#
+# This module has a __DATA__ in the synopsis code along with an error
+# that Test::Synopsis should be detecting
+
+use strict;
+use warnings;
+
+# VERSION
+
+1;
+
+=pod
+
+=head1 SYNOPSIS
+
+Testing stuff:
+
+    print "Foos!\n";
+
+    $x; # uninitialized!
+
+    __DATA__
+
+=head1 DESCRIPTION
+
+bleh
+
+=cut
@@ -1,5 +0,0 @@
-use Test::More tests => 1;
-use Test::Synopsis;
-synopsis_ok("t/lib/NoPod.pm");
-
-
@@ -1,4 +0,0 @@
-use Test::Synopsis;
-all_synopsis_ok();
-
-
@@ -0,0 +1,30 @@
+use strict;
+use warnings;
+use Test::More;
+
+# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006002
+use Test::Spelling 0.12;
+use Pod::Wordlist;
+
+
+add_stopwords(<DATA>);
+all_pod_files_spelling_ok( qw( bin lib  ) );
+__DATA__
+Tatsuhiko
+Miyagawa
+miyagawa
+Kevin
+Ryde
+kryde
+Marcel
+Grünauer
+marcel
+Mike
+Doherty
+doherty
+Zoffix
+Znet
+zoffix
+lib
+Test
+Synopsis
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+use Test::More;
+
+# generated by Dist::Zilla::Plugin::Test::EOL 0.10
+use Test::EOL;
+
+all_perl_files_ok({ trailing_whitespace => 1 });
@@ -1,5 +0,0 @@
-use strict;
-use Test::More;
-eval q{ use Test::Perl::Critic };
-plan skip_all => "Test::Perl::Critic is not installed." if $@;
-all_critic_ok("lib");
@@ -1,4 +0,0 @@
-use Test::More;
-eval "use Test::Pod 1.00";
-plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
-all_pod_files_ok();
@@ -1,9 +0,0 @@
-use Test::More;
-eval q{ use Test::Spelling };
-plan skip_all => "Test::Spelling is not installed." if $@;
-add_stopwords(<DATA>);
-set_spell_cmd("aspell -l en list");
-all_pod_files_spelling_ok('lib');
-__DATA__
-Tatsuhiko
-Miyagawa
@@ -0,0 +1,11 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More 0.96 tests => 2;
+use_ok('Test::CPAN::Changes');
+subtest 'changes_ok' => sub {
+    changes_file_ok('Changes');
+};
+done_testing();
@@ -0,0 +1,8 @@
+#!perl
+
+use Test::More;
+
+eval "use Test::DistManifest";
+plan skip_all => "Test::DistManifest required for testing the manifest"
+  if $@;
+manifest_ok();
@@ -0,0 +1,8 @@
+#!perl
+# This file was automatically generated by Dist::Zilla::Plugin::MetaTests.
+
+use Test::More;
+
+eval "use Test::CPAN::Meta";
+plan skip_all => "Test::CPAN::Meta required for testing META.yml" if $@;
+meta_yaml_ok();
@@ -0,0 +1,11 @@
+#!perl
+
+# This test is generated by Dist::Zilla::Plugin::Test::Kwalitee::Extra
+use strict;
+use warnings;
+use Test::More;   # needed to provide plan.
+
+eval { require Test::Kwalitee::Extra };
+plan skip_all => "Test::Kwalitee::Extra required for testing kwalitee: $@" if $@;
+
+eval "use Test::Kwalitee::Extra";
@@ -0,0 +1,8 @@
+#!perl
+
+use Test::More;
+
+eval "use Test::MinimumVersion";
+plan skip_all => "Test::MinimumVersion required for testing minimum versions"
+  if $@;
+all_minimum_version_ok( qq{5.008008} );
@@ -0,0 +1,12 @@
+#!perl
+
+use strict;
+use warnings qw(all);
+
+use Test::More;
+
+## no critic (ProhibitStringyEval, RequireCheckingReturnValueOfEval)
+eval q(use Test::Mojibake);
+plan skip_all => q(Test::Mojibake required for source encoding testing) if $@;
+
+all_files_encoding_ok();
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::NoTabsTests 0.06
+
+use Test::More 0.88;
+use Test::NoTabs;
+
+my @files = (
+    'lib/Test/Synopsis.pm'
+);
+
+notabs_ok($_) foreach @files;
+done_testing;
@@ -0,0 +1,14 @@
+#!perl
+# This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests.
+
+use Test::More;
+
+eval "use Test::Pod::Coverage 1.08";
+plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage"
+  if $@;
+
+eval "use Pod::Coverage::TrustPod";
+plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage"
+  if $@;
+
+all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' });
@@ -0,0 +1,8 @@
+#!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 $@;
+
+all_pod_files_ok();
@@ -0,0 +1,11 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+eval 'use Test::Portability::Files';
+plan skip_all => 'Test::Portability::Files required for testing portability'
+    if $@;
+run_tests();
@@ -0,0 +1,8 @@
+#!perl
+
+use Test::More;
+
+eval "use Test::Synopsis";
+plan skip_all => "Test::Synopsis required for testing synopses"
+  if $@;
+all_synopsis_ok();
@@ -0,0 +1,22 @@
+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   => 0,
+    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;
@@ -0,0 +1,8 @@
+#!perl
+
+use Test::More;
+
+eval "use Test::Vars";
+plan skip_all => "Test::Vars required for testing unused vars"
+  if $@;
+all_vars_ok();