The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Build.PL 550
Changes 698387
MANIFEST 5318
META.json 9221
META.yml 8432
Makefile.PL 3728
README 210
bin/cpants_lint.pl 2190
cpanfile 023
lib/Module/CPANTS/Analyse.pm 3671
lib/Module/CPANTS/Kwalitee/BrokenInstaller.pm 2022
lib/Module/CPANTS/Kwalitee/CpantsErrors.pm 12
lib/Module/CPANTS/Kwalitee/Distname.pm 76
lib/Module/CPANTS/Kwalitee/Distros.pm 335
lib/Module/CPANTS/Kwalitee/Files.pm 117129
lib/Module/CPANTS/Kwalitee/FindModules.pm 417
lib/Module/CPANTS/Kwalitee/License.pm 3566
lib/Module/CPANTS/Kwalitee/Manifest.pm 614
lib/Module/CPANTS/Kwalitee/MetaYML.pm 131150
lib/Module/CPANTS/Kwalitee/NeedsCompiler.pm 12
lib/Module/CPANTS/Kwalitee/Pod.pm 12126
lib/Module/CPANTS/Kwalitee/Prereq.pm 910
lib/Module/CPANTS/Kwalitee/Repackageable.pm 34
lib/Module/CPANTS/Kwalitee/Signature.pm 23
lib/Module/CPANTS/Kwalitee/Uses.pm 64126
lib/Module/CPANTS/Kwalitee/Version.pm 45
lib/Module/CPANTS/Kwalitee.pm 216
t/00_load.t 23
t/02_kwalitee.t 540
t/03_plugins.t 440
t/05_testdir.t 33
t/05_testfile.t 23
t/10_analyse.t 2590
t/11_hash_random.pl 400
t/11_hash_random.t 140
t/analyse/manifest.t 080
t/analyse/pod.t 025
t/analyse_afs.t 390
t/analyse_axkit_xsp_l10n.t 320
t/analyse_devel_timer.t 350
t/analyse_eg_c.t 290
t/analyse_html_tiny.t 300
t/analyse_test_yaml_meta.t 260
t/calc.t 820
t/calc_test_yaml_meta.t 560
t/eg/AFS-2.4.0.tar.gz --
t/eg/Acme-DonMartin-0.06.tar.gz --
t/eg/Acme-DonMartinOther-0.06.tar.gz --
t/eg/App-Wack-0.05.tar.gz --
t/eg/App-perlhl-0.002.tar.gz --
t/eg/AxKit-XSP-L10N-0.03.tar.gz --
t/eg/Capture-Tiny-0.05.tar.gz --
t/eg/DBIx-SchemaChecksum-0.06.tar.gz --
t/eg/Debian_CPANTS.txt 220
t/eg/Devel-Timer-0.02.tar.gz --
t/eg/Eg-C-0.01.tar.gz --
t/eg/HTML-Tiny-0.904.tar.gz --
t/eg/PPI-HTML-1.07.tar.gz --
t/eg/Parse-Fedora-Packages-0.02.tar.gz --
t/eg/Pipe-0.03.tar.gz --
t/eg/Set-Object-1.28.tar.gz --
t/eg/Term-Title-0.03.tar.gz --
t/eg/Test-YAML-Meta-0.04.tar.gz --
t/eg/Text-CSV_XS-0.40.tgz --
t/eg/manifest/Good-Dist-0.01.tar.gz --
t/eg/manifest/bad-manifest-0.01.tar.gz --
t/eg/manifest/no-manifest-0.01.tar.gz --
t/eg/modified/DBIx-SchemaChecksum-0.06.tar.gz --
t/eg/not_extractable.gz --
t/lib/Module/CPANTS/TestAnalyse.pm 0129
t/moose_as_strict.t 230
t/older_test_kwalitee.t 22
t/perl5i_as_strict.t 220
t/perl5i_as_warnings.t 220
t/plugin_manifest.t 410
t/unpack.t 200
t/unpack_notextractable.t 270
t/x_cpants.t 051
xt/kwalitee/Test.pm 311
xt/kwalitee/has_abstract_in_pod.t 024
xt/kwalitee/has_buildtool.t 1010
xt/kwalitee/has_changelog.t 1010
xt/kwalitee/has_human_readable_license.t 88
xt/kwalitee/has_known_license_in_source_file.t 025
xt/kwalitee/has_license_in_source_file.t 87
xt/kwalitee/has_manifest.t 1010
xt/kwalitee/has_meta_yml.t 1010
xt/kwalitee/has_readme.t 1010
xt/kwalitee/has_separate_license_file.t 1010
xt/kwalitee/has_tests.t 1010
xt/kwalitee/has_tests_in_t_dir.t 1010
xt/kwalitee/manifest_matches_dist.t 1010
xt/kwalitee/meta_json_conforms_to_known_spec.t 034
xt/kwalitee/meta_json_is_parsable.t 022
xt/kwalitee/meta_yml_conforms_to_known_spec.t 033
xt/kwalitee/meta_yml_declares_perl_version.t 014
xt/kwalitee/meta_yml_has_license.t 016
xt/kwalitee/meta_yml_has_provides.t 014
xt/kwalitee/meta_yml_has_repository_resource.t 08
xt/kwalitee/meta_yml_is_parsable.t 026
xt/kwalitee/metayml_conforms_spec_current.t 150
xt/kwalitee/metayml_conforms_to_known_spec.t 150
xt/kwalitee/metayml_declares_perl_version.t 160
xt/kwalitee/metayml_has_license.t 160
xt/kwalitee/metayml_has_provides.t 160
xt/kwalitee/metayml_is_parsable.t 190
xt/kwalitee/no_abstract_stub_in_pod.t 017
xt/kwalitee/no_broken_auto_install.t 1010
xt/kwalitee/no_broken_module_install.t 1111
xt/kwalitee/no_stdin_for_prompting.t 1010
xt/kwalitee/no_symlinks.t 1010
xt/kwalitee/proper_libs.t 1010
xt/kwalitee/use_strict.t 1217
xt/kwalitee/use_warnings.t 1016
xt/strict_warnings_equiv.t 01
115 files changed (This is a version diff) 29322023
@@ -1,55 +0,0 @@
-use utf8;
-use strict;
-use Module::Build;
-
-my $build = Module::Build->new(
-    dist_author => 'Lars Dɪᴇᴄᴋᴏᴡ <daxim@cpan.org>',
-    module_name => 'Module::CPANTS::Analyse',
-    license     => 'perl',
-    requires    => {
-        'Class::Accessor'           => '0.19',
-        'Archive::Any::Lite'        => '0.06',
-        'Archive::Tar'              => '1.48', #depends on IO::Compress without memory leak
-        'CPAN::DistnameInfo'        => '0.06',
-        'CPAN::Meta::YAML'          => '0.008',
-        'CPAN::Meta::Validator'     => '2.131490',
-        'YAML::Any'                 => 0,
-        'Module::ExtractUse'        => '0.30', # for used_in_eval
-        'Module::Pluggable'         => '2.96',
-        'IO::Capture'               => '0.05',
-        'Array::Diff'               => '0.04',
-        'version'                   => '0.73',
-        'File::Find::Rule::VCS'     => '0',
-        'Software::License'         => '0.003',
-        'perl'                      => 5.006,
-        'Set::Scalar'               => 0,
-        'Text::Balanced'            => 0,
-    },
-    build_requires => {
-        'Test::More'                => '0',
-        'Test::Deep'                => '0',
-        'Test::Warn'                => '0.11', #less problems with new Sub::Uplevel
-        'Test::NoWarnings'          => '0',
-        'Cwd'                       => '0',
-    },
-    configure_requires => {
-        'Module::Build'             => '0.4',
-    },
-    meta_merge => {
-        resources => {
-            homepage => 'http://cpants.cpanauthors.org',
-            repository => 'https://github.com/cpants/Module-CPANTS-Analyse',
-            bugtracker => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Module-CPANTS-Analyse',
-            },
-        keywords => [
-            'CPANTS','kwalitee',
-        ],
-    },
-    script_files=>[qw(bin/cpants_lint.pl)],
-    create_makefile_pl=>'traditional',
-);
-
-
-$build->add_to_cleanup('Debian_CPANTS.txt');
-$build->create_build_script;
-
@@ -1,698 +1,387 @@
-=encoding UTF-8
-
-=head1 NAME
-
-Changes - Revision history for Module-CPANTS-Analyse
-
-=head2 0.92 2013-09-22
-
-=over
-
-=item Fixed a case when more than one license sections come in row (spotted by ysasaki++) (ishigaki)
-
-=item stopped checking auto_features (ishigaki)
-
-=back
-
-=head2 0.91 2013-09-05
-
-=over
-
-=item Fixed RT#69233 - doesn't detect use >= 5.012 as use strict (ishigaki)
-
-=item Fixed RT#83336 - Fails to detect strict via `use MooseX::Types` (ether)
-
-=item Fixed RT#83851 - 'use v5.16' and greater not deemed "strict" (ishigaki)
-
-=item Fixed RT#86504 - fix sort order of Kwalitee generators (ether)
-
-=item Fixed RT#87155 - more Module::Install tests needed (1.04 is broken) (ishigaki)
-
-=item Fixed RT#87597 - proper_libs is a dubious test (ishigaki)
-
-=item Fixed RT#87598 - Can't use an undefined value as an ARRAY reference at .../FindModules.pm line 115. (ishigaki)
-
-=item Fixed RT#87988 - Fix use of $Test::Kwalitee::VERSION (ether)
-
-=item Fixed RT#88216 - extracts_nicely metric fails for -TRIAL releases (ishigaki)
-
-=item Fixed RT#88365 - YAML/JSON tests are not failing when improperly encoded characters are seen (ishigaki)
-
-=item Moose::Exporter also provides strict and warnings (doy)
-
-=back
-
-=head2 0.90_02 2013-08-03
-
-=over
-
-=item Fixed L<rt#87535|https://rt.cpan.org/Ticket/Display.html?id=87535> - incorrect version specification in 0.90_01 (L<ether|https://metacpan.org/author/ether>)
-
-=item Fixed L<rt#87534|https://rt.cpan.org/Ticket/Display.html?id=87534> - Test failure in 0.90_01 (L<ether|https://metacpan.org/author/ether>)
-
-=item Fixed L<rt#87561|https://rt.cpan.org/Ticket/Display.html?id=87561> - t/11_hash_random.t fails due to undeclared test dependency (L<wyant|https://metacpan.org/author/wyant>)
-
-=back
-
-=head2 0.90_01 2013-08-01
-
-=over
-
-=item Applied all the changes in 0.88 again, and removed a few non-portable metrics for Test::Kwalitee.
-
-=back
-
-=head2 0.89 2013-08-01
-
-=over
-
-=item Tentatively reverted all the changes in 0.88
-
-=back
-
-=head2 0.88 2013-08-01
-
-=over
-
-=item add metric C<no_dot_underscore_files>
-(L<daxim|https://metacpan.org/author/daxim>,
-L<charsbar|https://metacpan.org/author/ishigaki>)
-
-=item remove metrics C<distributed_by_debian>,
-C<latest_version_distributed_by_debian>, C<has_no_bugs_reported_in_debian>,
-C<has_no_patches_in_debian>, C<no_cpants_errors>, C<uses_test_nowarnings>,
-C<has_test_pod>, C<has_test_pod_coverage>, C<has_examples>
-(L<charsbar|https://metacpan.org/author/ishigaki>)
-
-=item add metric C<portable_filenames>
-(L<charsbar|https://metacpan.org/author/ishigaki>)
-
-=item numerous fixes for a smoother operation of www-cpants
-(L<charsbar|https://metacpan.org/author/ishigaki>)
-
-=back
-
-=head2 0.87 2013-02-12
-
-=over
-
-=item fix L<rt#80225|https://rt.cpan.org/Ticket/Display.html?id=80225> - Test
-failures due to Test::CPAN::Meta::YAML::Version interface change
-(L<wyant|https://metacpan.org/author/wyant>)
-
-=item fix L<rt#82939|https://rt.cpan.org/Ticket/Display.html?id=82939> -
-Hash-Randomization causes 10_analyse.t to fail
-(L<kentnl|https://metacpan.org/author/kentnl>,
-L<chorny|https://metacpan.org/author/chorny>)
-
-=item fix L<rt#44796|https://rt.cpan.org/Ticket/Display.html?id=44796> -
-Module::CPANTS::Kwalitee::Manifest broken for MANIFESTs containing files with
-spaces (L<rivy|https://metacpan.org/author/rivy>)
-
-=back
-
-=head2 0.86 2012-04-11
-
-=over
-
-=item add several strict and warnings equivalents & make it easy to add more
-
-=item fix when L<Moose> is used and strict is not used
-
-=item add info about C<MIN_PERL_VERSION>
-
-=item better remedy for
-L<metayml_declares_perl_version|Module::CPANTS::Kwalitee::MetaYML>
-
-=item L<metayml_declares_perl_version|Module::CPANTS::Kwalitee::MetaYML> moved
-from experimental to extra
-
-=item some pod improvements (L<jquelin|https://metacpan.org/author/jquelin>)
-
-=item fix L<rt#65903|https://rt.cpan.org/Ticket/Display.html?id=65903> - no more
-C<Test::YAML::Meta::Version> on CPAN
-(L<jquelin|https://metacpan.org/author/jquelin>)
-
-=item replace L<YAML::Syck> with L<YAML::Any>
-(L<jquelin|https://metacpan.org/author/jquelin>)
-
-=item L<no_symlinks|Module::CPANTS::Kwalitee::Files> checks only files in
-F<MANIFEST>, use L<ExtUtils::Manifest/maniread>
-(L<rurban|https://metacpan.org/author/rurban>)
-
-=item add more equivalents for L<use_strict|Module::CPANTS::Kwalitee::Uses> and
-L<use_warnings|Module::CPANTS::Kwalitee::Uses> tests
-(L<doherty|https://metacpan.org/author/doherty>)
-
-=item implement L<valid_signature|Module::CPANTS::Kwalitee::Signature> metric
-(L<daxim|https://metacpan.org/author/daxim>)
-
-=back
-
-=head2 0.85 2009-07-12, L<Alexandr Ciornii|https://metacpan.org/author/chorny>
-
-=over
-
-=item fix fails on non-Win32
-
-=back
-
-=head2 0.84 2009-07-08, L<Alexandr Ciornii|https://metacpan.org/author/chorny>
-
-=over
-
-=item require L<Test::Warn> 0.11
-
-=item add L<Test::More> to deps
-
-=item add L<LWP::Simple> to deps
-
-=item fix F<calc_test_yaml_meta.t>
-
-=item better F<META.yml>
-
-=item list of changes for L<0.83|/"0.83 2009-06-10">
-(L<domm|https://metacpan.org/author/domm>)
-
-=back
-
-=head2 0.83 2009-06-10
-
-=over
-
-=item ignore C<no_index> when searching for examples
-(L<xdaveg|https://metacpan.org/author/dagolden>)
-
-=item skip the debian metrics and downloading the debian file when in LINT
-(L<szabgab|https://metacpan.org/author/szabgab>)
-
-=item L<has_test_pod|Module::CPANTS::Kwalitee::Uses> and
-L<has_test_pod_coverage|Module::CPANTS::Kwalitee::Uses> are now optional metrics
-(L<domm|https://metacpan.org/author/domm>)
-
-=back
-
-=head2 0.82 2008-07-08 10:23:30
-
-=over
-
-=item update F<META.yml>
-L<spec to 1.4|http://module-build.sourceforge.net/META-spec-v1.4.html>
-
-=item fixed experimental metrics
-
-=item use L<Moose> now counts for using L<strict>
-
-=item lots of commits from L<Gábor|https://metacpan.org/author/szabgab>
-
-=item honor F<META.yml> key C<no_index>. Fixes
-L<RT#32777|https://rt.cpan.org/Ticket/Display.html?id=32777> and an IRC
-complaint by L<BinGOs|https://metacpan.org/author/bingos>
-
-=back
-
-=head2 0.81 Sun Apr 13 16:45:29 CEST 2008
-
-=over
-
-=item fixed doc bug in SYNOPSIS (reported by
-L<ADAMOWSKI|https://metacpan.org/author/adamowski> as
-L<RT#34773|https://rt.cpan.org/Ticket/Display.html?id=34773>)
-
-=item made L<Module::CPANTS::Kwalitee::FindModules> smarter
-(L<domm|https://metacpan.org/author/domm>): If available, use F<META.yml>
-C<provides>. If not, look for C<package> statements in files. It now also finds
-stuff like L<Tk::Widget> and L<App::Ack>
-
-=item upgrade to L<Software::License> 0.003
-(L<Gábor|https://metacpan.org/author/szabgab>)
-
-=back
-
-=head2 0.80 Sat Apr 12 10:53:40 CEST 2008
-
-L<domm|https://metacpan.org/author/domm>:
-
-=over
-
-=item add L<metayml_has_provides|Module::CPANTS::Kwalitee::MetaYML> metric
-
-=back
-
-L<Gábor Szabó|https://metacpan.org/author/szabgab>:
-
-=over
-
-=item simplify the way the VERSION number is looked up, keep the full version
-line
-
-=item increase the L<no_large_files|Module::CPANTS::Kwalitee::Files> limit to
-200_000
-
-=item some unit test fixes thanks to L<Tux|https://metacpan.org/author/hmbrand>
-
-=item some of {error} fields are now ARRAY refs instead of strings
-
-=item more detailed unit tests
-
-=item add C<LICENCE> to the list of special files (not only LICENSE)
-
-=item collect the license information of each file using
-L<Software::LicenseUtils>
-
-=item add L<has_separate_license_file|Module::CPANTS::Kwalitee::License> metric
-
-=item add L<has_license_in_source_file|Module::CPANTS::Kwalitee::License> metric
-
-=back
-
-=head2 0.79 Tue Apr  8 01:25:12 CEST 2008
-
-released at the Oslo QA Hackathon 2008
-
-L<Gábor Szabó|https://metacpan.org/author/szabgab>:
-
-=over
-
-=item replace L<File::Find> by L<File::Find::Rule>
-
-=item add L<no_large_files|Module::CPANTS::Kwalitee::Files> metrics
-
-=item add L<fits_fedora_license|Module::CPANTS::Kwalitee::License> metric that
-was inside the
-L<easily_repackageable_by_fedora|Module::CPANTS::Kwalitee::Repackageable> metric
-
-=item add C<is_experimental> flag to some of the metrics
-
-=item add aggregating key to metric to list the other metrics being aggregated
-
-=item unhide some errors during testing
-
-=item renamed some error fields
-
-=item add L<metayml_declares_perl_version|Module::CPANTS::Kwalitee::MetaYML>
-metric
-
-=back
-
-=head2 0.78 2008-04-06
-
-released at the Oslo QA Hackathon 2008
-
-=over
-
-=item very hacky workaround for problems with F<Meta.YML>, version objects, etc
-
-=item moved C<has_version_in_each_file> into
-L<Module::CPANTS::Kwalitee::Version> & fixed a bug in it
-
-=back
-
-L<Gábor Szabó|https://metacpan.org/author/szabgab>:
-
-=over
-
-=item add L<fits_fedora_license|Module::CPANTS::Kwalitee::License> metric that
-was inside the
-L<easily_repackageable_by_fedora|Module::CPANTS::Kwalitee::Repackageable> metric
-
-=item add C<is_experimental> and C<is_aggregate> flags to some of the metrics
-
-=item unhide some errors during testing
-
-=item add L<no_generated_files|Module::CPANTS::Kwalitee::Files> metric
-
-=item add
-L<easily_repackageable_by_fedora|Module::CPANTS::Kwalitee::Repackageable>,
-L<easily_repackagable_by_debian|Module::CPANTS::Kwalitee::Repackageable>
-and L<easily_repackageable|Module::CPANTS::Kwalitee::Repackageable> metric
-
-=item add L<has_version_in_each_file|Module::CPANTS::Kwalitee::Files> metric
-
-=item add L<has_tests_in_t_dir|Module::CPANTS::Kwalitee::Files> metric
-
-=item add L<no_stdin_for_prompting|Module::CPANTS::Kwalitee::Files> metric
-checking for STDIN in F<Makefile.PL> and F<Build.PL>
-
-=back
-
-=head2 0.77 2008-01-29
-
-=over
-
-=item made L<prereq_matches_use|Module::CPANTS::Kwalitee::Prereq> and
-L<build_prereq_matches_use|Module::CPANTS::Kwalitee::Prereq> optional metrics
-
-=item changed data structure: all errors are now in a hashref called C<error>
-
-=back
-
-=head2 0.76 2007-11-14
-
-=over
-
-=item added new metrics L<prereq_matches_use|Module::CPANTS::Kwalitee::Prereq>
-and L<build_prereq_matches_use|Module::CPANTS::Kwalitee::Prereq>
-
-=item added C<needs_db> to metrics and removed hardcoded workaround for
-L<is_prereq|Module::CPANTS::Kwalitee::Prereq>
-
-=item removed workaround in L<Module::CPANTS::Kwalitee::MetaYML>
-(L<Barbie|https://metacpan.org/author/barbie> fixed it the problem in
-L<Test::YAML::Meta>)
-
-=item reworded L<metayml_is_parsable|Module::CPANTS::Kwalitee::MetaYML> remedy
-
-=back
-
-=head2 0.75 2007-10-29
-
-=over
-
-=item added optional metric L<use_warnings|Module::CPANTS::Kwalitee::Uses>
-
-=item added directory F<xt> as a potential location for test files
-
-=item finally applied patch provided by
-L<Adriano Ferreira|https://metacpan.org/author/ferreira> to fix some issues in
-L<Module::CPANTS::Kwalitee::Manifest>. See
-L<RT #28982|https://rt.cpan.org/Ticket/Display.html?id=28982>
-
-=back
-
-=head2 0.74 2007-10-24
-
-=over
-
-=item removed metric C<metayml_conforms_spec_1_0>
-
-=item fixed bug in L<Module::CPANTS::Kwalitee::MetaYML/check_spec_conformance>,
-which caused wrong results in
-L<metayml_conforms_spec*|Module::CPANTS::Kwalitee::MetaYML>
-
-=item switched to L<YAML::Syck>
-
-=item work around L<Pod::Simple::Checker> returning strange data
-
-=back
-
-=head2 0.73 2007-09-12
-
-=over
-
-=item added version of dist to dump file name
-
-=item fixed bug in L<Module::CPANTS::Kwalitee::NeedsCompiler>
-(L<RT #28134|https://rt.cpan.org/Ticket/Display.html?id=28134> plus all reported
-merged into that one)
-
-=back
-
-=head2 0.72 2007-06-30
-
-=over
-
-=item added docs to F<cpants_lint.pl>
-
-=item F<cpants_lint.pl> can now dump metadata to a file
-
-=item added L<YAML> output to F<cpants_lint.pl>
-
-=back
-
-L<Gábor Szabó|https://metacpan.org/author/szabgab>:
-
-=over
-
-=item added L<Module::CPANTS::Kwalitee::NeedsCompiler>
-
-MCK::NeedsCompiler does not contain any C<kwalitee_indicator>, but adds much
-needed metadata.
-
-=back
-
-L<Barbie|https://metacpan.org/author/barbie>:
-
-=over
-
-=item L<Module::CPANTS::Analyse> assumes Unix paths after munging with
-L<File::Spec>, thus breaking portability at every turn in a non-Unix-like
-environment… bad Thomas no biscuit!
-
-=item Refined F<META.yml> metrics using L<Test::YAML::Meta> and brought
-I<current spec> up to date with
-L<version 1.3|http://module-build.sourceforge.net/META-spec-v1.3.html> :)
-
-=back
-
-=head2 0.71 2007-04-23
-
-=over
-
-=item moved svn repo to L<http://code.google.com/p/cpants/>
-
-=item L<has_license|Module::CPANTS::Kwalitee::License> now also checks for
-F<LICENCE> (as suggested by
-L<David Cantrell|https://metacpan.org/author/dcantrell>)
-
-=item fixed L<RT #26535|https://rt.cpan.org/Ticket/Display.html?id=26535>
-reported by L<MTHURN|https://metacpan.org/author/mthurn>
-
-=item L<has_example|Module::CPANTS::Kwalitee::Files> now also checks for
-C<p(m|od)> files (as suggested by L<JUERD|https://metacpan.org/author/juerd>)
-
-=item fixed L<RT #24228|https://rt.cpan.org/Ticket/Display.html?id=24228>
-reported by L<THALJEF|https://metacpan.org/author/thaljef> - F<t/99_critic.t>
-now only runs if C<$ENV{AUTHOR_TEST}> is set
-
-=item resolved L<RT #25198|https://rt.cpan.org/Ticket/Display.html?id=25198>
-reported by L<bdfoy|https://metacpan.org/author/bdfoy> using his patch
-
-=item L<Module::CPANTS::Kwalitee::FindModules>: do not check F<META.yml> for
-C<provides> because F<META.yml> might list semi-garbage (eg according to
-F<META.yml>, L<Siesta> provides L<Apache::Constants>, which it does not.)
-
-=item skip very large test-files and only check F<*.t> files (not everything in
-F<t/>) as suggested by L<CASIANO|https://metacpan.org/author/casiano>
-
-=item F<cpants_lint.pl>:
-
-switched from L<Getopt::Std> to L<Getopt::Long>
-
-added C<--no_capture> option for easier debugging
-
-added C<--verbose> options
-
-=item hopefully fixed
-L<RT #25207|https://rt.cpan.org/Ticket/Display.html?id=25207> (test failures on
-Win32) reported (and patched…) by
-L<HEMINGWAY|https://metacpan.org/author/hemingway>. This should also solve
-L<RT #26535|https://rt.cpan.org/Ticket/Display.html?id=26535> reported by
-L<Martin Thurn|https://metacpan.org/author/mthurn>
-
-=item applied doc patch submitted by
-L<MSTEVENS|https://metacpan.org/author/mstevens> as
-L<RT #26379|https://rt.cpan.org/Ticket/Display.html?id=26379>
-
-=back
-
-=head2 0.69 2006-11-04
-
-=over
-
-=item split up C<metayml_conforms_spec> to
-L<metayml_conforms_spec_1_0|Module::CPANTS::Kwalitee::MetaYML> and
-C<metayml_conforms_spec_1_2> (which is optional)
-
-=item added C<metayml_error> and docu pointers to it.
-
-=back
-
-=head2 0.68 2006-10-28
-
-=over
-
-=item fixed bug in L<Module::CPANTS::Kwalitee::FindModules> reported by
-L<JDHEDDEN|https://metacpan.org/author/jdhedden> in
-L<RT #22081|https://rt.cpan.org/Ticket/Display.html?id=22081> (the module name
-of modules living in the top-level namespace (eg 'threads.pm') was not guessed
-correctly
-
-=item use F<META.yml> C<provides> (if it exists) instead of guessing module
-names in L<Module::CPANTS::Kwalitee::FindModules>
-
-=item modifed changelog-regex in L<Module::CPANTS::Kwalitee::Files> as suggested
-by L<CDOLAN|https://metacpan.org/author/cdolan> in
-L<RT #21999|https://rt.cpan.org/Ticket/Display.html?id=21999>
-
-=item added L<Module::CPANTS::Kwalitee::License>
-
-=item moved license checking to L<Module::CPANTS::Kwalitee::License>
-
-=item added checks for F<LICENSE> file and C<LICENSE> POD section
-
-=item moved C<meta_yml> parsing to L<Module::CPANTS::Kwalitee::MetaYML>
-
-=item changed C<has_license|Module::CPANTS::Kwalitee::License> error text after
-L<Schwern|https://metacpan.org/author/mschwern> (and
-L<Andreas Koenig|https://metacpan.org/author/andk>) suggested that
-L<ExtUtils::MakeMaker> now supports a C<license> field
-
-=back
-
-=head2 0.67 2006-09-13
-
-=over
-
-=item F<cpants_lint.pl> now handles reporting of optional metrics better.
-
-=item added F<t/99_critic.t>
-(L<Gábor Szabó|https://metacpan.org/author/szabgab>)
-
-=item some code cleanups as reported by L<Test::Perl::Critic>
-(L<Gábor Szabó|https://metacpan.org/author/szabgab>)
-
-=item new metric: C<has_license|Module::CPANTS::Kwalitee::License>;
-L<Module::CPANTS::Kwalitee::MetaYML>
-(L<Gábor Szabó|https://metacpan.org/author/szabgab>)
-
-=item L<Module::CPANTS::Kwalitee::Pod> now reports the error messages returned
-by L<Pod::Simple::Checker>
-(suggested by L<Gábor Szabó|https://metacpan.org/author/szabgab>)
-
-=back
-
-=head2 0.66 2006-09-06
-
-=over
-
-=item added L<Module::CPANTS::Kwalitee/optional_indicator_names utility> method
-
-=back
-
-=head2 0.65 2006-09-05 (YAPC::Europe hackathon release)
-
-=over
-
-=item updated test suite
-
-=item added C<has_example> to L<Module::CPANTS::Kwalitee::Files>
-
-=item added C<buildtool_not_executable> to L<Module::CPANTS::Kwalitee::Files>
-
-=item added L<Module::CPANTS::Kwalitee::Manifest> (C<manifest_matches_dist>)
-
-=back
-
-=head2 0.64 2006-08-29
-
-=over
-
-=item updated L<Module::CPANTS::Kwalitee::BrokenInstaller>
-
-submitted by L<Steffen Müller|https://metacpan.org/author/smueller>
-
-=back
-
-=head2 0.63 2006-07-31
-
-=over
-
-=item we now also find F<README.txt>
-
-resolves L<RT #20633|https://rt.cpan.org/Ticket/Display.html?id=20633> reported
-by L<MBARBON|https://metacpan.org/author/mbarbon> (thanks for the patch!)
-
-=back
-
-=head2 0.62 2006-07-20
-
-=over
-
-=item added L<Module::CPANTS::Kwalitee::BrokenInstaller>
-
-submitted by L<Steffen Müller|https://metacpan.org/author/smueller>
-
-=back
-
-=head2 0.61 2006-07-17
-
-=over
-
-=item Kwalitee metrics can now be marked as C<is_extra>
-
-Such metrics do not count for available kwalitee
-
-=item marked L<is_prereq|Module::CPANTS::Kwalitee::Prereq> as C<is_extra>
-
-=item F<cpants_lint> now reports percentages additional to absolute values
-
-=item F<cpants_lint> won't list failed C<is_extra> metrics
-
-=item added some method caching to L<Module::CPANTS::Kwalitee>
-
-=item added Ctotal_kwalitee> to L<Module::CPANTS::Kwalitee>.
-
-=back
-
-=head2 0.60 2006-05-18
-
-=over
-
-=item activated L<is_prereq|Module::CPANTS::Kwalitee::Prereq> metric
-
-=item added helper method (C<available_kwalitee>)
-
-=item L<Module::CPANTS::Kwalitee::FindModules>: skip stuff in F<inc>
-(L<Module::Install>)
-
-=back
-
-=head2 0.52 2006-03-12
-
-=over
-
-=item added some dependencies to F<Build.PL>/F<META.yml> (thanks to
-L<Achim Grolms|https://metacpan.org/author/agrolms> and
-L<BLBLACK|https://metacpan.org/author/blblack>
-(L<RT #17977|https://rt.cpan.org/Ticket/Display.html?id=17977>))
-
-=item enhanced output of F<cpants_lint.pl> (list failed tests)
-
-=item L<Module::CPANTS::Kwalitee::FindModules>: die if we cannot find a
-namespace
-
-=item L<Module::CPANTS::Kwalitee::FindModules>: remove stuff that doesn't seem
-to be namespace (eg lowercase) from module names
-
-=item changed the name of some fields to work with the (upcoming) DB
-
-=item added some tests
-
-=back
-
-=head2 0.51 2006-02-16
-
-=over
-
-=item adapted L<Module::CPANTS::Kwalitee::Prereq> to work with newer versions
-of L<YAML> (reported by L<Andreas Koenig|https://metacpan.org/author/andk> as
-L<RT #17670|https://rt.cpan.org/Ticket/Display.html?id=17670>)
-
-=back
-
-=head2 0.50 2006-01-26
-
-=over
-
-=item first release to CPAN
-
-=back
-
-=head2 0.01
-
-=over
-
-=item started rewrite
-
-=back
+Revision history for Module-CPANTS-Analyse
+
+0.96 2014-11-24
+  - Added an import option to load extra Kwalitee plugins.
+  - Fixed RT#100512 - has_readme now accepts README.pod as well
+  - Improved no_abstract_stub_in_pod to detect "The great new"
+    as a boilerplate
+  - Switched to File::Find::Object
+
+0.95 2014-09-26
+  - Switched to Test::FailWarnings to make CPAN testers happier
+
+0.94 2014-09-26
+  - Fixed RT#99141 - use_strict metric does not recognize
+    `use v5.14` syntax (ishigaki)
+
+0.93_04 2014-09-05
+  - Accept COPYING as a license file
+  - Take included module (under inc/) into consideration while
+    analyzing prereq_matches_use
+  - Changed most of the META.yml metrics to pass if META.yml doesn't
+    exist
+
+0.93_03 2014-08-13
+  - Added meta_json_is_parsable and meta_json_conforms_to_known_spec
+  - Added meta_yml_has_repository_resource
+  - Renamed metayml_ metrics to meta_yml_
+  - Fixed abstract encoding issues
+  - Refactored tests
+  - Fixed not to ignore directory symlinks
+  - Fixed RT#97858 - wrong no_symlinks test in files not in MANIFEST
+    (for a local distribution; CPANTS site doesn't ignore symlinks
+    not listed in MANIFEST)
+  - Fixed RT#97601 - Test::Kwalitee incorrectly reports non-use of
+    strict in Inline::CPP
+
+0.93_02 2014-06-30
+  - Removed cpants_lint.pl in favor of App::CPANTS::Lint
+  - Fixed RT#94468 - "use_strict" metric doesn't like .pod files
+    that contain no perl (ishigaki)
+  - Fixed RT#96492 - 0.93_01 test failures on OSX (ether)
+
+0.93_01 2014-05-27
+  - Added the following metrics:
+    - has_known_license_in_source_file
+    - has_abstract_in_pod
+    - no_abstract_stub_in_pod
+  - Removed metayml_conforms_spec_current metric.
+  - Supported x_cpants custom META field to tell analyzer to ignore
+    some of the metrics (only) when calculating a kwalitee score.
+  - Refactored several Kwalitee files, and internal stash layout has
+    changed rather significantly. You might need to modify your
+    tools if they happen to depend on the stash directly.
+
+0.92 2013-09-22
+  - Fixed a case when more than one license sections come in row
+    (spotted by ysasaki++) (ishigaki)
+  - stopped checking auto_features (ishigaki)
+
+0.91 2013-09-05
+  - Fixed RT#69233 - doesn't detect use >= 5.012 as use strict
+    (ishigaki)
+  - Fixed RT#83336 - Fails to detect strict via `use MooseX::Types`
+    (ether)
+  - Fixed RT#83851 - 'use v5.16' and greater not deemed "strict"
+    (ishigaki)
+  - Fixed RT#86504 - fix sort order of Kwalitee generators (ether)
+  - Fixed RT#87155 - more Module::Install tests needed (1.04 is
+    broken) (ishigaki)
+  - Fixed RT#87597 - proper_libs is a dubious test (ishigaki)
+  - Fixed RT#87598 - Can't use an undefined value as an ARRAY
+    reference at .../FindModules.pm line 115. (ishigaki)
+  - Fixed RT#87988 - Fix use of $Test::Kwalitee::VERSION (ether)
+  - Fixed RT#88216 - extracts_nicely metric fails for -TRIAL
+    releases (ishigaki)
+  - Fixed RT#88365 - YAML/JSON tests are not failing when improperly
+    encoded characters are seen (ishigaki)
+  - Moose::Exporter also provides strict and warnings (doy)
+
+0.90_02 2013-08-03
+  - Fixed rt#87535 - incorrect version specification in 0.90_01
+    (ether)
+  - Fixed rt#87534 - Test failure in 0.90_01 (ether)
+  - Fixed rt#87561 - t/11_hash_random.t fails due to undeclared test
+    dependency (wyant)
+
+0.90_01 2013-08-01
+  - Applied all the changes in 0.88 again, and removed a few
+    non-portable metrics for Test::Kwalitee.
+
+0.89 2013-08-01
+  - Tentatively reverted all the changes in 0.88
+
+0.88 2013-08-01
+  - add metric "no_dot_underscore_files" (daxim, charsbar)
+  - remove metrics "distributed_by_debian",
+    "latest_version_distributed_by_debian",
+    "has_no_bugs_reported_in_debian", "has_no_patches_in_debian",
+    "no_cpants_errors", "uses_test_nowarnings", "has_test_pod",
+    "has_test_pod_coverage", "has_examples" (charsbar)
+  - add metric "portable_filenames" (charsbar)
+  - numerous fixes for a smoother operation of www-cpants (charsbar)
+
+0.87 2013-02-12
+  - fix rt#80225 - Test failures due to
+    Test::CPAN::Meta::YAML::Version interface change (wyant)
+  - fix rt#82939 - Hash-Randomization causes 10_analyse.t to fail
+    (kentnl, chorny)
+  - fix rt#44796 - Module::CPANTS::Kwalitee::Manifest broken for
+    MANIFESTs containing files with spaces (rivy)
+
+0.86 2012-04-11
+  - add several strict and warnings equivalents & make it easy to
+    add more
+  - fix when Moose is used and strict is not used
+  - add info about "MIN_PERL_VERSION"
+  - better remedy for metayml_declares_perl_version
+  - metayml_declares_perl_version moved from experimental to extra
+    some pod improvements (jquelin)
+  - fix rt#65903 - no more "Test::YAML::Meta::Version" on CPAN
+    (jquelin)
+  - replace YAML::Syck with YAML::Any (jquelin)
+  - no_symlinks checks only files in MANIFEST, use "maniread" in
+    ExtUtils::Manifest (rurban)
+  - add more equivalents for use_strict and use_warnings tests
+    (doherty)
+  - implement valid_signature metric (daxim)
+
+0.85 2009-07-12, Alexandr Ciornii
+  - fix fails on non-Win32
+
+0.84 2009-07-08, Alexandr Ciornii
+  - require Test::Warn 0.11
+  - add Test::More to deps
+  - add LWP::Simple to deps
+  - fix calc_test_yaml_meta.t
+  - better META.yml
+  - list of changes for 0.83 (domm)
+
+0.83 2009-06-10
+  - ignore "no_index" when searching for examples (xdaveg)
+  - skip the debian metrics and downloading the debian file when in
+    LINT (szabgab)
+  - has_test_pod and has_test_pod_coverage are now optional metrics
+    (domm)
+
+0.82 2008-07-08 10:23:30
+  - update META.yml spec to 1.4
+    <http://module-build.sourceforge.net/META-spec-v1.4.html>
+  - fixed experimental metrics
+  - use Moose now counts for using strict
+  - lots of commits from Gábor
+  - honor META.yml key "no_index".
+  - Fixes RT#32777 and an IRC complaint by BinGOs
+
+0.81 Sun Apr 13 16:45:29 CEST 2008
+  - fixed doc bug in SYNOPSIS (reported by ADAMOWSKI as RT#34773)
+  - made Module::CPANTS::Kwalitee::FindModules smarter (domm):
+    If available, use META.yml "provides". If not, look for
+    "package" statements in files. It now also finds stuff like
+    Tk::Widget and App::Ack upgrade to Software::License 0.003
+    (Gábor)
+
+0.80 Sat Apr 12 10:53:40 CEST 2008
+  domm:
+  - add metayml_has_provides metric
+
+  Gábor Szabó:
+  - simplify the way the VERSION number is looked up, keep the full
+    version line
+  - increase the no_large_files limit to 200_000
+  - some unit test fixes thanks to Tux
+  - some of {error} fields are now ARRAY refs instead of strings
+  - more detailed unit tests
+  - add "LICENCE" to the list of special files (not only LICENSE)
+  - collect the license information of each file using
+    Software::LicenseUtils
+  - add has_separate_license_file metric
+  - add has_license_in_source_file metric
+
+0.79 Tue Apr  8 01:25:12 CEST 2008
+  - released at the Oslo QA Hackathon 2008
+
+  Gábor Szabó:
+  - replace File::Find by File::Find::Rule
+  - add no_large_files metrics
+  - add fits_fedora_license metric that was inside the
+  - easily_repackageable_by_fedora metric
+  - add "is_experimental" flag to some of the metrics
+  - add aggregating key to metric to list the other metrics being
+    aggregated
+  - unhide some errors during testing
+  - renamed some error fields
+  - add metayml_declares_perl_version metric
+
+0.78 2008-04-06
+  - released at the Oslo QA Hackathon 2008
+  - very hacky workaround for problems with Meta.YML, version
+    objects, etc
+  - moved "has_version_in_each_file" into
+  - Module::CPANTS::Kwalitee::Version & fixed a bug in it
+
+  Gábor Szabó:
+  - add fits_fedora_license metric that was inside the
+  - easily_repackageable_by_fedora metric
+  - add "is_experimental" and "is_aggregate" flags to some of the
+    metrics
+  - unhide some errors during testing
+  - add no_generated_files metric
+  - add easily_repackageable_by_fedora,
+  - easily_repackagable_by_debian and easily_repackageable metric
+  - add has_version_in_each_file metric
+  - add has_tests_in_t_dir metric
+  - add no_stdin_for_prompting metric checking for STDIN in
+    Makefile.PL and Build.PL
+
+0.77 2008-01-29
+  - made prereq_matches_use and build_prereq_matches_use optional
+    metrics
+  - changed data structure: all errors are now in a hashref called
+    "error"
+
+0.76 2007-11-14
+  - added new metrics prereq_matches_use and
+    build_prereq_matches_use
+  - added "needs_db" to metrics and removed hardcoded workaround for
+    is_prereq
+  - removed workaround in Module::CPANTS::Kwalitee::MetaYML (Barbie
+    fixed it the problem in Test::YAML::Meta)
+  - reworded metayml_is_parsable remedy
+
+0.75 2007-10-29
+  - added optional metric use_warnings
+  - added directory xt as a potential location for test files
+  - finally applied patch provided by Adriano Ferreira
+    to fix some issues in Module::CPANTS::Kwalitee::Manifest.
+    See RT #28982
+
+0.74 2007-10-24
+  - removed metric "metayml_conforms_spec_1_0"
+  - fixed bug in "check_spec_conformance" in
+    Module::CPANTS::Kwalitee::MetaYML, which caused wrong results in
+    metayml_conforms_spec*
+  - switched to YAML::Syck
+  - work around Pod::Simple::Checker returning strange data
+
+0.73 2007-09-12
+  - added version of dist to dump file name
+  - fixed bug in Module::CPANTS::Kwalitee::NeedsCompiler (RT #28134
+    plus all reported merged into that one)
+
+0.72 2007-06-30
+  - added docs to cpants_lint.pl
+  - cpants_lint.pl can now dump metadata to a file
+  - added YAML output to cpants_lint.pl
+
+  Gábor Szabó:
+  - added Module::CPANTS::Kwalitee::NeedsCompiler
+        MCK::NeedsCompiler does not contain any
+        "kwalitee_indicator", but adds much needed metadata.
+
+  Barbie:
+  - Module::CPANTS::Analyse assumes Unix paths after munging with
+    File::Spec, thus breaking portability at every turn in a
+    non-Unix-like environment… bad Thomas no biscuit!
+    Refined META.yml metrics using Test::YAML::Meta and brought
+    *current spec* up to date with version 1.3
+    <http://module-build.sourceforge.net/META-spec-v1.3.html> :)
+
+0.71 2007-04-23
+  - moved svn repo to <http://code.google.com/p/cpants/>
+  - has_license now also checks for LICENCE (as suggested by David
+    Cantrell)
+  - fixed RT #26535 reported by MTHURN
+  - has_example now also checks for "p(m|od)" files (as suggested by
+    JUERD)
+  - fixed RT #24228 reported by THALJEF - t/99_critic.t
+    now only runs if $ENV{AUTHOR_TEST} is set
+  - resolved RT #25198 reported by bdfoy using his patch
+    Module::CPANTS::Kwalitee::FindModules: do not check META.yml for
+    "provides" because META.yml might list semi-garbage (eg
+    according to META.yml, Siesta provides Apache::Constants, which
+    it does not.)
+  - skip very large test-files and only check *.t files (not
+    everything in t/) as suggested by CASIANO
+  - cpants_lint.pl:
+    - switched from Getopt::Std to Getopt::Long
+    - added "--no_capture" option for easier debugging
+    - added "--verbose" options
+
+  - hopefully fixed RT #25207 (test failures on Win32) reported
+    (and patched…) by HEMINGWAY. This should also solve
+    RT #26535 reported by Martin Thurn
+  - applied doc patch submitted by MSTEVENS as RT #26379
+
+0.69 2006-11-04
+  - split up "metayml_conforms_spec" to metayml_conforms_spec_1_0
+    and "metayml_conforms_spec_1_2" (which is optional)
+  - added "metayml_error" and docu pointers to it.
+
+0.68 2006-10-28
+  - fixed bug in Module::CPANTS::Kwalitee::FindModules reported by
+    JDHEDDEN in RT #22081 (the module name of modules living in the
+    top-level namespace (eg 'threads.pm') was not guessed correctly
+    use META.yml "provides" (if it exists) instead of guessing
+    module names in Module::CPANTS::Kwalitee::FindModules
+    modifed changelog-regex in Module::CPANTS::Kwalitee::Files as
+    suggested by CDOLAN in RT #21999
+  - added Module::CPANTS::Kwalitee::License
+  - moved license checking to Module::CPANTS::Kwalitee::License
+  - added checks for LICENSE file and "LICENSE" POD section
+  - moved "meta_yml" parsing to Module::CPANTS::Kwalitee::MetaYML
+  - changed "has_license|Module::CPANTS::Kwalitee::License" error
+    text after Schwern (and Andreas Koenig) suggested
+    that ExtUtils::MakeMaker now supports a "license" field
+
+0.67 2006-09-13
+  - cpants_lint.pl now handles reporting of optional metrics better.
+  - added t/99_critic.t (Gábor Szabó)
+  - some code cleanups as reported by Test::Perl::Critic (Gábor
+    Szabó)
+  - new metric: "has_license|Module::CPANTS::Kwalitee::License";
+  - Module::CPANTS::Kwalitee::MetaYML (Gábor Szabó)
+  - Module::CPANTS::Kwalitee::Pod now reports the error messages
+    returned by Pod::Simple::Checker (suggested by Gábor Szabó)
+
+0.66 2006-09-06
+  - added "optional_indicator_names utility" in
+    Module::CPANTS::Kwalitee method
+
+0.65 2006-09-05 (YAPC::Europe hackathon release)
+  - updated test suite
+  - added "has_example" to Module::CPANTS::Kwalitee::Files
+  - added "buildtool_not_executable" to
+    Module::CPANTS::Kwalitee::Files
+  - added Module::CPANTS::Kwalitee::Manifest
+    ("manifest_matches_dist")
+
+0.64 2006-08-29
+  - updated Module::CPANTS::Kwalitee::BrokenInstaller
+    submitted by Steffen Müller
+
+0.63 2006-07-31
+  - we now also find README.txt
+  - resolves RT #20633 reported by MBARBON (thanks for the patch!)
+
+0.62 2006-07-20
+  - added Module::CPANTS::Kwalitee::BrokenInstaller
+    submitted by Steffen Müller
+
+0.61 2006-07-17
+  - Kwalitee metrics can now be marked as "is_extra"
+    Such metrics do not count for available kwalitee
+
+  - marked is_prereq as "is_extra"
+  - cpants_lint now reports percentages additional to absolute
+    values
+  - cpants_lint won't list failed "is_extra" metrics
+  - added some method caching to Module::CPANTS::Kwalitee
+  - added Ctotal_kwalitee> to Module::CPANTS::Kwalitee.
+
+0.60 2006-05-18
+  - activated is_prereq metric
+  - added helper method ("available_kwalitee")
+  - Module::CPANTS::Kwalitee::FindModules: skip stuff in inc
+    (Module::Install)
+
+0.52 2006-03-12
+  - added some dependencies to Build.PL/META.yml (thanks to Achim
+    Grolms and BLBLACK (RT #17977))
+  - enhanced output of cpants_lint.pl (list failed tests)
+  - Module::CPANTS::Kwalitee::FindModules: die if we cannot find a
+    namespace
+  - Module::CPANTS::Kwalitee::FindModules: remove stuff that doesn't
+    seem to be namespace (eg lowercase) from module names
+  - changed the name of some fields to work with the (upcoming) DB
+    added some tests
+
+0.51 2006-02-16
+  - adapted Module::CPANTS::Kwalitee::Prereq to work with newer
+    versions of YAML (reported by Andreas Koenig as RT #17670)
+
+0.50 2006-01-26
+  - first release to CPAN
+
+0.01
+  - started rewrite
@@ -1,7 +1,6 @@
 AUTHORS
-bin/cpants_lint.pl
-Build.PL
 Changes
+cpanfile
 lib/Module/CPANTS/Analyse.pm
 lib/Module/CPANTS/Kwalitee.pm
 lib/Module/CPANTS/Kwalitee/BrokenInstaller.pm
@@ -23,64 +22,25 @@ lib/Module/CPANTS/Kwalitee/Version.pm
 Makefile.PL
 MANIFEST			This list of files
 MANIFEST.SKIP
-META.json
-META.yml
 README
 t/00_load.t
-t/02_kwalitee.t
-t/03_plugins.t
 t/05_testdir.t
 t/05_testfile.t
-t/10_analyse.t
-t/11_hash_random.pl
-t/11_hash_random.t
-t/analyse_afs.t
-t/analyse_axkit_xsp_l10n.t
-t/analyse_devel_timer.t
-t/analyse_eg_c.t
-t/analyse_html_tiny.t
-t/analyse_test_yaml_meta.t
-t/calc.t
-t/calc_test_yaml_meta.t
-t/eg/Acme-DonMartin-0.06.tar.gz
-t/eg/Acme-DonMartinOther-0.06.tar.gz
-t/eg/AFS-2.4.0.tar.gz
-t/eg/App-perlhl-0.002.tar.gz
-t/eg/App-Wack-0.05.tar.gz
-t/eg/AxKit-XSP-L10N-0.03.tar.gz
-t/eg/Capture-Tiny-0.05.tar.gz
-t/eg/DBIx-SchemaChecksum-0.06.tar.gz
-t/eg/Debian_CPANTS.txt
-t/eg/Devel-Timer-0.02.tar.gz
-t/eg/Eg-C-0.01.tar.gz
-t/eg/HTML-Tiny-0.904.tar.gz
-t/eg/manifest/bad-manifest-0.01.tar.gz
-t/eg/manifest/Good-Dist-0.01.tar.gz
-t/eg/manifest/no-manifest-0.01.tar.gz
-t/eg/modified/DBIx-SchemaChecksum-0.06.tar.gz
-t/eg/not_extractable.gz
-t/eg/Parse-Fedora-Packages-0.02.tar.gz
-t/eg/Pipe-0.03.tar.gz
-t/eg/PPI-HTML-1.07.tar.gz
-t/eg/Set-Object-1.28.tar.gz
-t/eg/Term-Title-0.03.tar.gz
-t/eg/Test-YAML-Meta-0.04.tar.gz
-t/eg/Text-CSV_XS-0.40.tgz
-t/moose_as_strict.t
+t/analyse/manifest.t
+t/analyse/pod.t
+t/lib/Module/CPANTS/TestAnalyse.pm
 t/older_test_kwalitee.t
-t/perl5i_as_strict.t
-t/perl5i_as_warnings.t
-t/plugin_manifest.t
-t/unpack.t
-t/unpack_notextractable.t
+t/x_cpants.t
 TODO
 xt/99_critic.t
 xt/99_pod.t
 xt/99_pod_coverage.t
 xt/kwalitee.t
+xt/kwalitee/has_abstract_in_pod.t
 xt/kwalitee/has_buildtool.t
 xt/kwalitee/has_changelog.t
 xt/kwalitee/has_human_readable_license.t
+xt/kwalitee/has_known_license_in_source_file.t
 xt/kwalitee/has_license_in_source_file.t
 xt/kwalitee/has_manifest.t
 xt/kwalitee/has_meta_yml.t
@@ -89,12 +49,15 @@ xt/kwalitee/has_separate_license_file.t
 xt/kwalitee/has_tests.t
 xt/kwalitee/has_tests_in_t_dir.t
 xt/kwalitee/manifest_matches_dist.t
-xt/kwalitee/metayml_conforms_spec_current.t
-xt/kwalitee/metayml_conforms_to_known_spec.t
-xt/kwalitee/metayml_declares_perl_version.t
-xt/kwalitee/metayml_has_license.t
-xt/kwalitee/metayml_has_provides.t
-xt/kwalitee/metayml_is_parsable.t
+xt/kwalitee/meta_json_conforms_to_known_spec.t
+xt/kwalitee/meta_json_is_parsable.t
+xt/kwalitee/meta_yml_conforms_to_known_spec.t
+xt/kwalitee/meta_yml_declares_perl_version.t
+xt/kwalitee/meta_yml_has_license.t
+xt/kwalitee/meta_yml_has_provides.t
+xt/kwalitee/meta_yml_has_repository_resource.t
+xt/kwalitee/meta_yml_is_parsable.t
+xt/kwalitee/no_abstract_stub_in_pod.t
 xt/kwalitee/no_broken_auto_install.t
 xt/kwalitee/no_broken_module_install.t
 xt/kwalitee/no_stdin_for_prompting.t
@@ -104,3 +67,5 @@ xt/kwalitee/Test.pm
 xt/kwalitee/use_strict.t
 xt/kwalitee/use_warnings.t
 xt/strict_warnings_equiv.t
+META.yml                                 Module YAML meta-data (added by MakeMaker)
+META.json                                Module JSON meta-data (added by MakeMaker)
@@ -1,10 +1,11 @@
 {
    "abstract" : "Generate Kwalitee ratings for a distribution",
    "author" : [
-      "Lars Dɪᴇᴄᴋᴏᴡ <daxim@cpan.org>"
+      "Thomas Klausner <domm@cpan.org>",
+      "Kenichi Ishigaki <ishigaki@cpan.org>"
    ],
-   "dynamic_config" : 1,
-   "generated_by" : "Module::Build version 0.4007, CPAN::Meta::Converter version 2.132620",
+   "dynamic_config" : 0,
+   "generated_by" : "ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.142060",
    "keywords" : [
       "CPANTS",
       "kwalitee"
@@ -17,19 +18,24 @@
       "version" : "2"
    },
    "name" : "Module-CPANTS-Analyse",
+   "no_index" : {
+      "directory" : [
+         "t",
+         "inc"
+      ]
+   },
    "prereqs" : {
       "build" : {
          "requires" : {
             "Cwd" : "0",
-            "Test::Deep" : "0",
-            "Test::More" : "0",
-            "Test::NoWarnings" : "0",
-            "Test::Warn" : "0.11"
+            "ExtUtils::MakeMaker" : "0",
+            "Test::FailWarnings" : "0",
+            "Test::More" : "0.88"
          }
       },
       "configure" : {
          "requires" : {
-            "Module::Build" : "0.4"
+            "ExtUtils::MakeMaker::CPANfile" : "0.06"
          }
       },
       "runtime" : {
@@ -38,108 +44,31 @@
             "Archive::Tar" : "1.48",
             "Array::Diff" : "0.04",
             "CPAN::DistnameInfo" : "0.06",
-            "CPAN::Meta::Validator" : "2.131490",
+            "CPAN::Meta::Validator" : "2.133380",
             "CPAN::Meta::YAML" : "0.008",
             "Class::Accessor" : "0.19",
-            "File::Find::Rule::VCS" : "0",
+            "File::Find::Object" : "v0.2.1",
             "IO::Capture" : "0.05",
-            "Module::ExtractUse" : "0.30",
+            "JSON::MaybeXS" : "0",
+            "Module::ExtractUse" : "0.33",
             "Module::Pluggable" : "2.96",
             "Set::Scalar" : "0",
-            "Software::License" : "0.003",
+            "Software::License" : "0.103008",
+            "Software::License::CC_BY_SA_3_0" : "0",
             "Text::Balanced" : "0",
-            "YAML::Any" : "0",
-            "perl" : "5.006",
             "version" : "0.73"
          }
       }
    },
-   "provides" : {
-      "Module::CPANTS::Analyse" : {
-         "file" : "lib/Module/CPANTS/Analyse.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee" : {
-         "file" : "lib/Module/CPANTS/Kwalitee.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::BrokenInstaller" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/BrokenInstaller.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::CpantsErrors" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/CpantsErrors.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Distname" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Distname.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Distros" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Distros.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Files" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Files.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::FindModules" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/FindModules.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::License" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/License.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Manifest" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Manifest.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::MetaYML" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/MetaYML.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::NeedsCompiler" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/NeedsCompiler.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Pod" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Pod.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Prereq" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Prereq.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Repackageable" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Repackageable.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Signature" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Signature.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Uses" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Uses.pm",
-         "version" : "0.92"
-      },
-      "Module::CPANTS::Kwalitee::Version" : {
-         "file" : "lib/Module/CPANTS/Kwalitee/Version.pm",
-         "version" : "0.92"
-      }
-   },
    "release_status" : "stable",
    "resources" : {
       "bugtracker" : {
          "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=Module-CPANTS-Analyse"
       },
       "homepage" : "http://cpants.cpanauthors.org",
-      "license" : [
-         "http://dev.perl.org/licenses/"
-      ],
       "repository" : {
          "url" : "https://github.com/cpants/Module-CPANTS-Analyse"
       }
    },
-   "version" : "0.92"
+   "version" : "0.96"
 }
@@ -1,101 +1,49 @@
 ---
 abstract: 'Generate Kwalitee ratings for a distribution'
 author:
-  - 'Lars Dɪᴇᴄᴋᴏᴡ <daxim@cpan.org>'
+  - 'Thomas Klausner <domm@cpan.org>'
+  - 'Kenichi Ishigaki <ishigaki@cpan.org>'
 build_requires:
-  Cwd: 0
-  Test::Deep: 0
-  Test::More: 0
-  Test::NoWarnings: 0
-  Test::Warn: 0.11
+  Cwd: '0'
+  ExtUtils::MakeMaker: '0'
+  Test::FailWarnings: '0'
+  Test::More: '0.88'
 configure_requires:
-  Module::Build: 0.4
-dynamic_config: 1
-generated_by: 'Module::Build version 0.4007, CPAN::Meta::Converter version 2.132620'
+  ExtUtils::MakeMaker::CPANfile: '0.06'
+dynamic_config: 0
+generated_by: 'ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.142060'
 keywords:
   - CPANTS
   - kwalitee
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: Module-CPANTS-Analyse
-provides:
-  Module::CPANTS::Analyse:
-    file: lib/Module/CPANTS/Analyse.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee:
-    file: lib/Module/CPANTS/Kwalitee.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::BrokenInstaller:
-    file: lib/Module/CPANTS/Kwalitee/BrokenInstaller.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::CpantsErrors:
-    file: lib/Module/CPANTS/Kwalitee/CpantsErrors.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Distname:
-    file: lib/Module/CPANTS/Kwalitee/Distname.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Distros:
-    file: lib/Module/CPANTS/Kwalitee/Distros.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Files:
-    file: lib/Module/CPANTS/Kwalitee/Files.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::FindModules:
-    file: lib/Module/CPANTS/Kwalitee/FindModules.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::License:
-    file: lib/Module/CPANTS/Kwalitee/License.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Manifest:
-    file: lib/Module/CPANTS/Kwalitee/Manifest.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::MetaYML:
-    file: lib/Module/CPANTS/Kwalitee/MetaYML.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::NeedsCompiler:
-    file: lib/Module/CPANTS/Kwalitee/NeedsCompiler.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Pod:
-    file: lib/Module/CPANTS/Kwalitee/Pod.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Prereq:
-    file: lib/Module/CPANTS/Kwalitee/Prereq.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Repackageable:
-    file: lib/Module/CPANTS/Kwalitee/Repackageable.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Signature:
-    file: lib/Module/CPANTS/Kwalitee/Signature.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Uses:
-    file: lib/Module/CPANTS/Kwalitee/Uses.pm
-    version: 0.92
-  Module::CPANTS::Kwalitee::Version:
-    file: lib/Module/CPANTS/Kwalitee/Version.pm
-    version: 0.92
+no_index:
+  directory:
+    - t
+    - inc
 requires:
-  Archive::Any::Lite: 0.06
-  Archive::Tar: 1.48
-  Array::Diff: 0.04
-  CPAN::DistnameInfo: 0.06
-  CPAN::Meta::Validator: 2.131490
-  CPAN::Meta::YAML: 0.008
-  Class::Accessor: 0.19
-  File::Find::Rule::VCS: 0
-  IO::Capture: 0.05
-  Module::ExtractUse: 0.30
-  Module::Pluggable: 2.96
-  Set::Scalar: 0
-  Software::License: 0.003
-  Text::Balanced: 0
-  YAML::Any: 0
-  perl: 5.006
-  version: 0.73
+  Archive::Any::Lite: '0.06'
+  Archive::Tar: '1.48'
+  Array::Diff: '0.04'
+  CPAN::DistnameInfo: '0.06'
+  CPAN::Meta::Validator: '2.133380'
+  CPAN::Meta::YAML: '0.008'
+  Class::Accessor: '0.19'
+  File::Find::Object: v0.2.1
+  IO::Capture: '0.05'
+  JSON::MaybeXS: '0'
+  Module::ExtractUse: '0.33'
+  Module::Pluggable: '2.96'
+  Set::Scalar: '0'
+  Software::License: '0.103008'
+  Software::License::CC_BY_SA_3_0: '0'
+  Text::Balanced: '0'
+  version: '0.73'
 resources:
   bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Module-CPANTS-Analyse
   homepage: http://cpants.cpanauthors.org
-  license: http://dev.perl.org/licenses/
   repository: https://github.com/cpants/Module-CPANTS-Analyse
-version: 0.92
+version: '0.96'
@@ -1,37 +1,28 @@
-# Note: this file was auto-generated by Module::Build::Compat version 0.4007
-require 5.006;
-use ExtUtils::MakeMaker;
-WriteMakefile
-(
-  'NAME' => 'Module::CPANTS::Analyse',
-  'VERSION_FROM' => 'lib/Module/CPANTS/Analyse.pm',
-  'PREREQ_PM' => {
-                   'Archive::Any::Lite' => '0.06',
-                   'Archive::Tar' => '1.48',
-                   'Array::Diff' => '0.04',
-                   'CPAN::DistnameInfo' => '0.06',
-                   'CPAN::Meta::Validator' => '2.131490',
-                   'CPAN::Meta::YAML' => '0.008',
-                   'Class::Accessor' => '0.19',
-                   'Cwd' => 0,
-                   'File::Find::Rule::VCS' => '0',
-                   'IO::Capture' => '0.05',
-                   'Module::ExtractUse' => '0.30',
-                   'Module::Pluggable' => '2.96',
-                   'Set::Scalar' => 0,
-                   'Software::License' => '0.003',
-                   'Test::Deep' => 0,
-                   'Test::More' => 0,
-                   'Test::NoWarnings' => 0,
-                   'Test::Warn' => '0.11',
-                   'Text::Balanced' => 0,
-                   'YAML::Any' => 0,
-                   'version' => '0.73'
-                 },
-  'INSTALLDIRS' => 'site',
-  'EXE_FILES' => [
-                   'bin/cpants_lint.pl'
-                 ],
-  'PL_FILES' => {}
-)
-;
+use 5.006;
+use strict;
+use warnings;
+use ExtUtils::MakeMaker::CPANfile;
+
+WriteMakefile(
+  NAME => 'Module::CPANTS::Analyse',
+  AUTHOR => [
+    'Thomas Klausner <domm@cpan.org>',
+    'Kenichi Ishigaki <ishigaki@cpan.org>',
+  ],
+  ABSTRACT_FROM => 'lib/Module/CPANTS/Analyse.pm',
+  VERSION_FROM => 'lib/Module/CPANTS/Analyse.pm',
+  LICENSE => 'perl',
+
+  META_MERGE => {
+    resources => {
+      homepage => 'http://cpants.cpanauthors.org',
+      repository => 'https://github.com/cpants/Module-CPANTS-Analyse',
+      bugtracker => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Module-CPANTS-Analyse',
+    },
+    keywords => [
+      'CPANTS','kwalitee',
+    ],
+  },
+
+  test => {TESTS => 't/*.t t/*/*.t'},
+);
@@ -1,6 +1,6 @@
 =encoding UTF-8
 
-Module-CPANTS-Analyse version 0.87 is Copyright © 2012, Perl QA team
+Module-CPANTS-Analyse
 
 =head1 NAME
 
@@ -13,9 +13,12 @@ L<CPANTS project|http://cpants.perl.org>.
 
 =head1 AUTHOR
 
+L<Thomas Klausner|https://metacpan.org/author/domm>,
+C<< <domm@cpan.org> >>
+
 =head2 Distribution maintainer
 
-L<Lars Dɪᴇᴄᴋᴏᴡ|https://metacpan.org/author/daxim>, C<< <daxim@cpan.org> >>
+L<Kenichi Ishigaki|https://metacpan.org/author/ishigaki>, C<< <ishigaki@cpan.org> >>
 
 =head2 Contributors
 
@@ -36,6 +39,11 @@ C<< <smueller@cpan.org> >>
 Some files are Copyright © 2012
 L<Lars Dɪᴇᴄᴋᴏᴡ|https://metacpan.org/author/daxim>, C<< <daxim@cpan.org> >>
 
+Some files are Copyright © 2013-
+L<Kenichi Ishigaki|https://metacpan.org/author/ishigaki>, C<< <ishigaki@cpan.org> >>
+
+Copyright © 2012, Perl QA team
+
 The module distributions in the F<t/eg/> directory are copyright by their
 respective authors.
 
@@ -1,219 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-
-use Module::CPANTS::Analyse;
-use Getopt::Long;
-use IO::Capture::Stdout;
-use Data::Dumper;
-use YAML::Any;
-use File::Spec::Functions;
-use Cwd;
-use Pod::Usage;
-
-my %opts;
-GetOptions(\%opts,qw(help|? man dump no_capture! verbose! yaml to_file dir=s experimental!));
-pod2usage(1) if $opts{help};
-pod2usage(-exitstatus => 0, -verbose => 2) if $opts{man};
-
-my $cwd=getcwd();
-
-my $dist=shift(@ARGV);
-pod2usage(-exitstatus => 0, -verbose => 0) unless $dist;
-die "Cannot find $dist\n" unless -e $dist;
-
-$ENV{CPANTS_LINT} = 1;
-
-my $mca=Module::CPANTS::Analyse->new({
-    dist=>$dist,
-    opts=>\%opts,
-});
-my $output;
-
-my $cannot_unpack=$mca->unpack;
-
-if ($cannot_unpack) {
-    if ($opts{dump}) {
-        $output=Dumper($mca->d);
-    } elsif ($opts{yaml}) {
-        $output=Dump($mca->d);
-    } else {
-        $output="Cannot unpack \t\t".$mca->tarball."\n";
-    }
-} 
-else {
-    $mca->analyse;
-    $mca->calc_kwalitee;
-
-    if ($opts{dump}) {
-        $Data::Dumper::Sortkeys=1;
-        $output=Dumper($mca->d);
-    } elsif ($opts{yaml}) {
-        $output=Dump($mca->d);
-    } else {
-    
-        # build up lists of failed metrics
-        my (@core_failure,@opt_failure,@exp_failure);
-        my ($core_kw,$opt_kw)=(0,0);
-        my $kwl=$mca->d->{kwalitee};
- 
-        my @need_db;
-        foreach my $ind (@{$mca->mck->get_indicators}) {
-            if ($ind->{needs_db}) {
-                push(@need_db,$ind);
-                next;
-            }
-            if ($ind->{is_extra}) {
-                next if $ind->{name} eq 'is_prereq';
-                if ($kwl->{$ind->{name}}) {
-                    $opt_kw++;
-                } else {
-                    push(@opt_failure,"* ".$ind->{name}."\n".$ind->{remedy});
-                }
-            }
-            elsif ($ind->{is_experimental}) {
-                next unless $opts{experimental};
-                if (!$kwl->{$ind->{name}}) {
-                    push(@exp_failure,"* ".$ind->{name}."\n".$ind->{remedy});
-                }
-            }
-            else {
-                if ($kwl->{$ind->{name}}) {
-                    $core_kw++;
-                } else {
-                    push(@core_failure,"* ".$ind->{name}."\n".$ind->{remedy});
-                }
-            }
-        }
-
-        # output results 
-        $output.="Checked dist \t\t".$mca->tarball."\n";
-
-        my $max_core_kw=$mca->mck->available_kwalitee;
-        my $max_kw=$mca->mck->total_kwalitee;
-        my $total_kw=$core_kw+$opt_kw;
-
-        $output.="Kwalitee rating\t\t".sprintf("%.2f",100*$total_kw/$max_core_kw)."% ($total_kw/$max_core_kw)\n";
-        if (@need_db) {
-            $output.="Ignoring metrics\t".join(', ',map {$_->{name} } @need_db);
-        }
-
-        if ($total_kw == $max_kw - @need_db) {
-            $output.="\nCongratulations for building a 'perfect' distribution!\n";
-        } else {
-            if (@core_failure) {
-                $output.="\nHere is a list of failed Kwalitee tests and\nwhat you can do to solve them:\n\n";
-                $output.=join ("\n\n",@core_failure,'');
-            }
-            if (@opt_failure) {
-                $output.="\nFailed optional Kwalitee tests and\nwhat you can do to solve them:\n\n";
-                $output.=join ("\n\n",@opt_failure,'');
-            }
-            if (@exp_failure) {
-                $output.="\nFailed experimental Kwalitee tests and\nwhat you can do to solve them:\n\n";
-                $output.=join ("\n\n",@exp_failure,'');
-            }
-        }
-    }
-}
-
-if ($opts{to_file}) {
-    my $dir=$opts{dir} || $cwd ;
-    my $extension='.txt';
-    $extension='.dmp' if $opts{dump};
-    $extension='.yml' if $opts{yaml};
-    my $outfile=catfile($dir,$mca->d->{vname}.$extension);
-    open (my $fh,'>',$outfile) || die "Cannot write to $outfile: $!";
-    print $fh $output;
-    close $fh;
-
-} else {
-    print $output;
-}
-
-
-__END__
-
-=encoding UTF-8
-
-=head1 NAME
-
-cpants_lint.pl - commandline frontend to Module::CPANTS::Analyse
-
-=head1 SYNOPSIS
-
-    cpants_lint.pl path/to/Foo-Dist-1.42.tgz
-
-    Options:
-        --help              brief help message
-        --man               full documentation
-        --verbose           print more info during run
-        --no_capture        don't turn on capturing of STDERR and STDOUT
-
-        --dump              dump result using Data::Dumper
-        --yaml              dump result as YAML
-
-        --to_file           dump result to a file
-        --dir               directory to dump files to
-
-
-=head1 DESCRIPTION
-
-C<cpants_lint.pl> checks the B<Kwalitee> of CPAN distributions. More exact, it checks how a given tarball will be rated on C<http://cpants.perl.org>, without needing to upload it first.
-
-C<cpants_lint.pl> is also used by C<cpants.perl.org> itself to check all dists on CPAN.
-
-For more information on Kwalitee, and the whole of CPANTS, see C<http://cpants.perl.org> and / or C<Module::CPANTS::Analyse>.
-
-=head1 OPTIONS
-
-If neither C<--dump> nor C<--yaml> are used, a short text describing the 
-Kwalitee of the distribution and hints on how to raise Kwalitee will be 
-displayed. The format of this text can change anytime, so don't use it for any 
-automated processing!
-
-=head3 --help 
-
-Print a brief help message.
-
-=head3 --man
-
-Print manpage.
-
-=head3 --verbose
-
-Print some informative messages during testing of dists.
-
-=head3 --no_capture
-
-Turn off capturing of STDOUT and STDERR. Mostly useful during debugging / development of new features.
-
-If C<--no_capture> is used, the value of C<cpants_error> might be wrong.
-
-=head3 --dump
-
-Dump the result using Data::Dumper
-
-=head3 --yaml
-
-Dump the result as YAML.
-
-=head3 --to_file
-
-Output the result into a file instead of STDOUT.
-
-The name of the file will be F<Foo-Dist.yaml> (well, the extension depends on the dump format and can be C<.yaml>, C<.dump> or C<.txt>)
-
-=head3 --dir
-
-Directory to dump files to. Defaults to the current working directory.
-
-=head1 AUTHOR
-
-L<Thomas Klausner|https://metacpan.org/author/domm>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright © 2003–2006, 2009 L<Thomas Klausner|https://metacpan.org/author/domm>
-
-You may use and distribute this module according to the same terms
-that Perl is distributed under.
@@ -0,0 +1,23 @@
+requires 'Array::Diff' => '0.04';
+requires 'Archive::Any::Lite' => '0.06';
+requires 'Archive::Tar' => '1.48'; #depends on IO::Compress without memory leak
+requires 'Class::Accessor' => '0.19';
+requires 'CPAN::DistnameInfo' => '0.06';
+requires 'CPAN::Meta::YAML' => '0.008';
+requires 'CPAN::Meta::Validator' => '2.133380';
+requires 'File::Find::Object' => '0.2.1';
+requires 'IO::Capture' => '0.05';
+requires 'JSON::MaybeXS' => 0;
+requires 'Module::ExtractUse' => '0.33'; # for no support
+requires 'Module::Pluggable' => '2.96';
+requires 'Set::Scalar' => 0;
+requires 'Software::License' => '0.103008';
+requires 'Software::License::CC_BY_SA_3_0' => 0; # installs whole Software::License::CCpack
+requires 'Text::Balanced' => 0;
+requires 'version' => '0.73';
+
+on test => sub {
+  requires 'Cwd' => 0;
+  requires 'Test::More' => '0.88';
+  requires 'Test::FailWarnings' => 0;
+};
@@ -6,14 +6,15 @@ use base qw(Class::Accessor);
 use File::Temp qw(tempdir);
 use File::Spec::Functions qw(catfile catdir splitpath);
 use File::Copy;
+use File::stat;
 use Archive::Any::Lite;
 use Carp;
-use Module::CPANTS::Kwalitee;
 use IO::Capture::Stdout;
 use IO::Capture::Stderr;
 use CPAN::DistnameInfo;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 # setup logger
 if (! main->can('logger')) {
@@ -22,11 +23,14 @@ if (! main->can('logger')) {
     };
 }
 
-use Module::Pluggable search_path=>['Module::CPANTS::Kwalitee'];
-
 __PACKAGE__->mk_accessors(qw(dist opts tarball distdir d mck capture_stdout capture_stderr));
-__PACKAGE__->mk_accessors(qw(_testdir _dont_cleanup _tarball));
+__PACKAGE__->mk_accessors(qw(_testdir _dont_cleanup _tarball _x_opts));
 
+sub import {
+    my $class = shift;
+    require Module::CPANTS::Kwalitee;
+    Module::CPANTS::Kwalitee->import(@_);
+}
 
 sub new {
     my $class=shift;
@@ -54,37 +58,38 @@ sub new {
     return $me; 
 }
 
+sub run {
+    my $me = shift;
+    $me->unpack unless $me->d->{is_local_distribution};
+    $me->analyse;
+    $me->calc_kwalitee;
+    $me->d;
+}
+
 sub unpack {
     my $me=shift;
     return 'cant find dist' unless $me->dist;
 
     my $di=CPAN::DistnameInfo->new($me->dist);
-    my ($major,$minor);
-    if ($di->version) {
-        ($major,$minor)=$di->version=~/^(\d+)\.(.*)/;
-    }
-    $major=0 unless defined($major);
     my $ext=$di->extension || 'unknown';
     
     $me->d->{package}=$di->filename;
     $me->d->{vname}=$di->distvname;
     $me->d->{extension}=$ext;
     $me->d->{version}=$di->version;
-    $me->d->{version_major}=$major;
-    $me->d->{version_minor}=$minor;
     $me->d->{dist}=$di->dist;
     $me->d->{author}=$di->cpanid;
+    $me->d->{released} = stat($me->dist)->mtime;
+    $me->d->{size_packed}=-s $me->dist;
 
     unless($me->d->{package}) {
         $me->d->{package}=$me->tarball;
     }
 
     copy($me->dist,$me->testfile);
-    $me->d->{size_packed}=-s $me->testfile;
-    
-    my $archive;
+
     eval {
-        $archive=Archive::Any::Lite->new($me->testfile);
+        my $archive=Archive::Any::Lite->new($me->testfile);
         $archive->extract($me->testdir);
     };
 
@@ -94,11 +99,12 @@ sub unpack {
             $me->capture_stderr->stop;
         }
         $me->d->{extractable}=0;
-        $me->d->{error}{cpants}=$error;
+        $me->d->{error}{extractable}=$error;
         $me->d->{kwalitee}{extractable}=0;
         my ($vol,$dir,$name)=splitpath($me->dist);
         $name=~s/\..*$//;
         $name=~s/\-[\d\.]+$//;
+        $name=~s/\-TRIAL[0-9]*//;
         $me->d->{dist}=$name;
         return $error;
     }
@@ -110,13 +116,19 @@ sub unpack {
     my @stuff=grep {/\w/} readdir($fh_testdir);
 
     if (@stuff == 1) {
-        my $vname = $di->distvname;
-        $vname =~ s/\-TRIAL//;
         $me->distdir(catdir($me->testdir,$stuff[0]));
-        $me->d->{extracts_nicely}=1 if $vname eq $stuff[0];
-        
+        if (-d $me->distdir) {
+
+          my $vname = $di->distvname;
+          $vname =~ s/\-TRIAL[0-9]*//;
+
+          $me->d->{extracts_nicely}=1 if $vname eq $stuff[0];
+        } else {
+          $me->distdir($me->testdir);
+          $me->d->{extracts_nicely}=0;
+        }
     } else {
-        $me->distdir(catdir($me->testdir));
+        $me->distdir($me->testdir);
         $me->d->{extracts_nicely}=0;
     }
     return;
@@ -136,15 +148,21 @@ sub calc_kwalitee {
 
     my $kwalitee=0;
     $me->d->{kwalitee}={};
-    foreach my $mod (@{$me->mck->generators}) {
-        foreach my $i (@{$mod->kwalitee_indicators}) {
-            next if $i->{needs_db};
-            main::logger($i->{name});
-            my $rv=$i->{code}($me->d, $i);
-            $me->d->{kwalitee}{$i->{name}}=$rv;
-            $kwalitee+=$rv;
+    my %x_ignore = %{$me->x_opts->{ignore} || {}};
+    foreach my $i ($me->mck->get_indicators) {
+        next if $i->{needs_db};
+        main::logger($i->{name});
+        my $rv=$i->{code}($me->d, $i);
+        $me->d->{kwalitee}{$i->{name}}=$rv;
+        if ($x_ignore{$i->{name}} && $i->{ignorable}) {
+            $me->d->{kwalitee}{$i->{name}} = 1;
+            if ($me->d->{error}{$i->{name}}) {
+                $me->d->{error}{$i->{name}} .= ' [ignored]';
+            }
         }
+        $kwalitee+=$rv;
     }
+
     $me->d->{'kwalitee'}{'kwalitee'}=$kwalitee;
     main::logger("done");
 }
@@ -175,7 +193,22 @@ sub tarball {
     return $me->_tarball($tb);
 }
 
-
+sub x_opts {
+    my $me = shift;
+    return $me->_x_opts if $me->_x_opts;
+    my %opts;
+    if (my $x_cpants = $me->d->{meta_yml}{x_cpants}) {
+        if (my $ignore = $x_cpants->{ignore}) {
+            if (ref $ignore eq ref {}) {
+                $opts{ignore} = $ignore;
+            }
+            else {
+                $me->d->{error}{x_cpants} = "x_cpants ignore should be a hash reference (key: metric, value: reason to ignore)";
+            }
+        }
+    }
+    $me->_x_opts(\%opts);
+}
 
 q{Favourite record of the moment:
   Jahcoozi: Pure Breed Mongrel};
@@ -195,9 +228,7 @@ Module::CPANTS::Analyse - Generate Kwalitee ratings for a distribution
     my $analyser=Module::CPANTS::Analyse->new({
         dist=>'path/to/Foo-Bar-1.42.tgz',
     });
-    $analyser->unpack;
-    $analyser->analyse;
-    $analyser->calc_kwalitee;
+    $analyser->run;
     # results are in $analyser->d;
 
 =head1 DESCRIPTION
@@ -224,6 +255,10 @@ Run all analysers (defined in C<Module::CPANTS::Kwalitee::*> on the dist.
 
 Check if the dist conforms to the Kwalitee indicators. 
 
+=head3 run
+
+Unpacks, analyses, and calculates kwalitee, and returns a resulting stash.
+
 =head2 Helper Methods
 
 =head3 testdir
@@ -238,13 +273,13 @@ Returns the location of the unextracted tarball.
 
 Returns the filename of the tarball.
 
-=head3 read_meta_yml
+=head3 x_opts
 
-Reads the META.yml file and returns its content.
+Returns a hash reference that holds normalized information set in the "x_cpants" custom META field.
 
 =head1 WEBSITE
 
-L<http://cpants.perl.org/>
+L<http://cpants.cpanauthors.org/>
 
 =head1 BUGS
 
@@ -1,11 +1,10 @@
 package Module::CPANTS::Kwalitee::BrokenInstaller;
 use warnings;
 use strict;
-use File::Find;
-use File::Spec::Functions qw(catdir catfile abs2rel);
-use File::stat;
+use File::Spec::Functions qw(catfile);
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 100 }
 
@@ -18,22 +17,19 @@ sub analyse {
     my $mi = catfile($distdir, 'inc', 'Module', 'Install.pm');
     
     # Must be okay if not using Module::Install
-    if (not -f $mi) {
-        $me->d->{broken_module_install} = 0;
-        return;
-    }
-    
+    return if not -f $mi;
+
     open my $ih, '<', $mi
       or die "Could not open file '$mi' for checking the bad_installer metric: $!";
     my $buf;
     read $ih, $buf, 100000 or die $!;
     close $ih;
     if ($buf =~ /VERSION\s*=\s*("|'|)(\d+|\d*\.\d+(?:_\d+)?)\1/m) {
-        $me->d->{module_install_version} = my $version = $2;
+        $me->d->{module_install}{version} = my $version = $2;
         my $non_devel = $version;
         $non_devel =~ s/_\d+$//;
         if ($non_devel < 0.61 or $non_devel == 1.04) {
-            $me->d->{broken_module_install} = $version;
+            $me->d->{module_install}{broken} = 1;
         }
         if ($non_devel < 0.89) {
             my $makefilepl = catfile($distdir, 'Makefile.PL');
@@ -48,19 +44,19 @@ sub analyse {
             return if not defined $mftext;
 
             if ($mftext =~ /auto_install/) {
-                $me->d->{broken_auto_install} = 1;
+                $me->d->{module_install}{broken_auto_install} = 1;
             } else {
                 return;
             }
             
             if ($non_devel < 0.64) {
-                $me->d->{broken_module_install} = $version;
+                $me->d->{module_install}{broken} = 1;
             }
         }
     }
     else {
         # Unknown version (parsing $VERSION failed)
-        $me->d->{broken_module_install} = 1;
+        $me->d->{module_install}{broken} = 1;
     }
 
     
@@ -75,19 +71,25 @@ sub kwalitee_indicators {
         error=>q{This distribution uses an obsolete version of Module::Install. Versions of Module::Install prior to 0.61 might not work on some systems at all. Additionally if your Makefile.PL uses the 'auto_install()' feature, you need at least version 0.64. Also, 1.04 is known to be broken.},
         remedy=>q{Upgrade the bundled version of Module::Install to the most current release. Alternatively, you can switch to another build system / installer that does not suffer from this problem. (ExtUtils::MakeMaker, Module::Build both of which have their own set of problems.)},
         code=>sub {
-            shift->{broken_module_install} ? 0 : 1 },
+            my $d = shift;
+            return 1 unless exists $d->{module_install};
+            $d->{module_install}{broken} ? 0 : 1;
+        },
         details=> sub {
-            q{This distribution uses obsolete Module::Install version }.(shift->{module_install_version});
+            q{This distribution uses obsolete Module::Install version }.(shift->{module_install}{version});
         },
     },
     {
         name=>'no_broken_auto_install',
-        error=>q{This distribution uses an old version of Module::Install. Versions of Module::Install prior to 0.89 does not detect correcty that CPAN/CPANPLUS shell is used.},
+        error=>q{This distribution uses an old version of Module::Install. Versions of Module::Install prior to 0.89 do not detect correcty that CPAN/CPANPLUS shell is used.},
         remedy=>q{Upgrade the bundled version of Module::Install to at least 0.89, but preferably to the most current release. Alternatively, you can switch to another build system / installer that does not suffer from this problem. (ExtUtils::MakeMaker, Module::Build both of which have their own set of problems.)},
         code=>sub {
-            shift->{broken_auto_install} ? 0 : 1 },
+            my $d = shift;
+            return 1 unless exists $d->{module_install};
+            $d->{module_install}{broken_auto_install} ? 0 : 1;
+        },
         details=> sub {
-            q{This distribution uses obsolete Module::Install version }.(shift->{module_install_version});
+            q{This distribution uses obsolete Module::Install version }.(shift->{module_install}{version});
         },
     },
 ];
@@ -106,7 +108,7 @@ Module::CPANTS::Kwalitee::BrokenInstaller - Check for broken Module::Install
 
 =head1 SYNOPSIS
 
-Find out whether the distribution uses an outdaten version of Module::Install.
+Find out whether the distribution uses an outdated version of Module::Install.
 
 =head1 DESCRIPTION
 
@@ -3,7 +3,8 @@ use warnings;
 use strict;
 use version;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 1000 }
 
@@ -2,7 +2,8 @@ package Module::CPANTS::Kwalitee::Distname;
 use warnings;
 use strict;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 20 }
 
@@ -18,7 +19,7 @@ sub analyse {
     # duplication.
 
     # Note also that this stub should not be removed so that
-    # this can replace the old ::Signature module, and the old
+    # this can replace the old ::Distname module, and the old
     # metrics will not be loaded while loading plugins.
     return;
 }
@@ -52,9 +53,7 @@ Module::CPANTS::Kwalitee::Distname - Proper Distname layout
 
 =head1 SYNOPSIS
 
-Checks if a distname is well-formed.
-
-A wellformed distname looks like C<Foo-Bar-1.42.tgz>
+The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Distname|https://github.com/cpants/Module-CPANTS-SiteKwalitee>.
 
 =head1 DESCRIPTION
 
@@ -64,11 +63,11 @@ A wellformed distname looks like C<Foo-Bar-1.42.tgz>
 
 Defines the order in which Kwalitee tests should be run.
 
-Returns C<20>, as data generated by C<MCK::Distname> is used by other tests.
+Returns C<20>.
 
 =head3 analyse
 
-C<MCK::Distname> uses C<CPAN::DistnameInfo> to split a distname into it's components.
+Does nothing now.
 
 =head3 kwalitee_indicators
 
@@ -2,7 +2,8 @@ package Module::CPANTS::Kwalitee::Distros;
 use warnings;
 use strict;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 800 }
 
@@ -50,7 +51,7 @@ Module::CPANTS::Kwalitee::Distros - Information retrieved from the various Linux
 
 =head1 SYNOPSIS
 
-The metrics here were based on data provided by the various downstream packaging systems, but are deprecated now. The list is only preserved for historical reasons.
+The metrics here were based on data provided by the various downstream packaging systems, but are deprecated now.
 
 =head1 DESCRIPTION
 
@@ -62,41 +63,12 @@ Defines the order in which Kwalitee tests should be run.
 
 =head3 analyse
 
+Does nothing now.
+
 =head3 kwalitee_indicators
 
 Returns the Kwalitee Indicators datastructure.
 
-=head1 Caveats
-
-CPAN_dist, the name of CPAN distribution is inferred from the download location,
-for Debian packages. It works 99% of the time, but it is not completely reliable.
-If it fails to detect something, it will spit out the known download location.
-
-CPAN_vers, the version number reported by Debian is inferred from the debian version.
-This fails a lot, since Debian has a mechanism for "unmangling" upstream versions which
-is non-reversible. We have to use that many times to fix versioning problems, 
-and those packages will show a different version (e.g. 1.080 vs 1.80)
-
-The first problem is something the Debian people like to solve by adding 
-metadata to the packages, for many other useful stuff 
-(like automatic upstream bug tracking and handling). About the second... well, 
-it's a difficult one.
-
-CPANTS does not yet handle the second issue.
-
-=head1 LINKS
-
-Basic homepage: http://packages.debian.org/src:$pkgname
-
-Detalied homepage: http://packages.qa.debian.org/$pkgname
-
-Bugs report: http://bugs.debian.org/src:$pkgname
-
-Public SVN repository: http://svn.debian.org/wsvn/pkg-perl/trunk/$pkg
-
-From that last URL, you might be interested in the debian/ and
-debian/patches subdirectories.
-
 =head1 SEE ALSO
 
 L<Module::CPANTS::Analyse>
@@ -1,13 +1,12 @@
 package Module::CPANTS::Kwalitee::Files;
 use warnings;
 use strict;
-use File::Find::Rule::VCS;
-use File::Spec::Functions qw(catdir catfile abs2rel splitdir);
+use File::Find::Object;
+use File::Spec::Functions qw(catfile);
 use File::stat;
-use File::Basename;
-use Data::Dumper;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 15 }
 
@@ -15,134 +14,155 @@ sub order { 15 }
 # Analyse
 ##################################################################
 
-my $large_file = 200_000;
-
 sub analyse {
     my $class=shift;
     my $me=shift;
     my $distdir=$me->distdir;
-
-    my $file_find_rule = File::Find::Rule::VCS->file()->relative();
-    my $dir_find_rule = File::Find::Rule::VCS->directory()->relative();
-    if ($me->d->{is_local_distribution}) {
-        $file_find_rule->ignore_vcs();
-        $dir_find_rule->ignore_vcs();
-    }
-
-    my @files = $file_find_rule->in($distdir);
-    my @dirs  = $dir_find_rule->in($distdir);
-    #my $unixy=join('/',splitdir($File::Find::name));
+    $distdir =~ s|\\|/|g if $^O eq 'MSWin32';
 
     # Respect no_index if possible
     my $no_index_re = $class->_make_no_index_regex($me);
 
+    my (%files, %dirs);
+    my (@files_array, @dirs_array);
     my $size = 0;
-    my %files;
-    foreach my $name (@files) {
-        my $path = catfile($distdir, $name);
-        $files{$name}{size} += -s $path || 0;
-        $size += $files{$name}{size};
-    }
+    my $latest_mtime = 0;
+    my @base_dirs;
+    my $finder = File::Find::Object->new({
+        depth => 1,
+    }, $distdir);
+    while(defined(my $name = $finder->next)) {
+        $name =~ s|\\|/|g if $^O eq 'MSWin32';
+        (my $path = $name) =~ s!^\Q$distdir\E(?:/|$)!! or next;
+        next if $path eq '';
+
+        if (-d $name) {
+            $dirs{$path} ||= {};
+            if (-l $name) {
+                $dirs{$path}{symlink} = 1;
+            }
+            push @dirs_array, $path;
+            next;
+        }
 
-    #die Dumper \%files;
-    $me->d->{size_unpacked}=$size;
+        if ($me->d->{is_local_distribution}) {
+            next if $path =~ m!/\.!;
+        }
 
-    # find symlinks
-    my @symlinks;
-    foreach my $f (@dirs, @files) {
-        my $p = catfile($distdir,$f);
-        if (-l $p) {
-            push(@symlinks,$f);
+        if (my $stat = stat($name)) {
+            $files{$path}{size} = $stat->size || 0;
+            $size += $files{$path}{size};
+
+            my $mtime = $files{$path}{mtime} = $stat->mtime;
+            $latest_mtime = $mtime if $mtime > $latest_mtime;
+        } else {
+            $files{$path}{stat_error} = $!;
+            next;
         }
-    }
 
-    # above checks should be done even with files to be ignored
-    if ($no_index_re) {
-        my %ignored_files;
-        for my $name (@files) {
-            (my $name_to_test = $name) =~ s|\\|/|g;
-            $name_to_test =~ s|/$||;
-            if ($name_to_test =~ qr/$no_index_re/) {
-                $ignored_files{$name} = 1;
-                next;
-            }
+        if (-l $name) {
+            $files{$path}{symlink} = 1;
         }
-        @files = grep { !$ignored_files{$_} } @files;
-        $me->d->{ignored_files_array} = [sort keys %ignored_files];
-    }
 
-    # store stuff
-    $me->d->{files}=scalar @files;
-    $me->d->{files_array}=\@files;
-    $me->d->{files_hash}=\%files;
-    $me->d->{dirs}=scalar @dirs;
-    $me->d->{dirs_array}=\@dirs;
-    $me->d->{symlinks}=scalar @symlinks;
-    $me->d->{symlinks_list}=join(';',@symlinks);
+        if (!-r $name) {
+            $files{$path}{unreadable} = 1;
+            next;
+        }
 
-    # find special files
-    my %reqfiles;
-    my @special_files=(qw(Makefile.PL Build.PL META.yml META.json MYMETA.yml MYMETA.json dist.ini cpanfile SIGNATURE MANIFEST test.pl LICENSE LICENCE));
-    map_filenames($me, \@special_files, \@files);
+        if ($no_index_re && $path =~ qr/$no_index_re/) {
+            $files{$path}{no_index} = 1;
+            next;
+        }
 
-    # find more complex files
-    my %regexs=(
-        file_changelog=>qr{^chang|history}i,
-        file_readme=>qr{^readme(?:\.(?:txt|md))?}i,
+        # ignore files in dot directories (probably VCS stuff)
+        next if $path =~ m!(?:^|/)\.[^/]+/!;
+
+        push @files_array, $path;
+
+        # distribution may have several Makefile.PLs, thus
+        # several 'lib' or 't' directories to care
+        if ($path =~ m!/Makefile\.PL$! && $path !~ m!(^|/)x?t/!) {
+            (my $dir = $path) =~ s|/[^/]+$||;
+            push @base_dirs, $dir;
+        }
+    }
+
+    $me->d->{size_unpacked}=$size;
+    $me->d->{latest_mtime}=$latest_mtime;
+
+    my @symlinks = sort {$a cmp $b} (
+        grep({ $files{$_}{symlink} } keys %files),
+        grep({ $dirs{$_}{symlink} } keys %dirs)
     );
-    while (my ($name,$regex)=each %regexs) {
-        $me->d->{$name}=join(',',grep {$_=~/$regex/} @files);
+
+    if (@symlinks) {
+        $me->d->{error}{symlinks} = join ',', @symlinks;
     }
-    
-    # find special dirs
+
+    $me->d->{base_dirs} = \@base_dirs if @base_dirs;
+    my $base_dirs_re = join '|', '', map {quotemeta "$_/"} @base_dirs;
+
+    # find special files/dirs
+    my @special_files=(qw(Makefile.PL Build.PL META.yml META.json MYMETA.yml MYMETA.json dist.ini cpanfile SIGNATURE MANIFEST test.pl LICENSE LICENCE));
     my @special_dirs=(qw(lib t xt));
-    foreach my $dir (@special_dirs){
-        my $db_dir="dir_".$dir;
-        $me->d->{$db_dir}=((grep {$_ eq "$dir"} @dirs)?1:0);
+
+    my %special_files_re=(
+        file_changelog=>qr{^(?:$base_dirs_re)(?:chang|history)}i,
+        file_readme=>qr{^(?:$base_dirs_re)readme(?:\.(?:txt|md|pod))?}i,
+    );
+
+    for my $base_dir ('', @base_dirs) {
+        $base_dir = "$base_dir/" if $base_dir;
+        for my $name (@special_files) {
+            my $file = "$base_dir$name";
+            if (exists $files{$file}) {
+                (my $key = "file_".lc $name) =~ s/\./_/;
+                $me->d->{$key} = $me->d->{$key} ? "$me->d->{$key},$file" : $file;
+            }
+        }
+        for my $name (@special_dirs) {
+            my $dir = "$base_dir$name";
+            if (exists $dirs{$dir}) {
+                my $key = "dir_$name";
+                $me->d->{$key} = $me->d->{$key} ? "$me->d->{$key},$dir" : $dir;
+            }
+        }
     }
-    
-    # get mtime
-    my $mtime=0;
-    foreach (@files) {
-        next if /\//;
-        my $to_stat=catfile($distdir,$_);
-        next unless -e $to_stat; # TODO hmm, warum ist das kein File?
-        my $stat=stat($to_stat);
-        $files{$_}{mtime} = my $thismtime=$stat->mtime;
-        $mtime=$thismtime if $mtime<$thismtime;
+
+    for my $file (keys %files) {
+        next unless $file =~ m!^(?:$base_dirs_re)[^/]+$!;
+        while(my ($key, $re) = each %special_files_re) {
+            if ($file =~ /$re/) {
+                $me->d->{$key} = $me->d->{$key} ? $me->d->{$key}.",$file" : $file;
+             }
+         }
     }
-    $me->d->{newest_file_epoch}=$mtime;
-    # $me->d->{released}=scalar localtime($mtime);
+
+    # store stuff
+    $me->d->{files}=scalar @files_array;
+    $me->d->{files_array}=\@files_array;
+    $me->d->{files_hash}=\%files;
+    $me->d->{dirs}=scalar @dirs_array;
+    $me->d->{dirs_array}=\@dirs_array;
+
+    my @ignored = grep {$files{$_}{no_index}} sort keys %files;
+    $me->d->{ignored_files_array}=\@ignored if @ignored;
 
     # check STDIN in Makefile.PL and Build.PL 
     # objective: convince people to use prompt();
     # http://www.perlfoundation.org/perl5/index.cgi?cpan_packaging
-    {
-        foreach my $file ('Makefile.PL', 'Build.PL') {
-            (my $handle = $file) =~ s/\./_/;
-            $handle = "stdin_in_" . lc $handle;
-            my $path = catfile($me->distdir,$file);
-            next if not -e $path;
-            if (open my $fh, '<', $path) {
-                if (grep {/<STDIN>/} <$fh>) {
-                    $me->d->{$handle} = 1;
-                }
-            }
-        } 
-    } 
-    return;
-}
-
-sub map_filenames {
-    my ($me, $special_files, $files) = @_;
-    my %ret;
-    foreach my $file (@$special_files){
-        (my $db_file=$file)=~s/\./_/g;
-        $db_file="file_".lc($db_file);
-        $me->d->{$db_file}=((grep {$_ eq "$file"} @$files)?1:0);
-        $ret{$db_file}=$file;
+    for my $type (qw/makefile_pl build_pl/) {
+        for my $path (split ',', $me->d->{"file_$type"} || '') {
+            next unless $path;
+            my $file = catfile($me->distdir,$path);
+            next if not -e $file;
+            open my $fh, '<', $file or next;
+            my $content = do { local $/; <$fh> } or next;
+            $me->d->{"stdin_in_$type"} = 1 if $content =~ /<STDIN>/;
+        }
     }
-    return %ret;
+
+    return;
 }
 
 sub _make_no_index_regex {
@@ -242,10 +262,10 @@ sub kwalitee_indicators {
         name=>'no_symlinks',
         error=>q{This distribution includes symbolic links (symlinks). This is bad, because there are operating systems that do not handle symlinks.},
         remedy=>q{Remove the symlinks from the distribution.},
-        code=>sub {shift->{symlinks} ? 0 : 1},
+        code=>sub {shift->{error}{symlinks} ? 0 : 1},
         details=>sub {
             my $d = shift;
-            return "The following symlinks were found: ".$d->{symlinks_list};
+            return "The following symlinks were found: ".$d->{error}{symlinks};
         },
     },
     {
@@ -328,17 +348,9 @@ Defines the order in which Kwalitee tests should be run.
 
 Returns C<15>, as data generated by C<MCK::Files> is used by all other tests.
 
-=head3 map_filenames
-
-get db_filenames from real_filenames
-
 =head3 analyse
 
-C<MCK::Files> uses C<File::Find> to get a list of all files and dirs in a dist. It checks if certain crucial files are there, and does some other file-specific stuff.
-
-=head3 get_files
-
-The subroutine used by C<File::Find>. Unfortunantly, it depends on some global values.
+C<MCK::Files> uses C<File::Find::Object> to get a list of all files and dirs in a dist. It checks if certain crucial files are there, and does some other file-specific stuff.
 
 =head3 kwalitee_indicators
 
@@ -1,10 +1,10 @@
 package Module::CPANTS::Kwalitee::FindModules;
 use warnings;
 use strict;
-use Data::Dumper;
-use File::Spec::Functions;
+use File::Spec::Functions qw(catfile);
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 30 }
 
@@ -37,6 +37,9 @@ sub analyse {
             }
             
             push(@{$me->d->{modules}},$found);
+            if (exists $me->d->{files_hash}{$file}) {
+                $me->d->{files_hash}{$file}{module} = $module;
+            }
         }
     }
     else {
@@ -48,6 +51,7 @@ sub analyse {
             next if $file=~m{^test/};
             next if $file=~m/^(bin|scripts?|ex|eg|examples?|samples?|demos?)\/\w/i;
             next if $file=~m{^inc/};   # skip Module::Install stuff
+            next if $file=~m{^(local|perl5|fatlib)/};
 
             # proper file in lib/
             if ($file=~m|^lib/(.*)\.pm$|) {
@@ -59,6 +63,7 @@ sub analyse {
                     in_basedir=>0,
                     in_lib=>1,
                 });
+                $me->d->{files_hash}{$file}{module} = $module;
             }
             else {
                 # open file and find first package
@@ -89,11 +94,19 @@ sub analyse {
                         in_basedir=> $in_basedir{$file} ? 1 : 0,
                         in_lib=>0,
                     });
+                    $me->d->{files_hash}{$file}{module} = $module;
                 }
             }
         }
     }
-    
+
+    for my $file (keys %{$me->d->{files_hash}}) {
+        next unless $file =~ /^inc\/(.+)\.pm/;
+        my $module = $1;
+        $module =~ s|/|::|g;
+        push @{$me->d->{included_modules} ||= []}, $module;
+    }
+
     return 1;
 }
 
@@ -4,7 +4,8 @@ use strict;
 use File::Spec::Functions qw(catfile);
 use Software::LicenseUtils;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 100 }
 
@@ -26,45 +27,50 @@ sub analyse {
             $me->d->{license} = $yaml->{license}.' defined in META.yml';
         }
     }
-    my $files = $me->d->{files_hash};
+    # use "files_array" to exclude files listed in "no_index".
+    my $files = $me->d->{files_array} || [];
 
     # check if there's a LICEN[CS]E file
-    if (my ($file) = grep {exists $files->{$_}} qw/LICENCE LICENSE/) {
+    if (my ($file) = grep {$_ =~ /^(?:LICEN[CS]E|COPYING)$/} @$files) {
         $me->d->{license} .= " defined in $file";
         $me->d->{external_license_file}=$file;
     }
 
     # check pod
     my %licenses;
-    foreach my $file (grep { /\.p(m|od|l)$/ } keys %$files ) {
+    foreach my $file (grep { /\.p(m|od|l)$/ } sort @$files ) {
         my $path = catfile($distdir, $file);
         next unless -r $path; # skip if not readable
         open my $fh, '<', $path or next;
         my $in_pod = 0;
         my $pod = '';
+        my $pod_head = '';
         my @possible_licenses;
         my @unknown_license_texts;
         while(<$fh>) {
             if (/^=head\d\s+.*\b(?i:LICEN[CS]E|LICEN[CS]ING|COPYRIGHT|LEGAL)\b/) {
+                $me->d->{license_in_pod} = 1;
+                $me->d->{license} ||= "defined in POD ($file)";
                 if ($in_pod) {
-                    my @guessed = Software::LicenseUtils->guess_license_from_pod("$pod\n\n=cut\n");
+                    my @guessed = Software::LicenseUtils->guess_license_from_pod("=head1 LICENSE\n$pod\n\n=cut\n");
                     if (@guessed) {
                         push @possible_licenses, @guessed;
                     } else {
-                        push @unknown_license_texts, $pod;
+                        push @unknown_license_texts, "$pod_head$pod";
                     }
                 }
 
                 $in_pod = 1;
-                $pod = "=head1 LICENSE\n";
+                $pod_head = $_;
+                $pod = '';
             }
             elsif (/^=(?:head\d\s+|cut)\b/) {
                 if ($in_pod) {
-                    my @guessed = Software::LicenseUtils->guess_license_from_pod("$pod\n\n=cut\n");
+                    my @guessed = Software::LicenseUtils->guess_license_from_pod("=head1 LICENSE\n$pod\n\n=cut\n");
                     if (@guessed) {
                         push @possible_licenses, @guessed;
                     } else {
-                        push @unknown_license_texts, $pod;
+                        push @unknown_license_texts, "$pod_head$pod";
                     }
                 }
                 $in_pod = 0;
@@ -75,21 +81,20 @@ sub analyse {
             }
         }
         if ($pod) {
-            my @guessed = Software::LicenseUtils->guess_license_from_pod("$pod\n\n=cut\n");
+            my @guessed = Software::LicenseUtils->guess_license_from_pod("=head1 LICENSE\n$pod\n\n=cut\n");
             if (@guessed) {
                 push @possible_licenses, @guessed;
             } else {
-                push @unknown_license_texts, $pod;
+                push @unknown_license_texts, "$pod_head$pod";
             }
         }
-        $me->d->{unknown_license_texts} = join "\n", @unknown_license_texts;
-
-        next unless @possible_licenses;
-        $me->d->{license_in_pod} = 1;
-        $me->d->{license} ||= "defined in POD ($file)";
-
-        $licenses{$_} = $file for @possible_licenses;
-        $files->{$file}{license} = join ',', @possible_licenses;
+        if (@possible_licenses) {
+            @possible_licenses = map { s/^Software::License:://; $_ } @possible_licenses;
+            push @{$licenses{$_} ||= []}, $file for @possible_licenses;
+            $me->d->{files_hash}{$file}{license} = join ',', @possible_licenses;
+        } else {
+            $me->d->{unknown_license_texts}{$file} = join "\n", @unknown_license_texts if @unknown_license_texts;
+        }
     }
     if (%licenses) {
         $me->d->{licenses} = \%licenses;
@@ -97,7 +102,7 @@ sub analyse {
         if (@possible_licenses == 1) {
             my ($type) = @possible_licenses;
             $me->d->{license_type} = $type;
-            $me->d->{license_file} = $licenses{$type};
+            $me->d->{license_file} = join ',', @{$licenses{$type}};
         }
     }
 
@@ -110,7 +115,24 @@ sub analyse {
 
 sub kwalitee_indicators{
     return [
-         {
+        {
+            name=>'meta_yml_has_license',
+            error=>q{This distribution does not have a license defined in META.yml.},
+            remedy=>q{Define the license if you are using in Build.PL. If you are using MakeMaker (Makefile.PL) you should upgrade to ExtUtils::MakeMaker version 6.31.},
+            is_extra=>1,
+            code=>sub { 
+                my $d=shift;
+                my $yaml=$d->{meta_yml};
+                ($yaml->{license} and $yaml->{license} ne 'unknown') ? 1 : 0 },
+            details=>sub {
+                my $d = shift;
+                my $yaml = $d->{meta_yml};
+                return "No META.yml." unless $yaml;
+                return "No license was found in META.yml." unless $yaml->{license};
+                return "Unknown license was found in META.yml.";
+            },
+        },
+        {
             name=>'has_human_readable_license',
             error=>q{This distribution does not have a license defined in the documentation or in a file called LICENSE},
             remedy=>q{Add a section called "LICENSE" to the documentation, or add a file named LICENSE to the distribution.},
@@ -134,17 +156,6 @@ sub kwalitee_indicators{
                 return "LICENSE file was found.";
             },
         },
-#        {
-#            name=>'has_known_license_in_external_license_file',
-#            error=>q{This distribution has a LICENSE or LICENCE file in its root directory but the license in it was not recognized by CPANTS.},
-#            remedy=>q{Either CPANTS needs to be fixed or your LICENSE file.},
-#            is_experimental=>1,
-#            code=>sub { 
-#                my $d = shift;
-#                return 1 if not $d->{external_license_file};
-#                return $d->{license_from_external_license_file} ? 1 : 0;
-#            },
-#        },
         {
             name=>'has_license_in_source_file',
             error=>q{Does not have license information in any of its source files},
@@ -158,6 +169,22 @@ sub kwalitee_indicators{
                 return "LICENSE section was not found in the pod.";
             },
         },
+        {
+            name=>'has_known_license_in_source_file',
+            error=>q{Does not have license information in any of its source files, or the information is not recognized by Software::License},
+            remedy=>q{Add =head1 LICENSE and/or the proper text of the well-known license to the main module in your code.},
+            is_extra => 1,
+            code=>sub {
+                my $d = shift;
+                return 0 unless $d->{license_in_pod};
+                my @files_with_licenses = grep {$d->{files_hash}{$_}{license}} keys %{$d->{files_hash}};
+                return @files_with_licenses ? 1 : 0;
+            },
+            details=>sub {
+                my $d = shift;
+                return "LICENSE section was not found in the pod, or the license information was not recognized by Software::License.";
+            },
+        },
     ];
 }
 
@@ -175,7 +202,7 @@ Module::CPANTS::Kwalitee::License - Checks if there is a license
 
 =head1 SYNOPSIS
 
-Checks if the disttribution specifies a license.
+Checks if the distribution specifies a license.
 
 =head1 DESCRIPTION
 
@@ -189,7 +216,7 @@ Returns C<100>.
 
 =head3 analyse
 
-C<MCK::License> checks if there's a C<license> field C<META.yml>. Additionally, it looks for a file called LICENSE and a POD section namend LICENSE
+C<MCK::License> checks if there's a C<license> field C<META.yml>. Additionally, it looks for a file called LICENSE and a POD section named LICENSE
 
 =head3 kwalitee_indicators
 
@@ -197,6 +224,10 @@ Returns the Kwalitee Indicators datastructure.
 
 =over
 
+=item * meta_yml_has_license
+
+=item * has_known_license_in_source_file
+
 =item * has_license_in_source_file
 
 =item * has_human_readable_license
@@ -207,7 +238,7 @@ Returns the Kwalitee Indicators datastructure.
 
 =head2 License information
 
-Pleaces wher the licens information is taken from:
+Places where the license information is taken from:
 
 Has a LICENSE file   file_license 1|0
 
@@ -4,7 +4,8 @@ use strict;
 use File::Spec::Functions qw(catfile);
 use Array::Diff;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 100 }
 
@@ -16,10 +17,6 @@ sub analyse {
     my $class=shift;
     my $me=shift;
     
-    my @files=@{$me->d->{files_array} || []};
-    if (my $ignore = $me->d->{ignored_files_array}) {
-        push @files, @$ignore;
-    }
     my $distdir=$me->distdir;
     my $manifest_file=catfile($distdir,'MANIFEST');
 
@@ -41,7 +38,7 @@ sub analyse {
         close $fh;
 
         @manifest=sort @manifest;
-        my @files=sort @files;
+        my @files=sort keys %{$me->d->{files_hash} || {}};
 
         my $diff=Array::Diff->diff(\@manifest,\@files);
         if ($diff->count == 0) {
@@ -55,6 +52,17 @@ sub analyse {
                 "Missing in Dist: " . join(', ',@{$diff->deleted}));
             $me->d->{error}{manifest_matches_dist} = \@error;
         }
+
+        # Tweak symlinks error for a local distribution (RT #97858)
+        if ($me->d->{is_local_distribution} && $me->d->{error}{symlinks}) {
+            my %manifested = map {$_ => 1} @manifest;
+            my @symlinks = grep {$manifested{$_}} split ',', $me->d->{error}{symlinks};
+            if (@symlinks) {
+                $me->d->{error}{symlinks} = join ',', @symlinks;
+            } else {
+                delete $me->d->{error}{symlinks};
+            }
+        }
     }
     else {
         $me->d->{manifest_matches_dist}=0;
@@ -4,13 +4,15 @@ use strict;
 use File::Spec::Functions qw(catfile);
 use CPAN::Meta::YAML;
 use CPAN::Meta::Validator;
+use CPAN::Meta::Converter;
+use JSON::MaybeXS;
 use List::Util qw/first/;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 10 }
 
-my $CURRENT_SPEC = '1.4';
 my $JSON_CLASS;
 
 ##################################################################
@@ -21,75 +23,105 @@ sub analyse {
     my $class=shift;
     my $me=shift;
     my $distdir=$me->distdir;
-    my $meta_yml=catfile($distdir,'META.yml');
+    my $meta_yml   = catfile($distdir,'META.yml');
+    my $meta_json  = catfile($distdir,'META.json');
+    my $mymeta_yml = catfile($distdir,'MYMETA.yml');
 
     # META.yml is not always the most preferred meta file,
     # but test it anyway because it may be broken sometimes.
-    if (-f $meta_yml) {
-        eval {
-            open my $fh, '<:utf8', $meta_yml or die $!;
-            my $yaml = do { local $/; <$fh> };
-            my $meta = CPAN::Meta::YAML->read_string($yaml) or die CPAN::Meta::YAML->errstr;
-            # Broken META.yml may return a "YAML 1.0" string first.
-            # eg. M/MH/MHASCH/Date-Gregorian-0.07.tar.gz
-            $me->d->{meta_yml}=first { ref $_ eq ref {} } @$meta;
-            $me->d->{metayml_is_parsable}=1;
-        };
-        if ($@) {
-            $me->d->{error}{metayml_is_parsable}=$@;
-        }
-    } else {
-        $me->d->{error}{metayml_is_parsable}="META.yml was not found";
+    if (-f $meta_yml && -r _) {
+        _analyse_yml($me, $meta_yml);
     }
 
-    # If there's no META.yml, or META.yml has some errors,
-    # check META.json.
-    if (!$me->d->{meta_yml}) {
-        unless ($JSON_CLASS) {
-            for (qw/JSON::XS JSON::PP/) {
-                if (eval "require $_; 1;") {
-                    $JSON_CLASS = $_;
-                    last;
-                }
-            }
-        }
+    # check also META.json (if exists).
+    if (-f $meta_json && -r _) {
+        _analyse_json($me, $meta_json);
+    }
 
-        my $meta_json = catfile($distdir,'META.json');
-        if ($JSON_CLASS && -f $meta_json) {
-            eval {
-                open my $fh, '<:utf8', $meta_json or return;
-                my $json = do { local $/; <$fh> };
-                my $meta = $JSON_CLASS->new->utf8->decode($json);
-                $me->d->{meta_yml} = $meta;
-                $me->d->{metayml_is_parsable} = 1;
-            };
-            if ($@) {
-                $me->d->{error}{metajson_is_parsable} = $@;
-            }
-        }
+    # If, and only if META.yml and META.json don't exist,
+    # try MYMETA.yml
+    if (!$me->d->{meta_yml} && -f $mymeta_yml && -r _) {
+        _analyse_yml($me, $mymeta_yml);
     }
 
-    # If we still don't have meta data, try MYMETA.yml as we may be
-    # testing a local distribution.
     if (!$me->d->{meta_yml}) {
-        my $mymeta_yml = catfile($distdir, 'MYMETA.yml');
-        if (-f $mymeta_yml) {
-            eval {
-                open my $fh, '<:utf8', $mymeta_yml or die $!;
-                my $yaml = do { local $/; <$fh> };
-                my $meta = CPAN::Meta::YAML->read_string($yaml) or die CPAN::Meta::YAML->errstr;
-                $me->d->{meta_yml}=first { ref $_ eq ref {} } @$meta;
-                $me->d->{metayml_is_parsable} = 1;
-            };
+        return;
+    }
+
+    # Theoretically it might be better to convert 1.* to 2.0.
+    # However, converting 2.0 to 1.4 is much cheaper for CPANTS
+    # website as it's much rarer as of this writing.
+    if (($me->d->{meta_yml_spec_version} || '1.0') gt '1.4') {
+        my $cmc = CPAN::Meta::Converter->new($me->d->{meta_yml});
+        my $meta_14 = eval { $cmc->convert(version => '1.4') };
+        if (!$@ && $meta_14) {
+            $me->d->{meta_yml} = $meta_14;
         }
     }
 
-    # Should we still try MYMETA.json?
+    $me->d->{dynamic_config} = $me->d->{meta_yml}{dynamic_config} ? 1 : 0;
+}
 
-    my $meta = $me->d->{meta_yml};
-    return unless $meta && ref $meta eq ref {};
+sub _analyse_yml {
+    my ($me, $file) = @_;
+    eval {
+        my $meta = CPAN::Meta::YAML->read($file) or die CPAN::Meta::YAML->errstr;
+        # Broken META.yml may return a "YAML 1.0" string first.
+        # eg. M/MH/MHASCH/Date-Gregorian-0.07.tar.gz
+        if (@$meta > 1 or ref $meta->[0] ne ref {}) {
+            $me->d->{meta_yml}=first { ref $_ eq ref {} } @$meta;
+            $me->d->{error}{meta_yml_is_parsable}="multiple parts found in META.yml";
+        } else {
+            $me->d->{meta_yml}=$meta->[0];
+            $me->d->{meta_yml_is_parsable}=1;
+        }
+    };
+    if (my $error = $@) {
+        $error =~ s/ at \S+ line \d+.+$//s;
+        $me->d->{error}{meta_yml_is_parsable}=$error;
+    }
+    if ($me->d->{meta_yml}) {
+        my ($spec, $error) = _validate_meta($me->d->{meta_yml});
+        $me->d->{error}{meta_yml_conforms_to_known_spec} = $error if $error;
+        $me->d->{meta_yml_spec_version} = $spec->{spec};
+    }
+}
 
-    $me->d->{dynamic_config} = $meta->{dynamic_config} ? 1 : 0;
+sub _analyse_json {
+    my ($me, $file) = @_;
+
+    my $meta;
+    eval {
+        my $json = do { open my $fh, '<', $file or die "$file: $!"; local $/; <$fh> };
+        $meta = decode_json($json);
+        $me->d->{meta_json_is_parsable} = 1;
+    };
+    if (my $error = $@) {
+        $error =~ s/ at \S+ line \d+.+$//s;
+        $me->d->{error}{meta_json_is_parsable} = $error;
+    }
+    if ($meta) {
+        my ($spec, $error) = _validate_meta($meta);
+        $me->d->{error}{meta_json_conforms_to_known_spec} = $error if $error;
+        $me->d->{meta_json_spec_version} = $spec->{spec};
+    }
+    if (!$me->d->{meta_yml}) {
+        $me->d->{meta_yml} = $meta;
+        $me->d->{meta_yml_spec_version} = $me->d->{meta_json_spec_version};
+        $me->d->{meta_yml_is_meta_json} = 1;
+    }
+}
+
+sub _validate_meta {
+    my $meta = shift;
+    my $error;
+    my $spec = eval { CPAN::Meta::Validator->new($meta) };
+    if ($error = $@) {
+        $error =~ s/ at \S+ line \d+.+$//s;
+    } elsif (!$spec->is_valid) {
+        $error = join ';', sort $spec->errors;
+    }
+    return ($spec, $error);
 }
 
 ##################################################################
@@ -99,43 +131,40 @@ sub analyse {
 sub kwalitee_indicators{
     return [
         {
-            name=>'metayml_is_parsable',
+            name=>'meta_yml_is_parsable',
             error=>q{The META.yml file of this distribution could not be parsed by the version of CPAN::Meta::YAML.pm CPANTS is using.},
-            remedy=>q{If you don't have one, add a META.yml file. Else, upgrade your YAML generator so it produces valid YAML.},
+            remedy=>q{Upgrade your YAML generator so it produces valid YAML.},
             code=>sub {
                 my $d = shift;
-                !$d->{error}{metayml_is_parsable} && $d->{metayml_is_parsable} ? 1 : 0
+                !$d->{error}{meta_yml_is_parsable} ? 1 : 0
             },
             details=>sub {
                 my $d = shift;
-                $d->{error}{metayml_is_parsable};
+                $d->{error}{meta_yml_is_parsable};
             },
         },
         {
-            name=>'metayml_has_license',
-            error=>q{This distribution does not have a license defined in META.yml.},
-            remedy=>q{Define the license if you are using in Build.PL. If you are using MakeMaker (Makefile.PL) you should upgrade to ExtUtils::MakeMaker version 6.31.},
-            is_extra=>1,
-            code=>sub { 
-                my $d=shift;
-                my $yaml=$d->{meta_yml};
-                ($yaml->{license} and $yaml->{license} ne 'unknown') ? 1 : 0 },
+            name=>'meta_json_is_parsable',
+            error=>q{The META.json file of this distribution could not be parsed by the version of JSON parser CPANTS is using.},
+            remedy=>q{Upgrade your META.json generator so it produces valid JSON.},
+            code=>sub {
+                my $d = shift;
+                !$d->{error}{meta_json_is_parsable} ? 1 : 0
+            },
             details=>sub {
                 my $d = shift;
-                my $yaml = $d->{meta_yml};
-                return "No META.yml." unless $yaml;
-                return "No license was found in META.yml." unless $yaml->{license};
-                return "Unknown license was found in META.yml.";
+                $d->{error}{meta_json_is_parsable};
             },
         },
         {
-            name=>'metayml_has_provides',
+            name=>'meta_yml_has_provides',
             is_experimental=>1,
             error=>q{This distribution does not have a list of provided modules defined in META.yml.},
-            remedy=>q{Add all modules contained in this distribution to the META.yml field 'provides'. Module::Build does this automatically for you.},
+            remedy=>q{Add all modules contained in this distribution to the META.yml field 'provides'. Module::Build or Dist::Zilla::Plugin::MetaProvides do this automatically for you.},
             code=>sub { 
                 my $d=shift;
-                return 1 if $d->{meta_yml} && $d->{meta_yml}{provides};
+                return 1 if !$d->{meta_yml};
+                return 1 if $d->{meta_yml}{provides};
                 return 0;
             },
             details=>sub {
@@ -145,42 +174,46 @@ sub kwalitee_indicators{
             },
         },
         {
-            name=>'metayml_conforms_to_known_spec',
+            name=>'meta_yml_conforms_to_known_spec',
             error=>q{META.yml does not conform to any recognised META.yml Spec.},
-            remedy=>q{Take a look at the META.yml Spec at http://module-build.sourceforge.net/META-spec-current.html and change your META.yml accordingly.},
+            remedy=>q{Take a look at the META.yml Spec at http://module-build.sourceforge.net/META-spec-v1.4.html (for version 1.4) or http://search.cpan.org/perldoc?CPAN::Meta::Spec (for version 2), and change your META.yml accordingly.},
             code=>sub {
                 my $d=shift;
-                return check_spec_conformance($d);
+                return 0 if $d->{error}{meta_yml_conforms_to_known_spec};
+                return 1;
             },
             details=>sub {
                 my $d = shift;
                 return "No META.yml." unless $d->{meta_yml};
-                return join "; ", @{$d->{error}{metayml_conforms_to_known_spec}};
+                return "META.yml is broken." unless $d->{meta_yml_is_parsable};
+                return $d->{error}{meta_yml_conforms_to_known_spec};
             },
         },
-    {
-            name=>'metayml_conforms_spec_current',
-            is_extra=>1,
-            error=>qq{META.yml does not conform to the Current META.yml Spec ($CURRENT_SPEC).},
-            remedy=>q{Take a look at the META.yml Spec at http://module-build.sourceforge.net/META-spec-current.html and change your META.yml accordingly.},
+        {
+            name=>'meta_json_conforms_to_known_spec',
+            error=>q{META.json does not conform to any recognised META Spec.},
+            remedy=>q{Take a look at the META.json Spec at http://module-build.sourceforge.net/META-spec-v1.4.html (for version 1.4) or http://search.cpan.org/perldoc?CPAN::Meta::Spec (for version 2), and change your META.json accordingly.},
             code=>sub {
                 my $d=shift;
-                return check_spec_conformance($d,$CURRENT_SPEC,1);
+                return 0 if $d->{error}{meta_json_is_parsable};
+                return 0 if $d->{error}{meta_json_conforms_to_known_spec};
+                return 1;
             },
             details=>sub {
                 my $d = shift;
-                return "No META.yml." unless $d->{meta_yml};
-                return join "; ", @{$d->{error}{metayml_conforms_spec_current}};
+                return "META.json is broken." unless $d->{meta_json_is_parsable};
+                return $d->{error}{meta_json_conforms_to_known_spec};
             },
         },
         {
-            name=>'metayml_declares_perl_version',
+            name=>'meta_yml_declares_perl_version',
             error=>q{This distribution does not declare the minimum perl version in META.yml.},
             is_extra=>1,
             remedy=>q{If you are using Build.PL define the {requires}{perl} = VERSION field. If you are using MakeMaker (Makefile.PL) you should upgrade ExtUtils::MakeMaker to 6.48 and use MIN_PERL_VERSION parameter. Perl::MinimumVersion can help you determine which version of Perl your module needs.},
             code=>sub { 
                 my $d=shift;
                 my $yaml=$d->{meta_yml};
+                return 1 unless $yaml;
                 return ref $yaml->{requires} eq ref {} && $yaml->{requires}{perl} ? 1 : 0;
             },
             details=>sub {
@@ -191,38 +224,28 @@ sub kwalitee_indicators{
                 return q{No "perl" subkey was found in META.yml.} unless $yaml->{requires}{perl};
             },
         },
+        {
+            name=>'meta_yml_has_repository_resource',
+            is_experimental=>1,
+            error=>q{This distribution does not have a link to a repository in META.yml.},
+            remedy=>q{Add a 'repository' resource to the META.yml via 'meta_add' accessor (for Module::Build) or META_ADD parameter (for ExtUtils::MakeMaker).},
+            code=>sub { 
+                my $d=shift;
+                my $yaml = $d->{meta_yml};
+                return 1 unless $yaml;
+                return ref $yaml->{resources} eq ref {} && $yaml->{resources}{repository} ? 1 : 0;
+            },
+            details=>sub {
+                my $d = shift;
+                my $yaml = $d->{meta_yml};
+                return "No META.yml." unless $yaml;
+                return q{No "resources" was found in META.yml.} unless ref $yaml->{resources} eq ref {};
+                return q{No "repository" subkey was found in META.yml.} unless $yaml->{resources}{repository};
+            },
+        },
     ];
 }
 
-sub check_spec_conformance {
-    my ($d,$version,$check_current)=@_;
-
-    my $report_version= $version || 'known';
-    my $yaml=$d->{meta_yml};
-    unless ($yaml && ref $yaml eq ref {} && %$yaml) {
-        my $errorname='metayml_conforms_'.($check_current?'spec_current':'to_known_spec');
-        $d->{error}{$errorname} = [$report_version, 'META.yml is missing/empty'];
-        return 0;
-    }
-
-    my $spec = CPAN::Meta::Validator->new($yaml);
-    $spec->{spec} = $version if $version;
-
-    if (!$spec->is_valid) {
-        my @errors;
-        foreach my $e ($spec->errors) {
-            next if $e=~/specification URL/ && $check_current;
-            push @errors,$e;
-        }
-        if (@errors) {
-            my $errorname='metayml_conforms_'.($check_current?'spec_current':'to_known_spec');
-            $d->{error}{$errorname} = [$report_version, sort @errors];
-            return 0;
-        }
-    }
-    return 1;
-}
-
 q{Barbies Favourite record of the moment:
   Nine Inch Nails: Year Zero};
 
@@ -232,7 +255,7 @@ __END__
 
 =head1 NAME
 
-Module::CPANTS::Kwalitee::MetaYML - Checks data availabe in META.yml
+Module::CPANTS::Kwalitee::MetaYML - Checks data available in META.yml
 
 =head1 SYNOPSIS
 
@@ -259,25 +282,21 @@ Returns the Kwalitee Indicators datastructure.
 
 =over
 
-=item * metayml_is_parsable
+=item * meta_yml_is_parsable
 
-=item * metayml_has_license
+=item * meta_yml_has_provides
 
-=item * metayml_has_provides
+=item * meta_yml_conforms_to_known_spec
 
-=item * metayml_conforms_to_known_spec
+=item * meta_yml_declares_perl_version
 
-=item * metayml_conforms_spec_current
+=item * meta_yml_has_repository_resource
 
-=item * metayml_declares_perl_version
+=item * meta_json_is_parsable
 
-=back
+=item * meta_json_conforms_to_known_spec
 
-=head3 check_spec_conformance
-
-    check_spec_conformance($d,$version);
-
-Validates META.yml using Test::CPAN::Meta.
+=back
 
 =head1 SEE ALSO
 
@@ -2,7 +2,8 @@ package Module::CPANTS::Kwalitee::NeedsCompiler;
 use warnings;
 use strict;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 200 }
 
@@ -1,8 +1,18 @@
 package Module::CPANTS::Kwalitee::Pod;
 use warnings;
 use strict;
+use File::Spec::Functions qw/catfile/;
+use Encode;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
+
+our @ABSTRACT_STUBS = (
+  q{Perl extension for blah blah blah}, # h2xs
+  q{[One line description of module's purpose here]}, # Module::Starter etc
+  q{The great new}, # Module::Starter
+  q{It's new $module}, # Minilla
+);
 
 sub order { 100 }
 
@@ -11,23 +21,119 @@ sub order { 100 }
 ##################################################################
 
 sub analyse {
-    # NOTE: This test has moved to Module::CPANTS::SiteKwalitee
-    # because in many cases the pod correctness is tested by
-    # another (author) test using Test::Pod (as it has long been
-    # encouraged). Let's double check only on the server side.
-
-    # Note also that this stub should not be removed so that
-    # this can replace the old ::Pod module, and the old
-    # metrics will not be loaded while loading plugins.
+    my ($class, $me) = @_;
+    my $distdir = $me->distdir;
+    my %abstract;
+    my @errors;
+    for my $module (@{$me->d->{modules} || []}) {
+        my ($package, $abstract, $error) = $class->_parse_abstract(catfile($distdir, $module->{file}));
+        push @errors, "$error ($package)" if $error;
+        $me->d->{abstracts_in_pod}{$package} = $abstract if $package;
+    }
+
+    # sometimes pod for .pm file is put into .pod
+    for my $file (@{$me->d->{files_array} || []}) {
+        next unless $file =~ /\.pod$/ && ($file =~ m!^lib/! or $file =~ m!^[^/]+$!);
+        local $@;
+        my ($package, $abstract, $error) = $class->_parse_abstract(catfile($distdir, $file));
+        push @errors, "$error ($package)" if $error;
+        $me->d->{abstracts_in_pod}{$package} = $abstract if $package;
+    }
+    $me->d->{error}{has_abstract_in_pod} = join ';', @errors if @errors;
 }
 
+# adapted from ExtUtils::MM_Unix and Module::Build::PodParser
+sub _parse_abstract {
+    my ($class, $file) = @_;
+    my ($package, $abstract);
+    my $inpod = 0;
+    open my $fh, '<', $file or return;
+    my $directive;
+    my $encoding;
+    while(<$fh>) {
+        if (/^=encoding\s+(.+)/) {
+            $encoding = $1;
+        }
+        if (/^=(?!cut)(.+)/) {
+            $directive = $1;
+            $inpod = 1;
+        } elsif (/^=cut/) {
+            $inpod = 0;
+        }
+        next if !$inpod;
+        next unless $directive =~ /^head/;
+        if ( /^\s*((?:[A-Za-z0-9_]+::)*[A-Za-z0-9_]+ | [BCIF] < (?:[A-Za-z0-9_]+::)*[A-Za-z0-9_]+ >) \s+ -+ (?:\s+ (.*)\s*$|$)/x ) {
+            ($package, $abstract) = ($1, $2);
+            $package =~ s![BCIF]<([^>]+)>!$1!;
+            next;
+        }
+        next unless $abstract;
+        last if /^\s*$/ || /^=/;
+        s/\s+$//s;
+        $abstract .= "\n$_";
+    }
+
+    my $error;
+    if ($encoding && $abstract) {
+        my $encoder = find_encoding($encoding);
+        if (!$encoder) {
+            $error = "unknown encoding: $encoding";
+        } else {
+            $abstract = eval { $encoder->decode($abstract) };
+            if ($@) {
+                $error = $@;
+                $error =~ s|\s*at .+ line \d+.+$||s;
+            }
+        }
+    }
+    return ($package, $abstract, $error);
+}
 
 ##################################################################
 # Kwalitee Indicators
 ##################################################################
 
 sub kwalitee_indicators {
-    return [];
+    return [
+      {
+          name => 'has_abstract_in_pod',
+          error => q{No abstract (short description of a module) is found in pod from this distribution.},
+          remedy => q{Provide a short description in the NAME section of the pod (after the module name followed by a hyphen) at least for the main module of this distribution.},
+          code => sub {
+              my $d = shift;
+              return 0 if $d->{error}{has_abstract_in_pod};
+              my @abstracts = grep {defined $_ && length $_} values %{$d->{abstracts_in_pod} || {}};
+              return @abstracts ? 1 : 0;
+          },
+          details => sub {
+              my $d = shift;
+              return "No abstracts in pod";
+          },
+      },
+      {
+          name => 'no_abstract_stub_in_pod',
+          is_extra => 1,
+          error => q{A well-known abstract stub (typically generated by an authoring tool) is found in this distribution.},
+          remedy => q{Modify the stub. You might need to modify other stubs (for name, synopsis, license, etc) as well.},
+          code => sub {
+              my $d = shift;
+              my %mapping = map {$_ => 1} @ABSTRACT_STUBS;
+              my @errors;
+              for (sort keys %{$d->{abstracts_in_pod} || {}}) {
+                  push @errors, $_ if $mapping{$d->{abstracts_in_pod}{$_} || ''};
+              }
+              if (@errors) {
+                  $d->{error}{no_abstract_stub_in_pod} = join ',', @errors;
+              }
+              return @errors ? 0 : 1;
+          },
+          details => sub {
+              my $d = shift;
+              my %mapping = map {$_ => 1} @ABSTRACT_STUBS;
+              return "Abstracts in the following packages are stubs:". $d->{error}{no_abstract_stub_in_pod};
+          },
+      },
+    ];
 }
 
 
@@ -44,7 +150,7 @@ Module::CPANTS::Kwalitee::Pod - Check Pod
 
 =head1 SYNOPSIS
 
-The check in this module has moved to L<Module::CPANTS::SiteKwalitee::Pod> to double-check the pod correctness on the server side.
+Some of the check in this module has moved to L<Module::CPANTS::SiteKwalitee::Pod|https://github.com/cpants/Module-CPANTS-SiteKwalitee> to double-check the pod correctness on the server side.
 
 If you do care, it is recommended to add a test to test pod (with L<Test::Pod>) in "xt/" directory in your distribution.
 
@@ -60,12 +166,20 @@ Returns C<100>.
 
 =head3 analyse
 
-Does nothing now.
+Parses pod to see if it has a proper abstract.
 
 =head3 kwalitee_indicators
 
 Returns the Kwalitee Indicators datastructure.
 
+=over 4
+
+=item * has_abstract_in_pod
+
+=item * no_abstract_stub_in_pod
+
+=back
+
 =head1 SEE ALSO
 
 L<Module::CPANTS::Analyse>
@@ -4,7 +4,8 @@ use strict;
 use File::Spec::Functions qw(catfile);
 use Text::Balanced qw/extract_bracketed/;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 100 }
 
@@ -30,7 +31,7 @@ sub _from_meta {
 
     my $spec = $meta->{'meta-spec'};
     my %res;
-    if ($spec && ref $spec eq ref {} && ($spec->{version} + 0) >= 2) {
+    if ($spec && ref $spec eq ref {} && ($spec->{version} || 0) =~ /^(\d+)/ && $1 >= 2) {
         # meta spec ver2
         my $prereqs = $meta->{prereqs};
 
@@ -103,7 +104,7 @@ sub _from_build_pl {
         my ($block, $left) = extract_bracketed($build_pl, '{}');
         last unless $block;
 
-        my $hashref = do { no strict; no warnings; eval $block };
+        my $hashref = do { no strict; no warnings; eval $block }; ## no critic
         if ($hashref && ref $hashref eq ref {}) {
             for my $module (keys %$hashref) {
                 my $type = $rel =~ /_/ ? $rel : "runtime_$rel";
@@ -149,7 +150,7 @@ sub _from_makefile_pl {
             # TODO
             while($makefile_pl =~ s/(?:^|;).+?((?:(?:configure|build|test)_)?requires|recommends)\s*([^;]+);//s) {
                 my ($rel, $tuple_text) = ($1, $2);
-                my @tuples = do { no strict; no warnings; eval $tuple_text };
+                my @tuples = do { no strict; no warnings; eval $tuple_text }; ## no critic
                 my $type = $rel =~ /_/ ? $rel : "runtime_$rel";
                 while(@tuples) {
                     my $module = shift @tuples or last;
@@ -169,7 +170,7 @@ sub _from_makefile_pl {
                 my ($block, $left) = extract_bracketed($makefile_pl, '{}');
                 last unless $block;
 
-                my $hashref = do { no strict; no warnings; eval $block };
+                my $hashref = do { no strict; no warnings; eval $block }; ## no critic
                 if ($hashref && ref $hashref eq ref {}) {
                     for my $module (keys %$hashref) {
                         my $type = $rel eq 'PREREQ_PM' ? "runtime_requires" : lc $rel;
@@ -292,7 +293,7 @@ sub _from_dist_ini {
 
 sub kwalitee_indicators{
     # NOTE: The metrics in this module have moved to
-    # Module::CPANTS::SiteKwalitee because these requires databases.
+    # Module::CPANTS::SiteKwalitee because these require databases.
 
     return [];
 }
@@ -307,11 +308,11 @@ __END__
 
 =head1 NAME
 
-Module::CPANTS::Kwalitee::Prereq - Checks listed prerequistes
+Module::CPANTS::Kwalitee::Prereq - Checks listed prerequisites
 
 =head1 SYNOPSIS
 
-The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Prereq>.
+The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Prereq|https://github.com/cpants/Module-CPANTS-SiteKwalitee>.
 
 =head1 DESCRIPTION
 
@@ -325,7 +326,7 @@ Returns C<100>.
 
 =head3 analyse
 
-Does nothing now.
+Find information on prerequisite distributions from meta files etc.
 
 =head3 kwalitee_indicators
 
@@ -2,7 +2,8 @@ package Module::CPANTS::Kwalitee::Repackageable;
 use warnings;
 use strict;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 900 }
 
@@ -18,7 +19,7 @@ sub analyse {
     # Module::CPANTS::SiteKwalitee.
 
     # Note also that this stub should not be removed so that
-    # this can replace the old ::Signature module, and the old
+    # this can replace the old ::Repackageable module, and the old
     # metrics will not be loaded while loading plugins.
 
     return;
@@ -45,7 +46,7 @@ Module::CPANTS::Kwalitee::Repackageable - Checks for various signs that make a m
 
 =head1 SYNOPSIS
 
-There are several agregate metrics in here.
+The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee|https://github.com/cpants/Module-CPANTS-SiteKwalitee>.
 
 =head1 DESCRIPTION
 
@@ -2,7 +2,8 @@ package Module::CPANTS::Kwalitee::Signature;
 use strict;
 use warnings;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 100 }
 
@@ -35,7 +36,7 @@ Module::CPANTS::Kwalitee::Signature - dist has a valid signature
 
 =head1 SYNOPSIS
 
-The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Signature>.
+The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Signature|https://github.com/cpants/Module-CPANTS-SiteKwalitee>.
 
 =head1 DESCRIPTION
 
@@ -2,12 +2,12 @@ package Module::CPANTS::Kwalitee::Uses;
 use warnings;
 use strict;
 use File::Spec::Functions qw(catfile);
-use Module::ExtractUse;
+use Module::ExtractUse 0.33;
 use Set::Scalar qw();
-use Data::Dumper;
 use version;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 # These equivalents should be reasonably well-known and, preferably,
 # well-documented. Don't add obscure modules used by only one person
@@ -16,7 +16,7 @@ our $VERSION = '0.92';
 # "use_(strict|warnings)" should fail if someone feels the need
 # to add "use $1;" in the modules.
 our @STRICT_EQUIV = qw( strict );
-our @WARNINGS_EQUIV = qw( warnings );
+our @WARNINGS_EQUIV = qw( warnings warnings::compat );
 our @STRICT_WARNINGS_EQUIV = qw(
   common::sense
   Any::Moose
@@ -50,69 +50,58 @@ sub analyse {
     
     my $distdir=$me->distdir;
     my $modules=$me->d->{modules};
-    my $files=$me->d->{files_array};
+    my $files=$me->d->{files_hash};
 
     # NOTE: all files in xt/ should be ignored because they are
     # for authors only and their dependencies may not be (and
     # often are not) listed in meta files.
-    my @tests=grep {m|^t\b.*\.t|} @$files;
+    my @tests=grep {m|^t\b.*\.t|} sort keys %$files;
     $me->d->{test_files} = \@tests;
 
-    my @test_modules = map { my $m = $_; $m =~ s|/|::|g; $m =~ s|\.pm$||; $m } grep {m|^t\b.*\.pm$|} @$files;
+    my @test_modules = map {
+        my $m = $_;
+        $m =~ s|\.pm$||;
+        $m =~ s|^t/(?:lib/)?||;
+        $m =~ s|/|::|g;
+        $m;
+    } grep {m|^t\b.*\.pm$|} keys %$files;
+    my %test_modules = map {$_ => 1} @test_modules;
 
     my %skip=map {$_->{module}=>1 } @$modules;
     my %uses;
 
     # used in modules
-    foreach (@$modules) {
-        my $p = Module::ExtractUse->new;
-        my $file = catfile($distdir,$_->{file});
-        $p->extract_use($file) if -f $file;
-        $_->{uses} = $p->used;
-
-        while (my ($mod,$cnt)=each%{$p->used}) {
-            next if $skip{$mod};
-            next if $mod =~ /::$/;  # see RT#35092
-            next unless $mod =~ /^[A-Za-z0-9:_]+$/;
-            $uses{$mod}{module} = $mod;
-            $uses{$mod}{in_code} += $cnt;
-            $uses{$mod}{evals_in_code} += $p->used_in_eval($mod) || 0;
+    foreach my $module (@$modules) {
+        my $combined = $class->_extract_use($me, $module->{file});
+        for my $key (keys %$combined) {
+            for my $mod (keys %{$combined->{$key}}) {
+                next if $skip{$mod};
+                $uses{$key.'_in_code'}{$mod} += $combined->{$key}{$mod};
+            }
         }
     }
     
     # used in tests
     foreach my $tf (@tests) {
-        my $pt=Module::ExtractUse->new;
-        my $file = catfile($distdir,$tf);
-        $pt->extract_use($file) if -f $file && -s $file < 1_000_000; # skip very large test files
-
-        while (my ($mod,$cnt)=each%{$pt->used}) {
-            next if $skip{$mod};
-            next if $mod =~ /::$/;  # see RT#35092
-            next unless $mod =~ /^[A-Za-z0-9:_]+$/;
-            if (@test_modules) {
-                next if grep {/(?:^|::)$mod$/} @test_modules;
+        my $combined = $class->_extract_use($me, $tf);
+        for my $key (keys %$combined) {
+            for my $mod (keys %{$combined->{$key}}) {
+                next if $mod =~ /^t::/;
+                next if $skip{$mod};
+                next if $test_modules{$mod};
+                $uses{$key.'_in_tests'}{$mod} += $combined->{$key}{$mod};
             }
-
-            $uses{$mod}{module} = $mod;
-            $uses{$mod}{in_tests} += $cnt;
-            $uses{$mod}{evals_in_tests} += $pt->used_in_eval($mod) || 0;
         }
     }
 
     # used in Makefile.PL/Build.PL
     foreach my $f (grep /\b(?:Makefile|Build)\.PL$/, @{$me->d->{files_array} || []}) {
-        my $p = Module::ExtractUse->new;
-        my $file = catfile($distdir,$f);
-        $p->extract_use($file) if -f $file;
-
-        while (my ($mod,$cnt)=each%{$p->used}) {
-            next if $skip{$mod};
-            next if $mod =~ /::$/;  # see RT#35092
-            next unless $mod =~ /^[A-Za-z0-9:_]+$/;
-            $uses{$mod}{module} = $mod;
-            $uses{$mod}{in_config} += $cnt;
-            $uses{$mod}{evals_in_config} += $p->used_in_eval($mod) || 0;
+        my $combined = $class->_extract_use($me, $f);
+        for my $key (keys %$combined) {
+            for my $mod (keys %{$combined->{$key}}) {
+                next if $skip{$mod};
+                $uses{$key.'_in_config'}{$mod} += $combined->{$key}{$mod};
+            }
         }
     }
 
@@ -120,6 +109,61 @@ sub analyse {
     return;
 }
 
+sub _extract_use {
+    my ($class, $me, $path) = @_;
+    my $file = catfile($me->distdir, $path);
+    $file =~ s|\\|/|g;
+    return unless -f $file;
+
+    my $p = Module::ExtractUse->new;
+    $p->extract_use($file);
+
+    # used actually contains required/noed
+    my %used = %{ $p->used || {} };
+    my %required = %{ $p->required || {} };
+    my %noed = %{ $p->noed || {} };
+
+    my %combined;
+    for my $mod (keys %used) {
+        next if $mod =~ /::$/; # see RT#35092
+        next unless $mod =~ /^(?:v?5\.[0-9.]+|[A-za-z0-9:_]+)$/;
+        $combined{used}{$mod} += $used{$mod};
+        if (my $used_in_eval = $p->used_in_eval($mod)) {
+            $combined{used_in_eval}{$mod} += $used_in_eval;
+            $combined{used}{$mod} -= $used_in_eval;
+        }
+        if ($required{$mod}) {
+            $combined{used}{$mod} -= $required{$mod};
+            $combined{required}{$mod} += $required{$mod};
+            if (my $required_in_eval = $p->required_in_eval($mod)) {
+                $combined{used}{$mod} += $required_in_eval;
+                $combined{used_in_eval}{$mod} -= $required_in_eval;
+                $combined{required}{$mod} -= $required_in_eval;
+                $combined{required_in_eval}{$mod} += $required_in_eval;
+            }
+        }
+        if ($noed{$mod}) {
+            $combined{used}{$mod} -= $noed{$mod};
+            $combined{noed}{$mod} += $noed{$mod};
+            if (my $noed_in_eval = $p->noed_in_eval($mod)) {
+                $combined{used}{$mod} += $noed_in_eval;
+                $combined{used_in_eval}{$mod} -= $noed_in_eval;
+                $combined{noed}{$mod} -= $noed_in_eval;
+                $combined{noed_in_eval}{$mod} += $noed_in_eval;
+            }
+        }
+        for (qw/used used_in_eval required noed/) {
+            delete $combined{$_}{$mod} unless $combined{$_}{$mod};
+        }
+    }
+
+    for my $key (keys %combined) {
+        next unless %{$combined{$key}};
+        $me->d->{files_hash}{$path}{$key} = [sort keys %{$combined{$key}}];
+    }
+    return \%combined;
+}
+
 ##################################################################
 # Kwalitee Indicators
 ##################################################################
@@ -128,23 +172,33 @@ sub kwalitee_indicators {
     return [
         {
             name=>'use_strict',
-            error=>q{This distribution does not 'use strict;' (or its equivalents) in all of its modules. Note that this is not about the actual strictness of the modules. It's bad if nobody can tell whether the modules are strictly written or not, without reading the source code of your favorite clever module that actually enforces strictness. In other words, it's bad if someone feels the need to add 'use strict' to the modules.},
-            remedy=>q{Add 'use strict' to all modules, or convince us that your favorite module is well-known enough and people can easily see the modules are strictly written.},
+            error=>q{This distribution does not 'use strict;' (or its equivalents) in all of its modules. Note that this is not about the actual strictness of the modules. It's bad if nobody can tell whether the modules are strictly written or not, without reading the source code of your favorite clever module that actually enforces strictness. In other words, it's bad if someone feels the need to add 'use strict' to your modules.},
+            remedy=>q{Add 'use strict' (or its equivalents) to all modules, or convince us that your favorite module is well-known enough and people can easily see the modules are strictly written.},
+            ignorable => 1,
             code=>sub {
                 my $d       = shift;
-                my $modules = $d->{modules};
-                my $uses    = $d->{uses};
-                return 0 unless $modules && $uses;
+                my $files = $d->{files_hash} || {};
 
                 # There are lots of acceptable strict alternatives
                 my $strict_equivalents = Set::Scalar->new->insert(@STRICT_EQUIV, @STRICT_WARNINGS_EQUIV);
 
-                my $perl_version_with_implicit_stricture = version->new('5.011');
+                my $perl_version_with_implicit_stricture = version->new('5.011')->numify;
                 my @no_strict;
-                for my $module (@{ $modules }) {
-                    next if grep {/^5\./ && version->parse($_) >= $perl_version_with_implicit_stricture} keys %{$module->{uses}};
-                    push @no_strict, $module->{module} if $strict_equivalents
-                        ->intersection(Set::Scalar->new(keys %{ $module->{uses} }))
+
+                for my $file (keys %$files) {
+                    next unless exists $files->{$file}{module};
+                    next if $files->{$file}{unreadable};
+                    next if $file =~ /\.pod$/;
+                    my $module = $files->{$file}{module};
+                    my %used;
+                    for my $key (qw/used required/) {
+                        next unless exists $files->{$file}{$key};
+                        $used{$_} = 1 for @{$files->{$file}{$key} || []};
+                    }
+                    next if grep {/^v?5\./ && version->parse($_)->numify >= $perl_version_with_implicit_stricture} keys %used;
+
+                    push @no_strict, $module if $strict_equivalents
+                        ->intersection(Set::Scalar->new(keys %used))
                         ->is_empty;
                 }
                 if (@no_strict) {
@@ -160,21 +214,29 @@ sub kwalitee_indicators {
         },
         {
             name=>'use_warnings',
-            error=>q{This distribution does not 'use warnings;' in all of its modules. Note that this is not about that your modules actually warn when something bad happens. It's bad if nobody can tell if modules warns or not, without reading the source code of your favorite module that actually enforces warnings. In other words, it's bad if someone feels the need to add 'use warnings' to the modules.},
+            error=>q{This distribution does not 'use warnings;' (or its equivalents) in all of its modules. Note that this is not about that your modules actually warn when something bad happens. It's bad if nobody can tell if a module warns or not, without reading the source code of your favorite module that actually enforces warnings. In other words, it's bad if someone feels the need to add 'use warnings' to your modules.},
             is_extra=>1,
-            remedy=>q{Add 'use warnings' to all modules (this will require perl > 5.6), or convince us that your favorite module is well-known enough and people can easily see the modules warn when something bad happens.},
+            ignorable => 1,
+            remedy=>q{Add 'use warnings' (or its equivalents) to all modules (this will require perl > 5.6), or convince us that your favorite module is well-known enough and people can easily see the modules warn when something bad happens.},
             code=>sub {
-                my $d       = shift;
-                my $modules = $d->{modules};
-                my $uses    = $d->{uses};
-                return 0 unless $modules && $uses;
+                my $d = shift;
+                my $files = $d->{files_hash} || {};
 
                 my $warnings_equivalents = Set::Scalar->new->insert(@WARNINGS_EQUIV, @STRICT_WARNINGS_EQUIV);
 
                 my @no_warnings;
-                for my $module (@{ $modules }) {
-                    push @no_warnings, $module->{module} if $warnings_equivalents
-                        ->intersection(Set::Scalar->new(keys %{ $module->{uses} }))
+                for my $file (keys %$files) {
+                    next unless exists $files->{$file}{module};
+                    next if $files->{$file}{unreadable};
+                    next if $file =~ /\.pod$/;
+                    my $module = $files->{$file}{module};
+                    my %used;
+                    for my $key (qw/used required/) {
+                        next unless exists $files->{$file}{$key};
+                        $used{$_} = 1 for @{$files->{$file}{$key} || []};
+                    }
+                    push @no_warnings, $module if $warnings_equivalents
+                        ->intersection(Set::Scalar->new(keys %used))
                         ->is_empty;
                 }
                 if (@no_warnings) {
@@ -2,7 +2,8 @@ package Module::CPANTS::Kwalitee::Version;
 use warnings;
 use strict;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 sub order { 100 }
 
@@ -12,12 +13,12 @@ sub order { 100 }
 
 sub analyse {
     # NOTE: The analysis/metrics in this module have moved to
-    # Module::CPANTS::SiteKwalitee because these requires
+    # Module::CPANTS::SiteKwalitee because these require
     # a finalized META file to detect (or ignore) versions
     # correctly.
 
     # Note also that this stub should not be removed so that
-    # this can replace the old ::Prereq module, and the old
+    # this can replace the old ::Version module, and the old
     # metrics will not be loaded while loading plugins.
 }
 
@@ -46,7 +47,7 @@ Module::CPANTS::Kwalitee::Version - check versions
 
 =head1 SYNOPSIS
 
-The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Version>.
+The metrics in this module have moved to L<Module::CPANTS::SiteKwalitee::Version|https://github.com/cpants/Module-CPANTS-SiteKwalitee>.
 
 =head1 DESCRIPTION
 
@@ -3,13 +3,21 @@ use 5.006;
 use strict;
 use warnings;
 use base qw(Class::Accessor);
-use Module::Pluggable search_path=>['Module::CPANTS::Kwalitee'];
 use Carp;
 
-our $VERSION = '0.92';
+our $VERSION = '0.96';
+$VERSION = eval $VERSION; ## no critic
 
 __PACKAGE__->mk_accessors(qw(generators _gencache _genhashcache _available _total));
 
+sub import {
+    my $class = shift;
+    my %search_path = map {(/^Module::CPANTS::/ ? $_ : "Module::CPANTS::$_") => 1 } @_;
+    $search_path{'Module::CPANTS::Kwalitee'} = 1;
+    require Module::Pluggable;
+    Module::Pluggable->import(search_path => [keys %search_path]);
+}
+
 sub new {
     my $class=shift;
     my $me=bless {},$class;
@@ -43,16 +51,22 @@ sub get_indicators {
     if ($self->_gencache->{$type}) {
         $indicators=$self->_gencache->{$type};
     } else {
+        my @aggregators;
         foreach my $gen (@{$self->generators}) {
             foreach my $ind (@{$gen->kwalitee_indicators}) {
                 if ($type eq 'all'
                     || ($type eq 'core' && !$ind->{is_extra} && !$ind->{is_experimental}) 
                     || $ind->{$type}) {
                     $ind->{defined_in}=$gen;
+                    if ($ind->{aggregating}) {
+                        push @aggregators, $ind;
+                        next;
+                    }
                     push(@$indicators,$ind); 
                 }
             }
         }
+        push @$indicators, @aggregators;
         $self->_gencache->{$type}=$indicators;
     }
     return wantarray ? @$indicators : $indicators;
@@ -1,9 +1,10 @@
 use strict;
 use warnings;
-use Test::More tests => 2;
-use Test::NoWarnings;
+use Test::More;
+use Test::FailWarnings;
 
 BEGIN {
 use_ok( 'Module::CPANTS::Analyse' );
 }
 
+done_testing;
@@ -1,54 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-use Test::Deep;
-use Test::NoWarnings;
-
-use Module::CPANTS::Kwalitee;
-
-my $CORE = 15;
-my $EXTRA = 7; #is_extra set
-my $EXPERIMENTAL = 2; #experimental?
-my $METRICS = $CORE + $EXTRA + $EXPERIMENTAL;
-
-plan tests => 8 + 2 * $METRICS;
-
-my $k=Module::CPANTS::Kwalitee->new({});
-
-is($k->available_kwalitee, $CORE, 'available kwalitee');
-is($k->total_kwalitee, $CORE + $EXTRA, 'total kwalitee');
-
-
-my $ind=$k->get_indicators_hash;
-is(ref($ind),'HASH','indicator_hash');
-is(ref($ind->{use_strict}),'HASH','hash element');
-
-{
-    my @all=$k->all_indicator_names;
-    is(@all, $METRICS, 'number of all indicators');
-}
-
-{
-    my @all=$k->core_indicator_names;
-    is(@all, $CORE, 'number of core indicators');
-}
-
-{
-    my @all=$k->optional_indicator_names;
-    is(@all, $EXTRA,'number of optional indicators');
-}
-
-
-foreach my $mod (@{$k->generators}) {
-    #$mod->analyse($me);
-    foreach my $i (@{$mod->kwalitee_indicators}) {
-        like $i->{name}, qr/^\w{3,}$/, $i->{name};
-        # to check if someone has put a $var in single quotes by mistake...
-        unlike $i->{error}, qr/\$[a-z]/, "error of $i->{name} has no \$ sign";
-        # next if $i->{needs_db};
-        # print $i->{name}."\n" if $me->opts->{verbose};
-        # my $rv=$i->{code}($me->d, $i);
-        # $me->d->{kwalitee}{$i->{name}}=$rv;
-        # $kwalitee+=$rv;
-    }
-}
@@ -1,44 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 9;
-use Test::Deep;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-
-eval {
-    my $an=Module::CPANTS::Analyse->new();
-};
-like($@, qr/need a dist/, 'exception');
-
-my $a=Module::CPANTS::Analyse->new({dist => 'dummy'});
-
-{
-	my @plugins=$a->plugins;
-	is(@plugins,16,'number of plugins');
-}
-
-
-my $plugins=$a->mck->generators;
-
-is(shift(@$plugins),'Module::CPANTS::Kwalitee::MetaYML','plugin order 1 MetaYML');
-is(shift(@$plugins),'Module::CPANTS::Kwalitee::Files','plugin order 2 Files');
-is(shift(@$plugins),'Module::CPANTS::Kwalitee::Distname','plugin order 3 Distname');
-is(shift(@$plugins),'Module::CPANTS::Kwalitee::FindModules','plugin order 4 FindModules');
-is(pop(@$plugins),'Module::CPANTS::Kwalitee::CpantsErrors','plugin order last CpantsErrors');
-
-cmp_deeply($plugins,bag(
-        qw( Module::CPANTS::Kwalitee::Pod 
-            Module::CPANTS::Kwalitee::Prereq 
-            Module::CPANTS::Kwalitee::Uses 
-            Module::CPANTS::Kwalitee::BrokenInstaller
-            Module::CPANTS::Kwalitee::Manifest
-            Module::CPANTS::Kwalitee::License
-            Module::CPANTS::Kwalitee::NeedsCompiler
-            Module::CPANTS::Kwalitee::Repackageable
-            Module::CPANTS::Kwalitee::Version
-            Module::CPANTS::Kwalitee::Distros
-            Module::CPANTS::Kwalitee::Signature
-        )),'plugin the rest');
-
-
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
-use Test::More tests => 3;
-use Test::NoWarnings;
+use Test::More;
+use Test::FailWarnings;
 
 use Module::CPANTS::Analyse;
 
@@ -13,4 +13,4 @@ ok(-e $td,"testdir $td created");
 my $td2=$a->testdir;
 is($td,$td2,"still the same testdir");
 
-
+done_testing;
@@ -1,8 +1,8 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4;
-use Test::NoWarnings;
+use Test::More;
+use Test::FailWarnings;
 
 use Module::CPANTS::Analyse;
 use File::Basename;
@@ -18,3 +18,4 @@ $td=basename($td);
 like($a->testfile,qr/$td/,"testdir in testfile");
 like($a->testfile,qr/Foo-Bar/,"filename in testfile");
 
+done_testing;
@@ -1,259 +0,0 @@
-use strict;
-use warnings;
-use Test::More;
-use Test::NoWarnings;
-use Test::Deep;
-
-use Module::CPANTS::Analyse;
-#use File::Spec::Functions;
-use Data::Dumper    qw(Dumper);
-$Data::Dumper::Sortkeys = 1;
-
-my @tests = (
-    {
-        dist => 't/eg/Text-CSV_XS-0.40.tgz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_declares_perl_version' => 0,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 40,
-           'no_stdin_for_prompting' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 1,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-           'has_separate_license_file' => 0,
-           'has_license_in_source_file' => 1,
-           'metayml_has_provides'=>0,
-        },
-        error => {},
-    },
-    {
-        dist =>  't/eg/Pipe-0.03.tar.gz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 0,
-           'metayml_declares_perl_version' => 0,
-           'metayml_is_parsable' => 0,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 29,
-           'no_stdin_for_prompting' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 0,
-           'has_meta_yml' => 0,
-           'metayml_conforms_spec_current' => 0,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 0,
-           'has_separate_license_file' => 0,
-           'has_license_in_source_file' => 1,
-           'metayml_has_provides'=>0,
-        },
-        error => {
-            'metayml_conforms_spec_current'  => ['1.4', sort
-                'META.yml is missing/empty',
-            ],
-            'metayml_conforms_to_known_spec' => ['known', sort
-                'META.yml is missing/empty',
-            ],
-            'manifest_matches_dist' => [
-                                        'MANIFEST (27) does not match dist (26):',
-                                        'Missing in MANIFEST: ',
-                                        'Missing in Dist: META.yml'
-                                      ],
-        },
-    },
-    {
-        dist => 't/eg/PPI-HTML-1.07.tar.gz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_declares_perl_version' => 1,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 37,
-           'no_stdin_for_prompting' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 0,
-           'use_warnings' => 0,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-           'has_separate_license_file' => 1,
-           'has_license_in_source_file' => 1,
-           'metayml_has_provides'=>0,
-         },
-        error => {
-           'metayml_conforms_spec_current' => [
-                                                '1.4',
-                                                sort
-                                                'Missing mandatory field, \'url\' (meta-spec -> url) [Validation: 1.4]',
-                                                'Missing mandatory field, \'version\' (meta-spec -> version) [Validation: 1.4]',
-                                                'Expected a list structure (author) [Validation: 1.4]'
-                                              ],
-        },
-    },
-    {
-        dist => 't/eg/App-Wack-0.05.tar.gz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_declares_perl_version' => 0,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 38,
-           'no_stdin_for_prompting' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 1,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-           'has_separate_license_file' => 0,
-           'has_license_in_source_file' => 1,
-           'metayml_has_provides'=>1,
-        },
-        error => {
-        },
-    },
-    {
-        dist => 't/eg/Term-Title-0.03.tar.gz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_separate_license_file' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_declares_perl_version' => 1,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 40,
-           'no_stdin_for_prompting' => 1,
-           'has_license_in_source_file' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'metayml_has_provides' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 1,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-         },
-        error => {
-        },
-    },
-    {
-        dist => 't/eg/Parse-Fedora-Packages-0.02.tar.gz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_separate_license_file' => 0,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_declares_perl_version' => 0,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 38,
-           'no_stdin_for_prompting' => 1,
-           'has_license_in_source_file' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'metayml_has_provides' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 1,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-         },
-        error => {
-        },
-    },
-    {
-        dist => 't/eg/Capture-Tiny-0.05.tar.gz',
-        kwalitee => {
-           'has_buildtool' => 1,
-           'has_separate_license_file' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_declares_perl_version' => 1,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'kwalitee' => 41,
-           'no_stdin_for_prompting' => 1,
-           'has_license_in_source_file' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'metayml_has_provides' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 1,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-         },
-        error => {
-        },
-    },
-);
-
-plan tests => 1 + 3 * @tests;
-
-foreach my $t (@tests) {
-    my $a=Module::CPANTS::Analyse->new({
-        dist=> $t->{dist},
-        _dont_cleanup=>$ENV{DONT_CLEANUP},
-        #opts => { verbose=>1 },  # enable for debugging
-        });
-
-    my $rv=$a->unpack;
-    is($rv,undef,'unpack ok');
-
-    $a->analyse;
-    $a->calc_kwalitee;
-
-    my $d=$a->d;
-    my $kw=$a->d->{kwalitee};
-    $t->{kwalitee}{kwalitee} = ignore; # another Test::Deep import
-    cmp_deeply($kw, superhashof($t->{kwalitee}), "kwalitee of $t->{dist}")
-        or diag(Dumper $kw);
-    cmp_deeply($d->{error} || {}, superhashof($t->{error}), "error of $t->{dist}")
-        or diag(Dumper $d->{error});
-    #diag(Dumper $d);
-}
-
@@ -1,40 +0,0 @@
-use strict;
-use warnings;
-
-my $td = {
-    dist  => 't/eg/PPI-HTML-1.07.tar.gz',
-    error => {
-        'metayml_conforms_spec_current' => [
-            '1.4',
-            sort
-            'Missing mandatory field, \'url\' (meta-spec -> url) [Validation: 1.4]',
-            'Missing mandatory field, \'version\' (meta-spec -> version) [Validation: 1.4]',
-            'Expected a list structure (author) [Validation: 1.4]'
-        ],
-    },
-};
-require Module::CPANTS::Analyse;
-my $a = Module::CPANTS::Analyse->new({
-    dist          => $td->{dist},
-    _dont_cleanup => $ENV{DONT_CLEANUP},
-});
-my $rv = $a->unpack;
-
-$a->analyse;
-$a->calc_kwalitee;
-
-my $d     = $a->d;
-my $kw    = $a->d->{kwalitee};
-my $left  = $d->{error}->{metayml_conforms_spec_current};
-my $right = $td->{error}->{metayml_conforms_spec_current};
-
-my ($pass, $fail) = (0, 0);
-
-for my $i (0 .. $#{$left}) {
-    if ($left->[$i] ne $right->[$i]) {
-        $fail++;
-    } else {
-        $pass++;
-    }
-}
-print "$pass,$fail\n";
@@ -1,14 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 2;
-
-for my $seed (qw(0xd8792d91 0x5be01872)) {
-    local $ENV{PERL_HASH_SEED} = $seed;
-    my @libs;
-    for my $inc (@INC) {
-        push @libs, '-I' . $inc;
-    }
-    my $cmd = join(' ', $^X, @libs, 't/11_hash_random.pl');
-    my $content = qx/$cmd/;
-    is($content, "4,0\n", "Slave forked script passed 3/3 checks with seed $seed");
-}
@@ -0,0 +1,80 @@
+use strict;
+use warnings;
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use Module::CPANTS::TestAnalyse;
+
+test_distribution {
+  my ($mca, $dir) = @_;
+  write_file("$dir/MANIFEST", <<"EOF");
+lib/Module/CPANTS/Analyse/Test.pm
+MANIFEST
+EOF
+  write_pmfile("$dir/lib/Module/CPANTS/Analyse/Test.pm");
+
+  my $stash = $mca->run;
+  is $stash->{manifest_matches_dist} => 1, "manifest matches dist";
+};
+
+test_distribution {
+  my ($mca, $dir) = @_;
+  write_pmfile("$dir/lib/Module/CPANTS/Analyse/Test.pm");
+
+  my $stash = $mca->run;
+  is $stash->{manifest_matches_dist} => 0, "manifest does not match dist";
+  like $stash->{error}{manifest_matches_dist} => qr/^Cannot find MANIFEST/, "proper error message";
+};
+
+test_distribution {
+  my ($mca, $dir) = @_;
+  write_file("$dir/MANIFEST", <<"EOF");
+eg/demo.pl
+lib/Module/CPANTS/Analyse/Test.pm
+MANIFEST
+EOF
+  write_pmfile("$dir/lib/Module/CPANTS/Analyse/Test.pm");
+  write_file("$dir/TODO", "TODO!");
+
+  my $stash = $mca->run;
+  is $stash->{manifest_matches_dist} => 0, "manifest does not match dist";
+  my @errors = @{ $stash->{error}{manifest_matches_dist} || [] };
+  ok grep /^Missing in MANIFEST: TODO/, @errors;
+  ok grep /^Missing in Dist: eg\/demo\.pl/, @errors;
+};
+
+# should hide symlink errors not in MANIFEST for a local distribution
+
+test_distribution {
+  my ($mca, $dir) = @_;
+  write_file("$dir/MANIFEST", <<"EOF");
+MANIFEST
+EOF
+
+  eval { symlink "$dir/MANIFEST", "$dir/MANIFEST.lnk" };
+  if ($@) {
+    diag "symlink is not supported";
+    return;
+  }
+
+  my $stash = $mca->run;
+  ok !$stash->{error}{symlinks}, "symlinks not listed in MANIFEST is ignored for a local distribution";
+};
+
+test_distribution {
+  my ($mca, $dir) = @_;
+  write_file("$dir/MANIFEST", <<"EOF");
+MANIFEST
+EOF
+
+  eval { symlink "$dir/MANIFEST", "$dir/MANIFEST.lnk" };
+  if ($@) {
+    diag "symlink is not supported";
+    return;
+  }
+
+  my $stash = archive_and_analyse($dir, "Module-CPANTS-Analyse-Test-0.01.tar.gz");
+
+  ok $stash->{error}{symlinks}, "symlinks not listed in MANIFEST is not ignored for a non-local distribution";
+};
+
+done_testing;
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use Module::CPANTS::TestAnalyse;
+
+test_distribution {
+  my ($mca, $dir) = @_;
+
+  my $content = join "\n\n", (
+    '=pod',
+    '=encoding utf-8;',
+    '=head1 NAME',
+    'Module::CPANTS::Analyse::Test - test abstract',
+    '=cut',
+  );
+
+  write_pmfile("$dir/lib/Module/CPANTS/Analyse/Test.pm", $content);
+
+  my $stash = $mca->run;
+  like $stash->{error}{has_abstract_in_pod} => qr/^unknown encoding: utf-8;/;
+  is $stash->{abstracts_in_pod}{'Module::CPANTS::Analyse::Test'} => 'test abstract';
+};
+
+done_testing;
@@ -1,39 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More tests => 16;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-use Data::Dumper;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/AFS-2.4.0.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-
-# some operating systems (win32) only report 383 files (maybe a problem with 
-# case-insensitive filenames)
-ok($d->{files} == 382 || $d->{files} == 381,'files');
-is($d->{size_packed},184395,'size_packed');
-is(ref($d->{modules}),'ARRAY','modules is ARRAY');
-is($d->{modules}[0]->{module},'AFS','module');
-is(ref($d->{uses}),'HASH','uses is HASH');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-ok(!$d->{metayml_parse_error},'metayml_parse_error was not set');
-is($d->{license},'perl defined in META.yml','has license');
-ok($d->{needs_compiler}, 'needs compiler');
-ok(!$d->{metayml_has_license},'metayml_has_license');
-ok(!$d->{metayml_conforms_spec_1_0},'metayml_conforms_spec_1_0');
-ok(!$d->{metayml_conforms_known_spec},'metayml_conforms_known_spec');
-ok(!$d->{metayml_conforms_spec_current},'metayml_conforms_spec_current');
-
-#diag(Dumper $d);
@@ -1,32 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More tests => 12;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $an=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/AxKit-XSP-L10N-0.03.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$an->unpack;
-is($rv,undef,'unpack ok');
-
-$an->analyse;
-
-my $d=$an->d;
-
-is($d->{files},28,'files');
-is($d->{size_packed},14486,'size_packed');
-is(ref($d->{modules}),'ARRAY','modules is ARRAY');
-is($d->{modules}[0]->{module},'AxKit::XSP::L10N','module');
-is(ref($d->{uses}),'HASH','uses is HASH');
-is($d->{uses}{'Test::More'}{in_tests},6,'uses');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-is($d->{license},'perl defined in META.yml defined in LICENSE','LICENSE');
-ok(!$d->{needs_compiler}, 'does not need compiler');
-
-
@@ -1,35 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 13;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/Devel-Timer-0.02.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-
-is($d->{files},12,'files');
-is($d->{size_packed},10646,'size_packed');
-is(ref($d->{modules}),'ARRAY','modules is ARRAY');
-my $modcount=grep {$_->{module} eq 'Devel::Timer'} @{$d->{modules}};
-is($modcount,1,'module');
-is(ref($d->{prereq}),'ARRAY','prereq is ARRAY');
-is(ref($d->{uses}),'HASH','uses is HASH');
-is($d->{uses}{'Test::More'}{in_tests},3,'uses');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-ok(!$d->{metayml_parse_error},'metayml_parse_error was not set');
-ok(!$d->{license},'no license');
-ok(!$d->{needs_compiler}, 'does not need compiler');
-
-#use Data::Dumper;
-#diag(Dumper $d);
-
@@ -1,29 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 11;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/Eg-C-0.01.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-
-is($d->{files}, 8,'files');
-is($d->{size_packed},2223,'size_packed');
-is(ref($d->{modules}),'ARRAY','modules is ARRAY');
-is($d->{modules}[0]->{module},'Eg::C','module');
-is(ref($d->{uses}),'HASH','uses is HASH');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-ok(!$d->{metayml_parse_error},'metayml_parse_error was not set');
-is($d->{license}, '', 'has no license');
-ok($d->{needs_compiler}, 'need compiler');
-
@@ -1,30 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More tests => 10;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/HTML-Tiny-0.904.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-
-is($d->{files},18,'files');
-my $modcount=grep {$_->{module} eq 'HTML::Tiny'} @{$d->{modules}};
-is($modcount,1,'module');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-ok(!$d->{metayml_parse_error},'metayml_parse_error was not set');
-like($d->{license},qr/defined in META\.yml/,'license');
-ok(!$d->{needs_compiler}, 'does not need compiler');
-ok($d->{dir_xt},'dir_xt');
-
@@ -1,26 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 7;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/Test-YAML-Meta-0.04.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-
-is($d->{files},10,'files');
-is(scalar @{$d->{ignored_files_array}},27,'ignored 27 files');
-is(@{$d->{modules}},2,'module');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-ok(!$d->{metayml_parse_error},'metayml_parse_error was not set');
-
-
@@ -1,82 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 16;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-use Test::Deep;
-
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/Acme-DonMartin-0.06.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-
-is($d->{files},9,'files');
-is($d->{size_packed},7736,'size_packed');
-is(ref($d->{modules}),'ARRAY','modules is ARRAY');
-is($d->{modules}[0]->{module},'Acme::DonMartin','module');
-is(ref($d->{uses}),'HASH','uses is HASH');
-is($d->{uses}{'Compress::Zlib'}{module},'Compress::Zlib','uses Compress::Zlib in module');
-is($d->{uses}{'Test::More'}{in_tests},1,'uses Test::More in tests');
-ok($d->{file_meta_yml},'has_yaml');
-ok($d->{metayml_is_parsable},'metayml_is_parsable');
-ok(!$d->{metayml_parse_error},'metayml_parse_error was not set');
-ok(!$d->{license},'no license in META.yml');
-
-
-$a->calc_kwalitee;
-
-my $kw=$a->d->{kwalitee};
-my $expected_kwalitee =  {
-           'has_buildtool' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 0,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 0,
-           'use_warnings' => 0,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-           'no_stdin_for_prompting' => 1,
-           'metayml_declares_perl_version' => 0,
-           'has_separate_license_file' => 0,
-           'has_license_in_source_file' => 0,
-           'metayml_has_provides'=>0,
-         };
-
-$expected_kwalitee->{kwalitee} = ignore;
-cmp_deeply($kw, superhashof($expected_kwalitee), 'metrics are as expected');
-
-is $a->d->{size_packed}, 7736, 'size_packed';
-is $a->d->{size_unpacked}, 14805, 'size_unpacked';
-cmp_bag $a->d->{files_array}, [
-          'MANIFEST',
-          'META.yml',
-          'DonMartin.pm',
-          'Changes',
-          'README',
-          'Makefile.PL',
-          't/01-basic.t',
-          'eg/freq.pl',
-          'eg/hello.pl'
-        ], 'files_array';
-
-
-#use Data::Dumper;
-#diag(Dumper $kw);
-#diag(Dumper $a);
-
@@ -1,56 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 4;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-use File::Copy qw(copy);
-use Test::Deep;
-
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/Test-YAML-Meta-0.04.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-
-my $d=$a->d;
-is($d->{files},10,'files');
-is(@{$d->{modules}},2,'module');
-
-$a->calc_kwalitee;
-
-my $kw=$a->d->{kwalitee};
-my $expected_kwalitee = {
-           'has_buildtool' => 1,
-           'has_readme' => 1,
-           'manifest_matches_dist' => 1,
-           'metayml_is_parsable' => 1,
-           'proper_libs' => 1,
-           'has_changelog' => 1,
-           'use_strict' => 1,
-           'has_tests' => 1,
-           'has_manifest' => 1,
-           'no_symlinks' => 1,
-           'metayml_has_license' => 1,
-           'has_meta_yml' => 1,
-           'metayml_conforms_spec_current' => 1,
-           'use_warnings' => 1,
-           'has_tests_in_t_dir' => 1,
-           'metayml_conforms_to_known_spec' => 1,
-           'no_stdin_for_prompting' => 1,
-           'metayml_declares_perl_version' => 0,
-           'has_license_in_source_file' => 1,
-           'metayml_has_provides'=>1,
-           'has_separate_license_file', => 1,
-         };
-
-$expected_kwalitee->{kwalitee} = ignore;
-cmp_deeply($kw, superhashof($expected_kwalitee), 'metrics are as expected');
-
-#use Data::Dumper;
-#diag(Dumper $kw);
-#diag(Dumper $a->d);
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/AFS-2.4.0.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/AFS-2.4.0.tar.gz
deleted file mode 100644
index 1ac75ad5..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/AFS-2.4.0.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Acme-DonMartin-0.06.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Acme-DonMartin-0.06.tar.gz
deleted file mode 100644
index 68c65b2b..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Acme-DonMartin-0.06.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Acme-DonMartinOther-0.06.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Acme-DonMartinOther-0.06.tar.gz
deleted file mode 100644
index bc454b55..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Acme-DonMartinOther-0.06.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/App-Wack-0.05.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/App-Wack-0.05.tar.gz
deleted file mode 100644
index 3f983c65..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/App-Wack-0.05.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/App-perlhl-0.002.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/App-perlhl-0.002.tar.gz
deleted file mode 100644
index 8d4c76b2..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/App-perlhl-0.002.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/AxKit-XSP-L10N-0.03.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/AxKit-XSP-L10N-0.03.tar.gz
deleted file mode 100644
index 10e3a561..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/AxKit-XSP-L10N-0.03.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Capture-Tiny-0.05.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Capture-Tiny-0.05.tar.gz
deleted file mode 100644
index 2ced47a6..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Capture-Tiny-0.05.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/DBIx-SchemaChecksum-0.06.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/DBIx-SchemaChecksum-0.06.tar.gz
deleted file mode 100644
index c8c0dc56..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/DBIx-SchemaChecksum-0.06.tar.gz and /dev/null differ
@@ -1,22 +0,0 @@
-debian_pkg, CPAN_dist, CPAN_vers, N_bugs, N_patches
-"libapache-db-perl", "Apache-DB", "0.14", "0", "0"
-"libtext-csv-perl", "Text-CSV", "0.45", "0", "0"
-"libtext-csv-xs-perl", "Text-CSV_XS", "not-uploaded", "0", "1"
-"libtext-diff-perl", "Text-Diff", "0.35", "0", "0"
-"libtext-format-perl", "Text-Format", "0.52", "0", "0"
-"libtext-formattable-perl", "Text-FormatTable", "1.01", "0", "0"
-"libtext-markdown-perl", "Text-Markdown", "1.0.19", "1", "0"
-"libtext-pdf-perl", "Text-PDF", "0.29a", "0", "0"
-"libtext-quoted-perl", "Text-Quoted", "2.05", "0", "0"
-"libtext-reform-perl", "Text-Reform", "1.11", "0", "0"
-"libtext-roman-perl", "Text-Roman", "3.3", "0", "0"
-"libtext-textile-perl", "Text-Textile", "2.03", "0", "0"
-"libtext-typography-perl", "Text-Typography", "0.01", "0", "1"
-"libtext-wrapper-perl", "Text-Wrapper", "1.02", "0", "0"
-"libthread-pool-simple-perl", "Thread-Pool-Simple", "0.23", "1", "0"
-"libtie-array-sorted-perl", "Tie-Array-Sorted", "1.41", "0", "0"
-"libtie-cphash-perl", "Tie-CPHash", "1.04", "0", "0"
-"libtie-ical-perl", "Tie-iCal", "0.13", "0", "0"
-"libtie-regexphash-perl", "Tie-RegexpHash", "0.15", "0", "0"
-"libtie-toobject-perl", "Tie-ToObject", "0.03", "0", "0"
-"libpipe-perl", "Pipe", "0.03", "2", "0"
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Devel-Timer-0.02.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Devel-Timer-0.02.tar.gz
deleted file mode 100644
index 1b045ef5..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Devel-Timer-0.02.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Eg-C-0.01.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Eg-C-0.01.tar.gz
deleted file mode 100644
index 9cb2d09b..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Eg-C-0.01.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/HTML-Tiny-0.904.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/HTML-Tiny-0.904.tar.gz
deleted file mode 100644
index ff37d990..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/HTML-Tiny-0.904.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/PPI-HTML-1.07.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/PPI-HTML-1.07.tar.gz
deleted file mode 100644
index 64d2ab2f..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/PPI-HTML-1.07.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Parse-Fedora-Packages-0.02.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Parse-Fedora-Packages-0.02.tar.gz
deleted file mode 100644
index a9e7d064..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Parse-Fedora-Packages-0.02.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Pipe-0.03.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Pipe-0.03.tar.gz
deleted file mode 100644
index 8723e1f2..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Pipe-0.03.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Set-Object-1.28.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Set-Object-1.28.tar.gz
deleted file mode 100644
index e7a35878..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Set-Object-1.28.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Term-Title-0.03.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Term-Title-0.03.tar.gz
deleted file mode 100644
index ba104558..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Term-Title-0.03.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Test-YAML-Meta-0.04.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Test-YAML-Meta-0.04.tar.gz
deleted file mode 100644
index 0b3945ed..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Test-YAML-Meta-0.04.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Text-CSV_XS-0.40.tgz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Text-CSV_XS-0.40.tgz
deleted file mode 100644
index 4987ec57..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/Text-CSV_XS-0.40.tgz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/Good-Dist-0.01.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/Good-Dist-0.01.tar.gz
deleted file mode 100644
index c0a2e27e..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/Good-Dist-0.01.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/bad-manifest-0.01.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/bad-manifest-0.01.tar.gz
deleted file mode 100644
index 559252ac..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/bad-manifest-0.01.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/no-manifest-0.01.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/no-manifest-0.01.tar.gz
deleted file mode 100644
index 6e54d6cd..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/manifest/no-manifest-0.01.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/modified/DBIx-SchemaChecksum-0.06.tar.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/modified/DBIx-SchemaChecksum-0.06.tar.gz
deleted file mode 100644
index 06387203..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/modified/DBIx-SchemaChecksum-0.06.tar.gz and /dev/null differ
diff --git a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/not_extractable.gz b/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/not_extractable.gz
deleted file mode 100644
index ee0bd36c..00000000
Binary files a/var/tmp/source/ISHIGAKI/Module-CPANTS-Analyse-0.92/Module-CPANTS-Analyse-0.92/t/eg/not_extractable.gz and /dev/null differ
@@ -0,0 +1,129 @@
+package #
+  Module::CPANTS::TestAnalyse;
+
+use strict;
+use warnings;
+use Carp;
+use base 'Exporter';
+use File::Temp qw/tempdir/;
+use File::Path;
+use File::Spec::Functions qw/splitpath catfile abs2rel/;
+use File::Find;
+use Cwd;
+use Module::CPANTS::Analyse;
+use CPAN::Meta::YAML;
+use Test::More;
+
+our @EXPORT = qw/
+  test_distribution
+  write_file
+  write_pmfile
+  write_metayml
+  archive_and_analyse
+/;
+
+push @EXPORT, \$Test::More::TODO, grep {Test::More->can($_)} qw/
+  ok use_ok require_ok
+  is isnt like unlike is_deeply
+  cmp_ok
+  skip todo_skip
+  pass fail
+  eq_array eq_hash eq_set
+  plan
+  done_testing
+  can_ok isa_ok new_ok
+  diag note explain
+  BAIL_OUT
+  subtest
+  nest
+/;
+
+sub test_distribution (&) {
+  my $code = shift;
+
+  my $cwd = cwd;
+
+  my $dir = tempdir(CLEANUP => 1);
+
+  my $mca = Module::CPANTS::Analyse->new({
+    dist => $dir,
+    distdir => $dir,
+  });
+
+  note "tests under $dir";
+  eval { $code->($mca, $dir) };
+  ok !$@, "no errors";
+
+  chdir $cwd;
+  rmtree $dir;
+}
+
+sub write_file {
+  my ($path, $content) = @_;
+  my ($vol, $dir, $file) = splitpath($path);
+  $dir = "$vol$dir" if $vol;
+  mkpath $dir unless -d $dir;
+  open my $fh, '>:encoding(utf8)', $path or croak "Can't open $path: $!";
+  print $fh $content;
+  note "wrote to $path";
+}
+
+sub write_pmfile {
+  my ($path, $content) = @_;
+  my @lines = ('package '.'Module::CPANTS::Analyse::Test');
+  push @lines, $content if defined $content;
+  push @lines, '1';
+  write_file($path, join ";\n", @lines, "");
+}
+
+sub write_metayml {
+  my ($path, $args) = @_;
+  my $meta = {
+    name => 'Module::CPANTS::Analyse::Test',
+    abstract => 'test',
+    author => ['A.U.Thor'],
+    generated_by => 'hand',
+    license => 'perl',
+    'meta-spec' => {version => '1.4', url => 'http://module-build.sourceforge.net/META-spec-v1.4.html'},
+    version => '0.01',
+    %{$args || {}},
+  };
+  write_file($path, CPAN::Meta::YAML->new($meta)->write_string);
+}
+
+sub archive_and_analyse {
+  my ($dir, $name) = @_;
+  my $archive_path = catfile($dir, $name);
+  (my $basename = $name) =~ s/(?:\.tar\.(?:gz|bz)|\.zip)$//;
+  require Archive::Tar;
+  my $archive = Archive::Tar->new;
+  find({
+    wanted => sub {
+      my $file = $File::Find::name;
+      my $relpath = abs2rel($file, $dir);
+      return if $relpath =~ /^\./;
+      my $path = catfile($basename, $relpath);
+      if (-l $file) {
+        $archive->add_data($path, '', {
+          type => Archive::Tar::SYMLINK,
+          linkname => readlink $file,
+        }) or die "failed to add symlink: $path";
+      } elsif (-f $file) {
+        my $content = do { local $/; open my $fh, '<', $file; <$fh> };
+        $archive->add_data($path, $content);
+      } elsif (-d $dir && $path ne '.') {
+        $archive->add_data($path, '', Archive::Tar::DIR) or die "failed to add dir: $path";
+      }
+    },
+    no_chdir => 1,
+  }, $dir);
+  $archive->write($archive_path, Archive::Tar::COMPRESS_GZIP);
+
+  ok -f $archive_path, "archive exists";
+
+  Module::CPANTS::Analyse->new({
+    dist => $archive_path,
+  })->run;
+}
+
+1;
@@ -1,23 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More tests => 4;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/modified/DBIx-SchemaChecksum-0.06.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-$a->calc_kwalitee;
-
-my $d=$a->d;
-is($d->{uses}{'Moose'}{in_code},1,'uses Moose');
-is($d->{kwalitee}{use_strict},1,'uses strict via Moose');
-
@@ -22,8 +22,6 @@ my @hardcoded_metrics = qw/
   has_test_pod_coverage
 /;
 
-plan tests => scalar @hardcoded_metrics;
-
 my %seen;
 my $kwalitee = Module::CPANTS::Kwalitee->new;
 for my $generator (@{ $kwalitee->generators }) {
@@ -35,3 +33,5 @@ for my $generator (@{ $kwalitee->generators }) {
 for (@hardcoded_metrics) {
   is $seen{$_} => 1, "$_ is available for Test::Kwalitee";
 }
+
+done_testing;
@@ -1,22 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More tests => 4;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/App-perlhl-0.002.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-$a->calc_kwalitee;
-
-my $d = $a->d;
-is($d->{uses}{'perl5i::2'}{in_code},1,'uses perl5i::2');
-is($d->{kwalitee}{use_strict},1,'uses strict via perl5i::2');
@@ -1,22 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More tests => 4;
-use Test::NoWarnings;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/App-perlhl-0.002.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-$a->analyse;
-$a->calc_kwalitee;
-
-my $d=$a->d;
-is($d->{uses}{'perl5i::2'}{in_code},1,'uses perl5i::2');
-is($d->{kwalitee}{use_strict},1,'uses strict via perl5i::2');
@@ -1,41 +0,0 @@
-use strict;
-use warnings;
-
-use Test::More 'no_plan';
-use Data::Dumper qw(Dumper);
-
-# for testing the Manifest plugin
-
-use Module::CPANTS::Analyse;
-
-use File::Path qw(rmtree);
-
-{
-    my $a=Module::CPANTS::Analyse->new({ dist => 't/eg/manifest/Good-Dist-0.01.tar.gz' });
-    $a->unpack;
-    $a->analyse;
-    is($a->d->{manifest_matches_dist}, 1, 'manifest matches dist');
-}
-
-{
-    my $a=Module::CPANTS::Analyse->new({ dist => 't/eg/manifest/no-manifest-0.01.tar.gz' });
-    $a->unpack;
-    $a->analyse;
-    is( $a->d->{manifest_matches_dist}, 0, 'manifest does not match dist' );
-    is( $a->d->{error}{manifest_matches_dist}, 'Cannot find MANIFEST in dist.','proper error message' )
-        or diag Dumper $a->d->{error};
-
-}
-
-# a third with "bad-manifest-0.01"
-{
-    my $a=Module::CPANTS::Analyse->new({ dist => 't/eg/manifest/bad-manifest-0.01.tar.gz' });
-    $a->unpack;
-    $a->analyse;
-    is( $a->d->{manifest_matches_dist}, 0, 'manifest does not match dist' );
-    is_deeply( $a->d->{error}{manifest_matches_dist}, [
-        "MANIFEST (11) does not match dist (11):",
-        "Missing in MANIFEST: TODO",
-        "Missing in Dist: eg/demo2.pl"], 'proper error message');
-}
-
@@ -1,20 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 5;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/Acme-DonMartin-0.06.tar.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $rv=$a->unpack;
-is($rv,undef,'unpack ok');
-
-ok(-d catdir($a->testdir,'Acme-DonMartin-0.06'),'dist dir');
-ok(-e catfile($a->testdir,'Acme-DonMartin-0.06','META.yml'),'dist meta yaml');
-is($a->distdir,catdir($a->testdir,'Acme-DonMartin-0.06'),'$a->distdir');
-is($a->d->{size_packed},7736,'size_packed');
-
@@ -1,27 +0,0 @@
-use strict;
-use warnings;
-use Test::More tests => 3;
-use Test::Warn;
-
-use Module::CPANTS::Analyse;
-use File::Spec::Functions;
-use Cwd qw(cwd);
-
-my $a=Module::CPANTS::Analyse->new({
-    dist=>'t/eg/not_extractable.gz',
-    _dont_cleanup=>$ENV{DONT_CLEANUP},
-});
-
-my $dir = cwd;
-my $rv;
-warnings_like {$rv=$a->unpack} [
-            qr/^No handler available for/,
-            ]
-            , 'unpack warns';
-
-like($rv,qr/Can.t call method .extract./,'unpack failed');
-is($a->d->{extractable},0,'extractable');
-
-END {
-    chdir $dir; # work around RT #67509
-}
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+use FindBin;
+use lib "$FindBin::Bin/lib";
+use Module::CPANTS::TestAnalyse;
+
+test_distribution {
+  my ($mca, $dir) = @_;
+  write_metayml("$dir/META.yml");
+  write_pmfile("$dir/Test.pm");
+
+  my $res = $mca->run;
+
+  ok !$res->{kwalitee}{use_strict}, "use_strict fails correctly";
+  ok !$res->{kwalitee}{has_tests}, "has_tests fails correctly";
+};
+
+test_distribution {
+  my ($mca, $dir) = @_;
+
+  write_pmfile("$dir/Test.pm");
+  write_metayml("$dir/META.yml", {
+    x_cpants => {ignore => {
+      use_strict => 'for some reason',
+    }}
+  });
+
+  my $res = $mca->run;
+  ok $res->{kwalitee}{use_strict}, "use_strict is ignored (and treated as pass)";
+  ok $res->{error}{use_strict} && $res->{error}{use_strict} =~ /Module::CPANTS::Analyse::Test/ && $res->{error}{use_strict} =~ /ignored/, "error is not removed and marked as 'ignored'";
+  ok !$res->{kwalitee}{has_tests}, "has_tests fails correctly";
+};
+
+test_distribution {
+  my ($mca, $dir) = @_;
+
+  write_pmfile("$dir/Test.pm");
+  write_metayml("$dir/META.yml", {
+    x_cpants => {ignore => {
+      use_strict => 'for some reason',
+      has_tests => 'because I am so lazy',
+    }}
+  });
+
+  my $res = $mca->run;
+  ok $res->{kwalitee}{use_strict}, "use_strict is ignored (and treated as pass)";
+  ok $res->{error}{use_strict} && $res->{error}{use_strict} =~ /Module::CPANTS::Analyse::Test/ && $res->{error}{use_strict} =~ /ignored/, "error is not removed and marked as 'ignored'";
+  ok !$res->{kwalitee}{has_tests}, "has_tests fails correctly regardless of the x_cpants";
+};
+
+done_testing;
@@ -5,10 +5,11 @@ use strict;
 use warnings;
 use FindBin;
 use Test::More;
+use JSON::MaybeXS;
 
 BEGIN {
   eval { require WorePAN };
-  plan skip_all => "requires WorePAN" if $@ or $WorePAN::VERSION < 0.04;
+  plan skip_all => "requires WorePAN" if $@ or $WorePAN::VERSION < 0.09;
 }
 
 use Module::CPANTS::Analyse;
@@ -20,8 +21,6 @@ sub run {
 
   my ($name) = $file =~ /(\w+)\.t$/;
 
-  plan tests => scalar @tests;
-
   for my $test (@tests) {
     my $worepan = WorePAN->new(
       root => "$FindBin::Bin/tmp",
@@ -38,7 +37,16 @@ sub run {
     my $metric = $analyzer->mck->get_indicators_hash->{$name};
     my $result = $metric->{code}->($analyzer->d);
     is $result => $test->[1], "$test->[0] $name: $result";
+
+    if (!$result) {
+      my $details = $metric->{details}->($analyzer->d) || '';
+      ok $details, ref $details ? encode_json($details) : $details;
+    }
+    if ($test->[2]) {
+      note explain $analyzer->d;
+    }
   }
+  done_testing;
 }
 
 1;
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  ['HACHI/MogileFS-Plugin-MetaData-0.01.tar.gz', 0], # 2059
+  ['URI/Acme-Madness-1.00.tar.gz', 0], # 2090
+  ['PJF/Payroll-AU-PAYG-0.01.tar.gz', 0], # 2097
+  ['LLAP/Plack-Middleware-OptionsOK-0.01.tar.gz', 0], # 2117
+  ['GMCCAR/Acme-ManekiNeko-0.03.tar.gz', 0], # 2161
+  ['KALEYCHEV/Math-Combination_out-0.21.tar.gz', 0], # 2163
+  ['LEOCHARRE/Getopt-Std-Strict-1.01.tar.gz', 0], # 2165
+  ['TJC/CGI-Untaint-telephone-0.03.tar.gz', 0], # 2178
+  ['STRZELEC/CGI-SpeedUp-0.11.tar.gz', 0], # 2187
+
+  # has a dash, though not in the same line as the package
+  ['HODEL/Brasil-Checar-CGC-1.01a.tar.gz', 0], # 2018
+
+  # abstract in non-.pm file
+  ['LEONT/App-find2perl-1.003.tar.gz', 1],
+
+  # invalid =encoding (utf-8;)
+  ['INGY/IO-All-0.40.tar.gz', 0],
+);
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['L/LA/LAWSONK/Gtk2-Ex-MPlayerEmbed-0.03.tar.gz', 0], # 465
-  ['H/HE/HEDWIG/Template-Plugin-Duration-0.01.tar.gz', 0], # 474
-  ['W/WE/WEBY/Mojolicious-Plugin-Mobi-0.02.tar.gz', 0], # 474
-  ['T/TI/TIMA/Amazon-Bezos-0.001.tar.gz', 0], # 510
-  ['L/LE/LEOCHARRE/LEOCHARRE-X11-WMCtrl-0.01.tar.gz', 0], # 514
-  ['W/WO/WOLDRICH/Bundle-Woldrich-Term-0.02.tar.gz', 0], # 530
-  ['W/WO/WOLDRICH/App-epic-0.014.tar.gz', 0], # 812
-  ['T/TA/TAG/AnyEvent-Peer39-0.32.tar.gz', 0], # 824
-  ['A/AB/ABCABC/CFTP_01.tar.gz', 0], # 897
-  ['D/DA/DAMBAR/Catalyst-Plugin-Imager-0.01.tar.gz', 0], # 1026
+  ['LAWSONK/Gtk2-Ex-MPlayerEmbed-0.03.tar.gz', 0], # 465
+  ['HEDWIG/Template-Plugin-Duration-0.01.tar.gz', 0], # 474
+  ['WEBY/Mojolicious-Plugin-Mobi-0.02.tar.gz', 0], # 474
+  ['TIMA/Amazon-Bezos-0.001.tar.gz', 0], # 510
+  ['LEOCHARRE/LEOCHARRE-X11-WMCtrl-0.01.tar.gz', 0], # 514
+  ['WOLDRICH/Bundle-Woldrich-Term-0.02.tar.gz', 0], # 530
+  ['WOLDRICH/App-epic-0.014.tar.gz', 0], # 812
+  ['TAG/AnyEvent-Peer39-0.32.tar.gz', 0], # 824
+  ['ABCABC/CFTP_01.tar.gz', 0], # 897
+  ['DAMBAR/Catalyst-Plugin-Imager-0.01.tar.gz', 0], # 1026
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['B/BE/BENNING/Math-BaseMulti-1.00.tar.gz', 0], # 2942
-  ['H/HE/HEYTRAV/Mojolicious-Plugin-Libravatar-1.08.tar.gz', 0], # 3415
-  ['T/TX/TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
-  ['M/MA/MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
-  ['M/MU/MUIR/modules/rinetd.pl-1.2.tar.gz', 0], # 4319
-  ['G/GS/GSB/WWW-Crab-Client-0.03.tar.gz', 0], # 4352
-  ['R/RS/RSHADOW/libmojolicious-plugin-human-perl_0.6.orig.tar.gz', 0], # 4504
-  ['S/SR/SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['BENNING/Math-BaseMulti-1.00.tar.gz', 0], # 2942
+  ['HEYTRAV/Mojolicious-Plugin-Libravatar-1.08.tar.gz', 0], # 3415
+  ['TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
+  ['MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
+  ['MUIR/modules/rinetd.pl-1.2.tar.gz', 0], # 4319
+  ['GSB/WWW-Crab-Client-0.03.tar.gz', 0], # 4352
+  ['RSHADOW/libmojolicious-plugin-human-perl_0.6.orig.tar.gz', 0], # 4504
+  ['SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
 );
@@ -3,12 +3,12 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['J/JJ/JJUDD/DBIx-Class-TimeStamp-HiRes-v1.0.0.tar.gz', 0], # 2596
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['S/SC/SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['J/JE/JEEN/WebService-Aladdin-0.08.tar.gz', 0], # 4287
-  ['S/SM/SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
-  ['I/IA/IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
-  ['A/AN/ANANSI/Anansi-ObjectManager-0.06.tar.gz', 0], # 5246
+  ['JJUDD/DBIx-Class-TimeStamp-HiRes-v1.0.0.tar.gz', 0], # 2596
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['JEEN/WebService-Aladdin-0.08.tar.gz', 0], # 4287
+  ['SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
+  ['IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
+  ['ANANSI/Anansi-ObjectManager-0.06.tar.gz', 0], # 5246
 );
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  ['JJUDD/DBIx-Class-TimeStamp-HiRes-v1.0.0.tar.gz', 0], # 2596
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
+  ['IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
+
+  # =head1 AUTHOR / COPYRIGHT / LICENSE
+  ['BJOERN/AI-CRM114-0.01.tar.gz', 1],
+
+  # has =head1 COPYRIGHT AND LICENSE without closing =cut
+  ['DAMI/DBIx-DataModel-2.39.tar.gz', 1],
+
+  # has =head1 LICENSE followed by =head1 COPYRIGHT
+  ['YSASAKI/App-pfswatch-0.08.tar.gz', 1],
+
+  # ignore inc/Devel/CheckLib
+  ['DJERIUS/Lua-API-0.02.tar.gz', 1],
+
+  # https://github.com/cpants/www-cpants/issues/44
+  ['NEILB/Business-CCCheck-0.09.tar.gz', 1],
+);
@@ -3,18 +3,17 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['J/JJ/JJUDD/DBIx-Class-TimeStamp-HiRes-v1.0.0.tar.gz', 0], # 2596
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['Y/YV/YVES/Sereal-0.360.tar.gz', 0], # 3537
-  ['S/SM/SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
-  ['I/IA/IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
+  ['JJUDD/DBIx-Class-TimeStamp-HiRes-v1.0.0.tar.gz', 0], # 2596
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
+  ['IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
 
   # =head1 AUTHOR / COPYRIGHT / LICENSE
-  ['B/BJ/BJOERN/AI-CRM114-0.01.tar.gz', 1],
+  ['BJOERN/AI-CRM114-0.01.tar.gz', 1],
 
   # has =head1 COPYRIGHT AND LICENSE without closing =cut
-  ['D/DA/DAMI/DBIx-DataModel-2.39.tar.gz', 1],
+  ['DAMI/DBIx-DataModel-2.39.tar.gz', 1],
 
   # has =head1 LICENSE followed by =head1 COPYRIGHT
-  ['Y/YS/YSASAKI/App-pfswatch-0.08.tar.gz', 1],
+  ['YSASAKI/App-pfswatch-0.08.tar.gz', 1],
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['L/LA/LAWSONK/Gtk2-Ex-MPlayerEmbed-0.03.tar.gz', 0], # 465
-  ['W/WE/WEBY/Mojolicious-Plugin-Mobi-0.02.tar.gz', 0], # 474
-  ['W/WO/WOLDRICH/Bundle-Woldrich-Term-0.02.tar.gz', 0], # 530
-  ['W/WO/WOLDRICH/App-epic-0.014.tar.gz', 0], # 812
-  ['T/TA/TAG/AnyEvent-Peer39-0.32.tar.gz', 0], # 824
-  ['A/AB/ABCABC/CFTP_01.tar.gz', 0], # 897
-  ['S/SA/SAULIUS/Date-Holidays-LT-0.01.tar.gz', 0], # 1532
-  ['R/RU/RUFF/DJabberd-Authen-Dovecot-0.1.tar.gz', 0], # 2105
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['G/GV/GVENKAT/JSON-HPack-0.0.3.tar.gz', 0], # 2475
+  ['LAWSONK/Gtk2-Ex-MPlayerEmbed-0.03.tar.gz', 0], # 465
+  ['WEBY/Mojolicious-Plugin-Mobi-0.02.tar.gz', 0], # 474
+  ['WOLDRICH/Bundle-Woldrich-Term-0.02.tar.gz', 0], # 530
+  ['WOLDRICH/App-epic-0.014.tar.gz', 0], # 812
+  ['TAG/AnyEvent-Peer39-0.32.tar.gz', 0], # 824
+  ['ABCABC/CFTP_01.tar.gz', 0], # 897
+  ['SAULIUS/Date-Holidays-LT-0.01.tar.gz', 0], # 1532
+  ['RUFF/DJabberd-Authen-Dovecot-0.1.tar.gz', 0], # 2105
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
+  ['GVENKAT/JSON-HPack-0.0.3.tar.gz', 0], # 2475
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['A/AN/ANANSI/Anansi-Singleton-0.02.tar.gz', 0], # 2664
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['D/DA/DAVIEIRA/Data_Translate-0.3.tar.gz', 0], # 2970
-  ['A/AN/ANANSI/Anansi-Class-0.03.tar.gz', 0], # 3028
-  ['A/AN/ANANSI/Anansi-Actor-0.04.tar.gz', 0], # 3157
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['M/MA/MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['S/ST/STEFANOS/Net-SMTP_auth-SSL-0.2.tar.gz', 0], # 4058
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
+  ['ANANSI/Anansi-Singleton-0.02.tar.gz', 0], # 2664
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['DAVIEIRA/Data_Translate-0.3.tar.gz', 0], # 2970
+  ['ANANSI/Anansi-Class-0.03.tar.gz', 0], # 3028
+  ['ANANSI/Anansi-Actor-0.04.tar.gz', 0], # 3157
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
+  ['HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
+  ['STEFANOS/Net-SMTP_auth-SSL-0.2.tar.gz', 0], # 4058
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['S/SE/SEVEAS/Term-Multiplexed-0.1.0.tar.gz', 0], # 1701
-  ['S/SR/SROMANOV/App-Nopaste-Service-Dpaste-0.01.tar.gz', 0], # 2448
-  ['S/SR/SROMANOV/Games-Chess-Position-Unicode-0.01.tar.gz', 0], # 2629
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['B/BO/BOOK/Bundle-MetaSyntactic-1.026.tar.gz', 0], # 3178
-  ['B/BE/BENMEYER/Finance-btce-0.02.tar.gz', 0], # 3575
-  ['S/SY/SYSADM/Mojolicious-Plugin-DeCSRF-0.94.tar.gz', 0], # 3654
-  ['B/BK/BKB/Lingua-EN-PluralToSingular-0.06.tar.gz', 0], # 3747
-  ['M/MA/MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
-  ['B/BK/BKB/Lingua-JA-Gairaigo-Fuzzy-0.02.tar.gz', 0], # 4159
+  ['SEVEAS/Term-Multiplexed-0.1.0.tar.gz', 0], # 1701
+  ['SROMANOV/App-Nopaste-Service-Dpaste-0.01.tar.gz', 0], # 2448
+  ['SROMANOV/Games-Chess-Position-Unicode-0.01.tar.gz', 0], # 2629
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['BOOK/Bundle-MetaSyntactic-1.026.tar.gz', 0], # 3178
+  ['BENMEYER/Finance-btce-0.02.tar.gz', 0], # 3575
+  ['SYSADM/Mojolicious-Plugin-DeCSRF-0.94.tar.gz', 0], # 3654
+  ['BKB/Lingua-EN-PluralToSingular-0.06.tar.gz', 0], # 3747
+  ['MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
+  ['BKB/Lingua-JA-Gairaigo-Fuzzy-0.02.tar.gz', 0], # 4159
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['T/TO/TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
-  ['T/TO/TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
-  ['B/BO/BOOK/Acme-MetaSyntactic-errno-1.003.tar.gz', 0], # 2889
-  ['C/CO/COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['C/CO/COOLMEN/Test-Mojo-More-0.04.tar.gz', 0], # 4301
-  ['M/MU/MUGENKEN/Bundle-Unicheck-0.02.tar.gz', 0], # 4596
-  ['S/SM/SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
-  ['C/CH/CHENRYN/Nagios-Plugin-ByGmond-0.01.tar.gz', 0], # 5159
+  ['TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
+  ['TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
+  ['BOOK/Acme-MetaSyntactic-errno-1.003.tar.gz', 0], # 2889
+  ['COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
+  ['COOLMEN/Test-Mojo-More-0.04.tar.gz', 0], # 4301
+  ['MUGENKEN/Bundle-Unicheck-0.02.tar.gz', 0], # 4596
+  ['SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
+  ['CHENRYN/Nagios-Plugin-ByGmond-0.01.tar.gz', 0], # 5159
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['M/MS/MSTROUT/pumpkin-pragma-placeholder-0.001.tar.gz', 0], # 961
-  ['S/SE/SEVEAS/Term-Multiplexed-0.1.0.tar.gz', 0], # 1701
-  ['P/PB/PBLAIR/Copy-From-Git-0.000302.tar.gz', 0], # 2235
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['N/NK/NKH/Devel-Depend-Cl-0.06.tar.gz', 0], # 3540
-  ['S/SE/SEMUELF/WWW-Github-Files-0.02.tar.gz', 0], # 3634
-  ['M/MU/MUIR/modules/rinetd.pl-1.2.tar.gz', 0], # 4319
-  ['S/SR/SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
-  ['N/NA/NANARDON/RT-Interface-Email-Filter-CheckMessageId-0.1.tar.gz', 0], # 5398
+  ['MSTROUT/pumpkin-pragma-placeholder-0.001.tar.gz', 0], # 961
+  ['SEVEAS/Term-Multiplexed-0.1.0.tar.gz', 0], # 1701
+  ['PBLAIR/Copy-From-Git-0.000302.tar.gz', 0], # 2235
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['NKH/Devel-Depend-Cl-0.06.tar.gz', 0], # 3540
+  ['SEMUELF/WWW-Github-Files-0.02.tar.gz', 0], # 3634
+  ['MUIR/modules/rinetd.pl-1.2.tar.gz', 0], # 4319
+  ['SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
+  ['NANARDON/RT-Interface-Email-Filter-CheckMessageId-0.1.tar.gz', 0], # 5398
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['S/SE/SEVEAS/Term-Multiplexed-0.1.0.tar.gz', 0], # 1701
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['M/MU/MUIR/modules/rinetd.pl-1.2.tar.gz', 0], # 4319
-  ['S/SR/SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
-  ['I/IA/IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
-  ['P/PJ/PJB/Speech-Speakup-1.04.tar.gz', 0], # 7410
-  ['F/FI/FIBO/Task-Viral-20130508.tar.gz', 0], # 8128
-  ['A/AD/ADAMBA/Algorithm-MOS-0.001.tar.gz', 0], # 8570
-  ['F/FI/FIBO/Task-BeLike-FIBO-20130508.tar.gz', 0], # 8922
+  ['SEVEAS/Term-Multiplexed-0.1.0.tar.gz', 0], # 1701
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['MUIR/modules/rinetd.pl-1.2.tar.gz', 0], # 4319
+  ['SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
+  ['IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
+  ['PJB/Speech-Speakup-1.04.tar.gz', 0], # 7410
+  ['FIBO/Task-Viral-20130508.tar.gz', 0], # 8128
+  ['ADAMBA/Algorithm-MOS-0.001.tar.gz', 0], # 8570
+  ['FIBO/Task-BeLike-FIBO-20130508.tar.gz', 0], # 8922
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['C/CO/COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
-  ['A/AP/APIOLI/YAMC-0.2.tar.gz', 0], # 3245
-  ['B/BE/BENMEYER/Finance-btce-0.02.tar.gz', 0], # 3575
-  ['S/SJ/SJQUINNEY/MooseX-Types-EmailAddress-1.1.2.tar.gz', 0], # 4257
-  ['R/RS/RSHADOW/libmojolicious-plugin-human-perl_0.6.orig.tar.gz', 0], # 4504
-  ['L/LE/LEPREVOST/Math-SparseMatrix-Operations-0.06.tar.gz', 0], # 4593
-  ['S/SR/SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
-  ['S/SU/SULLR/Net-PcapWriter-0.71.tar.gz', 0], # 5337
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
+  ['COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
+  ['APIOLI/YAMC-0.2.tar.gz', 0], # 3245
+  ['BENMEYER/Finance-btce-0.02.tar.gz', 0], # 3575
+  ['SJQUINNEY/MooseX-Types-EmailAddress-1.1.2.tar.gz', 0], # 4257
+  ['RSHADOW/libmojolicious-plugin-human-perl_0.6.orig.tar.gz', 0], # 4504
+  ['LEPREVOST/Math-SparseMatrix-Operations-0.06.tar.gz', 0], # 4593
+  ['SRPATT/Finance-Bank-CooperativeUKPersonal-0.02.tar.gz', 0], # 4991
+  ['SULLR/Net-PcapWriter-0.71.tar.gz', 0], # 5337
 );
@@ -0,0 +1,34 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  # scalar license
+  ['DMAKI/XML-RSS-Liberal-0.04.tar.gz', 0],
+
+  # no abstract
+  ['MLEHMANN/AnyEvent-DBus-0.31.tar.gz', 0],
+
+  # resource -> license
+  ['BARBIE/Template-Plugin-Lingua-EN-NameCase-0.01.tar.gz', 0],
+
+  # invalid license
+  ['TOMO/src/Net-SMTPS-0.03.tar.gz', 0], # perl
+  ['RSAVAGE/DBIx-Admin-CreateTable-2.08.tgz', 0], # artistic_2_0
+
+  # 'origin' for 'repository' does not have a URL scheme
+  ['RJBS/Sub-Import-0.092800.tar.gz', 0],
+  ['MARCEL/Permute-Named-1.100980.tar.gz', 0],
+
+  # '' for 'repository' is not a valid URL.
+  ['KEEDI/Pod-Weaver-Section-Encoding-0.100830.tar.gz', 0],
+
+  # git@github.com:... does not have a URL authority
+  ['TIMB/PostgreSQL-PLPerl-Trace-1.001.tar.gz', 0],
+
+  # Custom key must begin with 'x_' or 'X_'.
+  ['AVAR/Bot-Twatterhose-0.04.tar.gz', 0],
+
+  # value is an undefined string
+  ['TOBYINK/Return-Type-0.004.tar.gz', 0],
+);
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  # invalid control characters in abstract
+  ['JOHND/Data-Properties-YAML-0.04.tar.gz', 0], # \r
+  ['WINFINIT/Catalyst-Plugin-ModCluster-0.02.tar.gz', 0], # \t
+
+  # '"' expected
+  ['SHURD/DMTF-CIM-WSMan-v0.09.tar.gz', 0],
+  ['RFREIMUTH/RandomJungle-0.05.tar.gz', 0],
+
+  # VMS
+  ['PFAUT/VMS-Time-0_1.zip', 0],
+
+  # malformed JSON string
+  ['MAXS/Palm-MaTirelire-1.12.tar.gz', 0], # \x{fffd}
+
+  # illegal backslash escape sequence
+  ['JHTHORSEN/Convos-0.6.tar.gz', 0],
+);
@@ -0,0 +1,33 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  # '<undef>' for 'Carp' is not a valid version.
+  ['MATIU/WWW-AfinimaKi-0.1.tar.gz', 0], # 518
+
+  # 'HASH(0xb8924f0)' for 'repository' does not have a URL scheme
+  ['JBERGER/Alien-GSL-0.01.tar.gz', 0], # 556
+
+  # License 'Public domain' is invalid (license)
+  ['SEVEAS/Term-Multiplexed-0.2.2.tar.gz', 0], # 1683
+
+  # Missing mandatory field, 'author' (author)
+  ['ANDK/CPAN-Test-Dummy-Perl5-Make-CircDepeOne-1.00.tar.gz', 0], # 1893
+
+  # 'ExtUtils::MakeMaker version 6.17' for 'generated_by' is not a valid version. (requires -> generated_by)
+  ['MITTI/PDF-Report-Table-1.00.tar.gz', 0], # 2300
+
+  # Expected a map structure from string or file. (requires)
+  ['ANDK/CPAN-Test-Dummy-Perl5-Make-Expect-1.00.tar.gz', 0], # 2323
+
+  # 'DateTime::Event::Easter' for 'Time::Piece' is not a valid version.
+  ['CLIFFORDJ/Date-Holidays-EnglandWales-0.01.tar.gz', 0], # 3085
+
+  # Key 'Acme::Unic<&ouml>de' is not a legal module name.
+  ['SCHWIGON/acme-unicode/Acme-Uenicoede-0.0501.tar.gz', 0], # 3651
+
+  # 'meta-spec' => '1.1' is kind of broken, but it's not regarded
+  # as a fatal error as of CPAN::Meta 2.132830.
+  ['JOSEPHW/XML-Writer-0.545.tar.gz', 1],
+);
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  ['TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
+  ['TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
+  ['COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
+  ['TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
+  ['SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
+  ['SMUELLER/Math-Symbolic-Custom-CCompiler-1.03.tar.gz', 0], # 5244
+  ['LTP/Game-Life-0.05.tar.gz', 0], # 6535
+  ['KPEE/Carp-Growl-0.0.3.tar.gz', 0], # 6682
+);
@@ -0,0 +1,16 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  ['CHENGANG/Log-Lite-0.05.tar.gz', 0], # 2739
+  ['SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
+  ['FAYLAND/Acme-CPANAuthors-Chinese-0.26.tar.gz', 0], # 4474
+  ['BENNIE/ACME-KeyboardMarathon-1.15.tar.gz', 0], # 4479
+  ['ALEXP/Catalyst-Model-DBI-0.32.tar.gz', 0], # 4686
+  ['YTURTLE/Nephia-Plugin-Response-YAML-0.01.tar.gz', 0], # 4948
+  ['CHENRYN/Nagios-Plugin-ByGmond-0.01.tar.gz', 0], # 5159
+  ['IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
+);
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  ['TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
+  ['TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
+  ['COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
+  ['COOLMEN/Test-Mojo-More-0.04.tar.gz', 0], # 4301
+  ['SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
+  ['CHENRYN/Nagios-Plugin-ByGmond-0.01.tar.gz', 0], # 5159
+  ['SMUELLER/Math-Symbolic-Custom-CCompiler-1.03.tar.gz', 0], # 5244
+  ['LTP/Game-Life-0.05.tar.gz', 0], # 6535
+);
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  ['ISHIGAKI/Acme-CPANAuthors-Japanese-0.131002.tar.gz', 0],
+  ['ISHIGAKI/Acme-CPANAuthors-0.23.tar.gz', 1],
+);
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  # No META.yml
+  ['UNBIT/Net-uwsgi-1.1.tar.gz', 1], # 2409
+
+  # Stream does not end with newline character
+  ['SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
+
+  # Error reading from file: utf8 "\xB0" does not map to Unicode
+  ['WINTRU/Mica-1.a.0.tar.gz', 0], # 1196
+
+  # CPAN::Meta::YAML does not support a feature in line
+  ['STRO/Task-CPANAuthors-STRO-PPMCreator-2009.1018.tar.gz', 0], # 1555
+
+  # CPAN::Meta::YAML failed to classify line ' --- #YAML:1.0'
+  ['XPANEL/XPanel-0.0.7.tar.gz', 0], # 2207
+
+  # CPAN::Meta::YAML found bad indenting
+  ['NUFFIN/Devel-STDERR-Indent-0.01.tar.gz', 0], # 2594
+
+  # CPAN::Meta::YAML found illegal characters
+  ['SOCK/WWW-Search-Feedster-0.02.tar.gz', 0], # 3220
+);
@@ -1,15 +0,0 @@
-use strict;
-use warnings;
-use xt::kwalitee::Test;
-
-xt::kwalitee::Test::run(
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['A/AN/ANANSI/Anansi-Actor-0.04.tar.gz', 0], # 3157
-  ['S/SC/SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['C/CI/CINDY/AnyEvent-HTTPD-CookiePatch-v0.1.0.tar.gz', 0], # 4162
-  ['B/BE/BENNIE/ACME-KeyboardMarathon-1.15.tar.gz', 0], # 4479
-  ['M/ML/MLX/Algorithm-Damm-1.001.002.tar.gz', 0], # 4537
-);
@@ -1,15 +0,0 @@
-use strict;
-use warnings;
-use xt::kwalitee::Test;
-
-xt::kwalitee::Test::run(
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['A/AN/ANANSI/Anansi-Actor-0.04.tar.gz', 0], # 3157
-  ['S/SC/SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['C/CI/CINDY/AnyEvent-HTTPD-CookiePatch-v0.1.0.tar.gz', 0], # 4162
-  ['B/BE/BENNIE/ACME-KeyboardMarathon-1.15.tar.gz', 0], # 4479
-  ['M/ML/MLX/Algorithm-Damm-1.001.002.tar.gz', 0], # 4537
-);
@@ -1,16 +0,0 @@
-use strict;
-use warnings;
-use xt::kwalitee::Test;
-
-xt::kwalitee::Test::run(
-  ['T/TO/TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
-  ['T/TO/TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
-  ['C/CO/COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['T/TX/TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['S/SM/SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
-  ['S/SM/SMUELLER/Math-Symbolic-Custom-CCompiler-1.03.tar.gz', 0], # 5244
-  ['L/LT/LTP/Game-Life-0.05.tar.gz', 0], # 6535
-  ['K/KP/KPEE/Carp-Growl-0.0.3.tar.gz', 0], # 6682
-);
@@ -1,16 +0,0 @@
-use strict;
-use warnings;
-use xt::kwalitee::Test;
-
-xt::kwalitee::Test::run(
-  ['C/CH/CHENGANG/Log-Lite-0.05.tar.gz', 0], # 2739
-  ['S/SC/SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['F/FA/FAYLAND/Acme-CPANAuthors-Chinese-0.26.tar.gz', 0], # 4474
-  ['B/BE/BENNIE/ACME-KeyboardMarathon-1.15.tar.gz', 0], # 4479
-  ['A/AL/ALEXP/Catalyst-Model-DBI-0.32.tar.gz', 0], # 4686
-  ['Y/YT/YTURTLE/Nephia-Plugin-Response-YAML-0.01.tar.gz', 0], # 4948
-  ['C/CH/CHENRYN/Nagios-Plugin-ByGmond-0.01.tar.gz', 0], # 5159
-  ['I/IA/IAMCAL/Flickr-API-1.06.tar.gz', 0], # 5172
-);
@@ -1,16 +0,0 @@
-use strict;
-use warnings;
-use xt::kwalitee::Test;
-
-xt::kwalitee::Test::run(
-  ['T/TO/TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
-  ['T/TO/TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
-  ['C/CO/COOLMEN/Test-More-Color-0.04.tar.gz', 0], # 2963
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['C/CO/COOLMEN/Test-Mojo-More-0.04.tar.gz', 0], # 4301
-  ['S/SM/SMUELLER/Math-SymbolicX-Complex-1.01.tar.gz', 0], # 4719
-  ['C/CH/CHENRYN/Nagios-Plugin-ByGmond-0.01.tar.gz', 0], # 5159
-  ['S/SM/SMUELLER/Math-Symbolic-Custom-CCompiler-1.03.tar.gz', 0], # 5244
-  ['L/LT/LTP/Game-Life-0.05.tar.gz', 0], # 6535
-);
@@ -1,19 +0,0 @@
-use strict;
-use warnings;
-use xt::kwalitee::Test;
-
-xt::kwalitee::Test::run(
-  # No META.yml
-  ['U/UN/UNBIT/Net-uwsgi-1.1.tar.gz', 0], # 2409
-  ['A/AN/ANANSI/Anansi-Singleton-0.02.tar.gz', 0], # 2664
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907
-  ['A/AN/ANANSI/Anansi-Class-0.03.tar.gz', 0], # 3028
-  ['A/AN/ANANSI/Anansi-Actor-0.04.tar.gz', 0], # 3157
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['M/MA/MANIGREW/SEG7-1.0.1.tar.gz', 0], # 3847
-  ['H/HI/HITHIM/Socket-Mmsg-0.02.tar.gz', 0], # 3946
-  ['S/ST/STEFANOS/Net-SMTP_auth-SSL-0.2.tar.gz', 0], # 4058
-
-  # Stream does not end with newline character
-  ['S/SC/SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
-);
@@ -0,0 +1,17 @@
+use strict;
+use warnings;
+use xt::kwalitee::Test;
+
+xt::kwalitee::Test::run(
+  # h2xs
+  ['ERICW/Roll-1.0.tar.gz', 0], # 2188
+  ['IEFREMOV/Statistics-CountAverage-0.02.tar.gz', 0], # 2839
+  ['HSLEE/Search-Equidistance-0.01.tar.gz', 0], # 3142
+  ['OPITZ/URL-Grab-1.4.tar.gz', 0], # 3210
+
+  # Module::Starter etc
+  ['IKEBE/WebService-Livedoor-Auth-0.01.tar.gz', 0],
+
+  # Minilla
+  ['NNUTTER/Git-Repository-Plugin-Gerrit-0.03.tar.gz', 0],
+);
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['G/GU/GUGOD/WWW-Shorten-0rz-0.07.tar.gz', 0], # 14671
-  ['C/CL/CLKAO/IPC-Run-SafeHandles-0.04.tar.gz', 0], # 19431
-  ['T/TB/TBR/WKHTMLTOPDF-0.02.tar.gz', 0], # 19819
-  ['M/MO/MONS/Test-More-UTF8-0.04.tar.gz', 0], # 19952
-  ['S/SK/SKAUFMAN/Template-Plugin-Devel-StackTrace-0.02.tar.gz', 0], # 19960
-  ['L/LU/LUKEC/Test-Mock-LWP-0.06.tar.gz', 0], # 20054
-  ['G/GA/GAOU/Ubigraph-0.05.tar.gz', 0], # 20092
-  ['Y/YV/YVESAGO/Jifty-Plugin-Userpic-0.9.tar.gz', 0], # 20161
-  ['Y/YV/YVESAGO/Jifty-Plugin-SiteNews-0.9.tar.gz', 0], # 20249
-  ['B/BO/BOLAV/DateTime-Format-Duration-DurationString-0.03.tar.gz', 0], # 20527
+  ['GUGOD/WWW-Shorten-0rz-0.07.tar.gz', 0], # 14671
+  ['CLKAO/IPC-Run-SafeHandles-0.04.tar.gz', 0], # 19431
+  ['TBR/WKHTMLTOPDF-0.02.tar.gz', 0], # 19819
+  ['MONS/Test-More-UTF8-0.04.tar.gz', 0], # 19952
+  ['SKAUFMAN/Template-Plugin-Devel-StackTrace-0.02.tar.gz', 0], # 19960
+  ['LUKEC/Test-Mock-LWP-0.06.tar.gz', 0], # 20054
+  ['GAOU/Ubigraph-0.05.tar.gz', 0], # 20092
+  ['YVESAGO/Jifty-Plugin-Userpic-0.9.tar.gz', 0], # 20161
+  ['YVESAGO/Jifty-Plugin-SiteNews-0.9.tar.gz', 0], # 20249
+  ['BOLAV/DateTime-Format-Duration-DurationString-0.03.tar.gz', 0], # 20527
 );
@@ -3,17 +3,17 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['G/GU/GUGOD/Kwiki-Session-0.01.tar.gz', 0], # 7880
-  ['G/GU/GUGOD/Kwiki-Widgets-Links-0.01.tar.gz', 0], # 8214
-  ['C/CL/CLSUNG/Lingua-ZH-Segment-0.02.tar.gz', 0], # 8236
-  ['R/RH/RHUNDT/Catalyst-Model-Oryx-0.01.tar.gz', 0], # 8255
-  ['X/XE/XERN/Template-Plugin-IO-All-0.01.tar.gz', 0], # 8462
-  ['I/IJ/IJLIAO/WWW-Scraper-ISBN-TWSrbook_Driver-0.01.tar.gz', 0], # 9139
-  ['I/IJ/IJLIAO/WWW-Scraper-ISBN-TWYlib_Driver-0.01.tar.gz', 0], # 9199
-  ['I/IJ/IJLIAO/WWW-Scraper-ISBN-TWTenlong_Driver-0.01.tar.gz', 0], # 9210
-  ['I/IJ/IJLIAO/WWW-Scraper-ISBN-TWPchome_Driver-0.01.tar.gz', 0], # 9308
-  ['I/IJ/IJLIAO/WWW-Scraper-ISBN-TWSoidea_Driver-0.01.tar.gz', 0], # 9348
+  ['GUGOD/Kwiki-Session-0.01.tar.gz', 0], # 7880
+  ['GUGOD/Kwiki-Widgets-Links-0.01.tar.gz', 0], # 8214
+  ['CLSUNG/Lingua-ZH-Segment-0.02.tar.gz', 0], # 8236
+  ['RHUNDT/Catalyst-Model-Oryx-0.01.tar.gz', 0], # 8255
+  ['XERN/Template-Plugin-IO-All-0.01.tar.gz', 0], # 8462
+  ['IJLIAO/WWW-Scraper-ISBN-TWSrbook_Driver-0.01.tar.gz', 0], # 9139
+  ['IJLIAO/WWW-Scraper-ISBN-TWYlib_Driver-0.01.tar.gz', 0], # 9199
+  ['IJLIAO/WWW-Scraper-ISBN-TWTenlong_Driver-0.01.tar.gz', 0], # 9210
+  ['IJLIAO/WWW-Scraper-ISBN-TWPchome_Driver-0.01.tar.gz', 0], # 9308
+  ['IJLIAO/WWW-Scraper-ISBN-TWSoidea_Driver-0.01.tar.gz', 0], # 9348
 
   # M::I 1.04
-  ['K/KA/KARMAN/Dezi-UI-0.001000.tar.gz', 0],
+  ['KARMAN/Dezi-UI-0.001000.tar.gz', 0],
 );
@@ -3,14 +3,14 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['G/GM/GMCCAR/Jabber-SimpleSend-0.03.tar.gz', 0], # 3455
-  ['S/SP/SPEEVES/Apache-AuthenNIS-0.13.tar.gz', 0], # 4517
-  ['S/SP/SPEEVES/Apache2-AuthenSmb-0.01.tar.gz', 0], # 5219
-  ['K/KR/KROW/DBIx-Password-1.9.tar.gz', 0], # 5478
-  ['G/GE/GEOTIGER/Data-Fax-0.02.tar.gz', 0], # 5944
-  ['G/GE/GEOTIGER/CGI-Getopt-0.13.tar.gz', 0], # 6014
-  ['S/SP/SPEEVES/Apache2-AuthNetLDAP-0.01.tar.gz', 0], # 6855
-  ['S/SP/SPEEVES/Apache-AuthNetLDAP-0.29.tar.gz', 0], # 6952
-  ['A/AM/AMALTSEV/XAO-MySQL-1.02.tar.gz', 0], # 7242
-  ['B/BH/BHODGES/Mail-IMAPFolderSearch-0.03.tar.gz', 0], # 7326
+  ['GMCCAR/Jabber-SimpleSend-0.03.tar.gz', 0], # 3455
+  ['SPEEVES/Apache-AuthenNIS-0.13.tar.gz', 0], # 4517
+  ['SPEEVES/Apache2-AuthenSmb-0.01.tar.gz', 0], # 5219
+  ['KROW/DBIx-Password-1.9.tar.gz', 0], # 5478
+  ['GEOTIGER/Data-Fax-0.02.tar.gz', 0], # 5944
+  ['GEOTIGER/CGI-Getopt-0.13.tar.gz', 0], # 6014
+  ['SPEEVES/Apache2-AuthNetLDAP-0.01.tar.gz', 0], # 6855
+  ['SPEEVES/Apache-AuthNetLDAP-0.29.tar.gz', 0], # 6952
+  ['AMALTSEV/XAO-MySQL-1.02.tar.gz', 0], # 7242
+  ['BHODGES/Mail-IMAPFolderSearch-0.03.tar.gz', 0], # 7326
 );
@@ -5,14 +5,14 @@ use xt::kwalitee::Test;
 Test::More::plan skip_all => "This test doesn't work well under Windows" if $^O eq 'MSWin32';
 
 xt::kwalitee::Test::run(
-  ['C/CM/CMORRIS/Parse-Extract-Net-MAC48-0.01.tar.gz', 0], # 3094
-  ['B/BR/BRUMLEVE/autobless-1.0.1.tar.gz', 0], # 3318
-  ['B/BR/BRUMLEVE/wildproto-1.0.1.tar.gz', 0], # 3617
-  ['B/BR/BRUMLEVE/vm-1.0.1.tar.gz', 0], # 4236
-  ['C/CR/CRUSOE/Template-Plugin-Filter-ANSIColor-0.0.3.tar.gz', 0], # 4963
-  ['G/GS/GSLONDON/Devel-AutoProfiler-1.200.tar.gz', 0], # 6139
-  ['P/PH/PHAM/Business-Stripe-0.04.tar.gz', 0], # 6412
-  ['G/GA/GAVINC/Config-Directory-0.05.tar.gz', 0], # 8774
-  ['N/NE/NETVARUN/Net-Semantics3-0.10.tar.gz', 0], # 8930
-  ['G/GA/GAVINC/File-DirCompare-0.7.tar.gz', 0], # 9018
+  ['CMORRIS/Parse-Extract-Net-MAC48-0.01.tar.gz', 0], # 3094
+  ['BRUMLEVE/autobless-1.0.1.tar.gz', 0], # 3318
+  ['BRUMLEVE/wildproto-1.0.1.tar.gz', 0], # 3617
+  ['BRUMLEVE/vm-1.0.1.tar.gz', 0], # 4236
+  ['CRUSOE/Template-Plugin-Filter-ANSIColor-0.0.3.tar.gz', 0], # 4963
+  ['GSLONDON/Devel-AutoProfiler-1.200.tar.gz', 0], # 6139
+  ['PHAM/Business-Stripe-0.04.tar.gz', 0], # 6412
+  ['GAVINC/Config-Directory-0.05.tar.gz', 0], # 8774
+  ['NETVARUN/Net-Semantics3-0.10.tar.gz', 0], # 8930
+  ['GAVINC/File-DirCompare-0.7.tar.gz', 0], # 9018
 );
@@ -4,20 +4,20 @@ use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
   # pm files not in the lib/base dir
-  ['N/NI/NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907 (Google/TTS.pm)
+  ['NIELSD/Speech-Google-0.5.tar.gz', 0], # 2907 (Google/TTS.pm)
 
   # didn't extract nicely (dot underscore files)
-  ['A/AQ/AQUILINA/WWW-LaQuinta-Returns-0.02.tar.gz', 0], # 4055
+  ['AQUILINA/WWW-LaQuinta-Returns-0.02.tar.gz', 0], # 4055
 
   # multiple pm files in the basedir
-  ['D/DG/DGRAHAM/simpleXMLParse/simplexmlparse_v1.4.tar.gz', 0], # 4336
+  ['DGRAHAM/simpleXMLParse/simplexmlparse_v1.4.tar.gz', 0], # 4336
 
   # no modules
-  ['L/LA/LAWSONK/Gtk2-Ex-MPlayerEmbed-0.03.tar.gz', 1], # 465
-  ['W/WO/WOLDRICH/App-epic-0.014.tar.gz', 1], # 812
-  ['T/TA/TAG/AnyEvent-Peer39-0.32.tar.gz', 1], # 824
-  ['C/CA/CASIANO/Git-Export-0.04.tar.gz', 1], # 2593
-  ['M/MI/MILOVIDOV/APP-Yatranslate-0.02.tar.gz', 1], # 3773
-  ['D/DB/DBR/pdoc-0.900.tar.gz', 1], # 3876
-  ['M/MU/MUIR/modules/rinetd.pl-1.2.tar.gz', 1], # 4319
+  ['LAWSONK/Gtk2-Ex-MPlayerEmbed-0.03.tar.gz', 1], # 465
+  ['WOLDRICH/App-epic-0.014.tar.gz', 1], # 812
+  ['TAG/AnyEvent-Peer39-0.32.tar.gz', 1], # 824
+  ['CASIANO/Git-Export-0.04.tar.gz', 1], # 2593
+  ['MILOVIDOV/APP-Yatranslate-0.02.tar.gz', 1], # 3773
+  ['DBR/pdoc-0.900.tar.gz', 1], # 3876
+  ['MUIR/modules/rinetd.pl-1.2.tar.gz', 1], # 4319
 );
@@ -3,19 +3,24 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['T/TO/TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
-  ['T/TO/TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
-  ['S/SC/SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['T/TX/TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
-  ['A/AN/ANANSI/Anansi-ObjectManager-0.06.tar.gz', 0], # 5246
-  ['M/MA/MARCEL/Web-Library-0.01.tar.gz', 0], # 7345
-  ['P/PJ/PJB/Speech-Speakup-1.04.tar.gz', 0], # 7410
-  ['T/TE/TEMPIRE/Eponymous-Hash-0.01.tar.gz', 0], # 8503
-  ['S/SU/SULLR/Net-SSLGlue-1.03.tar.gz', 0], # 8720
+  ['TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
+  ['TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
+  ['SCILLEY/POE/Component/IRC/Plugin/IRCDHelp-0.02.tar.gz', 0], # 3243
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
+  ['ANANSI/Anansi-ObjectManager-0.06.tar.gz', 0], # 5246
+  ['MARCEL/Web-Library-0.01.tar.gz', 0], # 7345
+  ['PJB/Speech-Speakup-1.04.tar.gz', 0], # 7410
+  ['TEMPIRE/Eponymous-Hash-0.01.tar.gz', 0], # 8503
+  ['SULLR/Net-SSLGlue-1.03.tar.gz', 0], # 8720
 
   # use 5.012 and higher
-  ['Z/ZD/ZDM/Pharaoh-BootStrap-3.00.tar.gz', 1], # use 5.12.0
-  ['M/MA/MALLEN/Acme-Github-Test-0.03.tar.gz', 1] # use 5.014
+  ['ZDM/Pharaoh-BootStrap-3.00.tar.gz', 1], # use 5.12.0
+  ['MALLEN/Acme-Github-Test-0.03.tar.gz', 1], # use 5.014
 
+  # no .pm files
+  ['RCLAMP/cvn-0.02.tar.gz', 1],
+
+  # .pod without package declaration
+  ['ETHER/Moose-2.1209.tar.gz', 1],
 );
@@ -3,14 +3,20 @@ use warnings;
 use xt::kwalitee::Test;
 
 xt::kwalitee::Test::run(
-  ['T/TO/TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
-  ['T/TO/TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
-  ['B/BO/BOOK/Acme-MetaSyntactic-errno-1.003.tar.gz', 0], # 2889
-  ['A/AN/ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
-  ['T/TX/TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
-  ['L/LT/LTP/Game-Life-0.05.tar.gz', 0], # 6535
-  ['P/PJ/PJB/Speech-Speakup-1.04.tar.gz', 0], # 7410
-  ['J/JB/JBAZIK/Archive-Ar-1.15.tar.gz', 0], # 7983
-  ['S/SU/SULLR/Net-SSLGlue-1.03.tar.gz', 0], # 8720
-  ['S/SH/SHARYANTO/Term-ProgressBar-Color-0.00.tar.gz', 0], # 9746
+  ['TOBYINK/Platform-Windows-0.002.tar.gz', 0], # 2206
+  ['TOBYINK/Platform-Unix-0.002.tar.gz', 0], # 2264
+  ['BOOK/Acme-MetaSyntactic-errno-1.003.tar.gz', 0], # 2889
+  ['ANANSI/Anansi-Library-0.02.tar.gz', 0], # 3365
+  ['TXH/Template-Plugin-Filter-MinifyHTML-0.02.tar.gz', 0], # 3484
+  ['LTP/Game-Life-0.05.tar.gz', 0], # 6535
+  ['PJB/Speech-Speakup-1.04.tar.gz', 0], # 7410
+  ['JBAZIK/Archive-Ar-1.15.tar.gz', 0], # 7983
+  ['SULLR/Net-SSLGlue-1.03.tar.gz', 0], # 8720
+  ['SHARYANTO/Term-ProgressBar-Color-0.00.tar.gz', 0], # 9746
+
+  # no .pm files
+  ['RCLAMP/cvn-0.02.tar.gz', 1],
+
+  # .pod without package declaration
+  ['ETHER/Moose-2.1209.tar.gz', 1],
 );
@@ -43,6 +43,7 @@ for my $module (@Module::CPANTS::Kwalitee::Uses::STRICT_EQUIV) {
 }
 
 for my $module (@Module::CPANTS::Kwalitee::Uses::WARNINGS_EQUIV) {
+  next if $module eq 'warnings::compat';
   my $res = test($module);
   unless ($res) {
     note "SKIP $module";