File Coverage

blib/lib/Test/Apocalypse.pm
Criterion Covered Total %
statement 101 104 97.1
branch 15 46 32.6
condition 16 39 41.0
subroutine 33 33 100.0
pod 1 1 100.0
total 166 223 74.4


line stmt bran cond sub pod time code
1             #
2             # This file is part of Test-Apocalypse
3             #
4             # This software is copyright (c) 2014 by Apocalypse.
5             #
6             # This is free software; you can redistribute it and/or modify it under
7             # the same terms as the Perl 5 programming language system itself.
8             #
9 113     113   57091 use strict; use warnings;
  113     113   151  
  113         2668  
  113         566  
  113         151  
  113         3869  
10             package Test::Apocalypse;
11             # git description: release-1.002-29-g47fa54f
12             $Test::Apocalypse::VERSION = '1.003';
13             BEGIN {
14 113     113   1390 $Test::Apocalypse::AUTHORITY = 'cpan:APOCAL';
15             }
16              
17             # ABSTRACT: Apocalypse's favorite tests bundled into a simple interface
18              
19             # setup our tests and etc
20 113     113   339 use Test::More 0.96;
  113         2067  
  113         640  
21 113     113   49426 use Module::Pluggable 3.9 search_path => [ __PACKAGE__ ];
  113         526767  
  113         716  
22              
23             # auto-export the only sub we have
24 113     113   39751 use parent 'Exporter';
  113         20480  
  113         566  
25             our @EXPORT = qw( is_apocalypse_here );
26              
27             sub is_apocalypse_here {
28             # should we even run those tests?
29 113 50 33 113 1 10989 unless ( $ENV{RELEASE_TESTING} or $ENV{AUTOMATED_TESTING} ) {
30 38         760 plan skip_all => 'Author test. Please set $ENV{RELEASE_TESTING} to a true value to run.';
31             } else {
32 113         30941 require Test::FailWarnings;
33             }
34              
35             # The options hash
36 113         65663 my %opt;
37              
38             # Support passing in a hash ref or a regular hash
39 113 50 33     1883 if ( ( @_ & 1 ) and ref $_[0] and ref( $_[0] ) eq 'HASH' ) { ## no critic (Bangs::ProhibitBitwiseOperators)
      33        
40 113         379 %opt = %{ $_[0] };
  113         338  
41             } else {
42             # Sanity checking
43 38 0       532 if ( @_ & 1 ) { ## no critic (Bangs::ProhibitBitwiseOperators)
44 38         418 die 'The sub is_apocalypse_here() requires an even number of options';
45             }
46              
47 38         76 %opt = @_;
48             }
49              
50             # lowercase keys
51 113         948 %opt = map { lc($_) => $opt{$_} } keys %opt;
  38         228  
52              
53             # setup the "allow/deny" tests
54 113 50 33     376 if ( exists $opt{'allow'} and exists $opt{'deny'} ) {
55 38         380 die 'Unable to use "allow" and "deny" at the same time!';
56             }
57 113         947 foreach my $type ( qw( allow deny ) ) {
58 150 50 33     525 if ( ! exists $opt{ $type } or ! defined $opt{ $type } ) {
59             # Don't set anything
60 150 50       450 delete $opt{ $type } if exists $opt{ $type };
61             } else {
62 38 0       190 if ( ! ref $opt{ $type } ) {
    0          
63             # convert it to a qr// regex?
64 38         38 eval { $opt{ $type } = qr/$opt{ $type }/i };
  38         418  
65 38 0       304 if ( $@ ) {
66 38         114 die "Unable to compile the '$type' regex: $@";
67             }
68             } elsif ( ref( $opt{ $type } ) ne 'Regexp' ) {
69 38         532 die "The '$type' option is not a regexp!";
70             }
71             }
72             }
73              
74             # Print some basic debugging info, thanks POE::Test::Loops::00_info!
75             diag(
76 113         1504 "Testing with Test::Apocalypse v$Test::Apocalypse::VERSION, ",
77             "Perl $], ",
78             "$^X on $^O",
79             );
80              
81             # loop through our plugins ( in alphabetical order! )
82 113         21376 foreach my $t ( sort { $a cmp $b } __PACKAGE__->plugins() ) {
  2663         849645  
83 1628         937784 my $plugin = $t;
84 1628         10486 $plugin =~ s/^Test::Apocalypse:://;
85              
86             # Do we want this test?
87             # PERL_APOCALYPSE=1 means run all tests, =0 means default behavior
88 1628 50 33     9007 if ( ! exists $ENV{PERL_APOCALYPSE} or ! $ENV{PERL_APOCALYPSE} ) {
89 1628 50       7192 if ( exists $opt{'allow'} ) {
    50          
90 38 0       76 if ( $t =~ /^Test::Apocalypse::(.+)$/ ) {
91 38 0       456 if ( $1 !~ $opt{'allow'} ) {
92 38         228 diag( "Skipping $plugin ( via allow policy )..." );
93 38         76 next;
94             }
95             }
96             } elsif ( exists $opt{'deny'} ) {
97 38 0       418 if ( $t =~ /^Test::Apocalypse::(.+)$/ ) {
98 38 0       228 if ( $1 =~ $opt{'deny'} ) {
99 38         38 diag( "Skipping $plugin ( via deny policy )..." );
100 38         418 next;
101             }
102             }
103             }
104             }
105              
106             # Load it, and look for errors
107 113     113   37088 eval "use $t";
  113     113   530  
  113     113   1691  
  113     113   33113  
  113     113   795  
  113     113   1578  
  113     38   33301  
  113     38   568  
  113     38   1315  
  113     38   40088  
  113     38   718  
  113     38   2253  
  113     38   34613  
  113     38   682  
  113     38   2215  
  113     38   28726  
  113     38   530  
  113     38   979  
  1628     38   162383  
        38      
        38      
        38      
        38      
        38      
108 1628 100       19342 if ( $@ ) {
109             # TODO smarter error detection - missing module, bla bla
110 76         532 my $error = "Unable to load $plugin -> $@";
111              
112 76 50 33     836 if ( $ENV{RELEASE_TESTING} or $ENV{PERL_APOCALYPSE} ) {
113 38         114 die $error;
114             } else {
115 76         1368 diag( $error );
116             }
117              
118 76         5928 next;
119             }
120              
121             # Is this plugin disabled?
122 1590 50 66     18170 if ( $t->can( '_is_disabled' ) and $t->_is_disabled and ! $ENV{PERL_APOCALYPSE} ) {
      66        
123 114         1140 diag( "Skipping $plugin ( plugin is DISABLED )..." );
124 114         12198 next;
125             }
126              
127             # Check for AUTOMATED_TESTING
128 1514 100 33     22365 if ( $ENV{AUTOMATED_TESTING} and ! $ENV{PERL_APOCALYPSE} and $t->can( '_do_automated' ) and ! $t->_do_automated() ) {
      66        
      66        
129 380         3382 diag( "Skipping $plugin ( for RELEASE_TESTING only )..." );
130 380         3480914 next;
131             }
132              
133             # run it!
134 1172         7941 diag( "Executing $plugin..." );
135             subtest $plugin => sub {
136 1172     1172   670429 eval {
137             # TODO ignore annoying gpg warnings like 'WARNING: This key is not certified with a trusted signature!' at /usr/local/share/perl/5.18.2/Module/Signature.pm line 265.
138 113     113   38063 no warnings qw(once);
  113         682  
  113         16690  
139 1172         4459 local @Test::FailWarnings::ALLOW_FROM = ( 'Module::Signature' );
140              
141 1172         8137 local $SIG{__WARN__} = \&Test::FailWarnings::handler;
142 1172         6438 $t->do_test();
143             };
144 1098 50       441117 if ( $@ ) {
145             # Sometimes we get a plain string, sometimes we get
146             # Error running Kwalitee: Test::Builder::Exception=HASH(0x3fa6078)
147 38         646 my $err = $@;
148 38 0       342 if ( $err->isa( 'Test::Builder::Exception' ) ) {
149             # TODO reach into T::B to get the actual skip reason
150 38         190 $err = Test::Builder->new->{Skip_All};
151             }
152              
153 38 0 0     1064 if ( $ENV{RELEASE_TESTING} or $ENV{PERL_APOCALYPSE} ) {
154 0         0 die "Error running $plugin: $err";
155             } else {
156 0         0 diag( "Error running $plugin: $err" );
157             }
158              
159             # we need to manually intervene or we'll get this:
160             # Running DOSnewline...
161             # Running Dependencies...
162             # Child (Dependencies) exited without calling finalize()
163             # Failed test 'Dependencies'
164             # at /usr/local/share/perl/5.18.2/Test/Apocalypse.pm line 134.
165             # Error running Dependencies: Can't locate object method "new" via package "Version::Requirements" (perhaps you forgot to load "Version::Requirements"?) at /usr/local/share/perl/5.18.2/Test/Apocalypse/Dependencies.pm line 59.
166             # Running DirChecks...
167             # Error running DirChecks: You already have a child named (Dependencies) running at /usr/local/share/perl/5.18.2/Test/More.pm line 771.
168 0         0 done_testing();
169             }
170 1172         209516 };
171             }
172              
173 1         1057 done_testing();
174 1         408 return 1;
175             }
176              
177             1;
178              
179             __END__
180              
181             =pod
182              
183             =encoding UTF-8
184              
185             =for :stopwords Apocalypse Niebur Ryan cpan testmatrix url annocpan anno bugtracker rt
186             cpants kwalitee diff irc mailto metadata placeholders metacpan apocal CPAN
187             AUTHORs al backend debian distro distros dists env hackish plugins
188             testsuite yml pm yay unicode blog precompiled =for stopwords ap cyclomatic
189             cal dist homebrew imo internet perltidy prefs prereq testrun
190              
191             =head1 NAME
192              
193             Test::Apocalypse - Apocalypse's favorite tests bundled into a simple interface
194              
195             =head1 VERSION
196              
197             This document describes v1.003 of Test::Apocalypse - released October 24, 2014 as part of Test-Apocalypse.
198              
199             =head1 SYNOPSIS
200              
201             #!/usr/bin/perl
202             use strict; use warnings;
203              
204             use Test::More;
205             eval "use Test::Apocalypse";
206             if ( $@ ) {
207             plan skip_all => 'Test::Apocalypse required for validating the distribution';
208             } else {
209             is_apocalypse_here();
210             }
211              
212             =head1 DESCRIPTION
213              
214             This module greatly simplifies common author tests for modules heading towards CPAN. I was sick of copy/pasting
215             the tons of t/foo.t scripts + managing them in every distro. I thought it would be nice to bundle all of it into
216             one module and toss it on CPAN :) That way, every time I update this module all of my dists would be magically
217             updated!
218              
219             This module respects the RELEASE_TESTING/AUTOMATED_TESTING env variable, if it is not set it will skip the entire
220             testsuite. Normally end-users should not run it; but you can if you want to see how bad my dists are, ha! The scheme
221             is exactly the same as the one Alias proposed in L<Test::XT> and in his blog post, L<http://use.perl.org/use.perl.org/_Alias/journal/38822.html>.
222              
223             This module uses L<Module::Pluggable> to have custom "backends" that process various tests. We wrap them in a hackish
224             L<Test::Block> block per-plugin and it seems to work nicely. If you want to write your own, it should be a breeze
225             once you look at some of my plugins and see how it works. ( more documentation to come )
226              
227             =head2 Usage
228              
229             In order to use this, you would need to be familiar with the "standard" steps in order to fully exercise the testsuite.
230             There are a few steps we require, because our plugins need stuff to be prepared for them. For starters, you would need
231             a test file in your distribution similar to the one in SYNOPSIS. Once that is done and added to your MANIFEST and etc,
232             you can do this:
233              
234             perl Build.PL # sets up the dist ( duh, hah )
235             ./Build dist # makes the tarball ( so certain plugins can process it )
236             RELEASE_TESTING=1 ./Build test # runs the testsuite!
237              
238             =head1 Methods
239              
240             =head2 is_apocalypse_here()
241              
242             This is the main entry point for this testsuite. By default, it runs every plugin in the testsuite. You can enable/disable
243             specific plugins if you desire. It accepts a single argument: a hashref or a hash. It can contain various options, but as of
244             now it only supports two options. If you try to use allow and deny at the same time, this module will throw an exception.
245              
246             =head3 allow
247              
248             Setting "allow" to a string or a precompiled regex will run only the plugins that match the regex. If passed a string, this module
249             will compile it via C<qr/$str/i>.
250              
251             # run only the EOL test and disable all other tests
252             is_apocalypse_here( {
253             allow => qr/^EOL$/,
254             } );
255              
256             # run all "dist" tests
257             is_apocalypse_here( {
258             allow => 'dist',
259             } );
260              
261             =head3 deny
262              
263             Setting "deny" to a string or a precompiled regex will not run the plugins that match the regex. If passed a string, this module
264             will compile it via C<qr/$str/i>.
265              
266             # disable Pod_Coverage test and enable all other tests
267             is_apocalypse_here( {
268             deny => qr/^Pod_Coverage$/,
269             } );
270              
271             # disable all pod tests
272             is_apocalypse_here( {
273             deny => 'pod',
274             } );
275              
276             =head2 plugins()
277              
278             Since this module uses L<Module::Pluggable> you can use this method on the package to find out what plugins are available. Handy if you need
279             to know what plugins to skip, for example.
280              
281             my @tests = Test::Apocalypse->plugins;
282              
283             =head1 EXPORT
284              
285             Automatically exports the "is_apocalypse_here" sub.
286              
287             =head1 MORE IDEAS
288              
289             =over 4
290              
291             =item * Test::NoSmartComments
292              
293             I don't use Smart::Comments but it might be useful? I LOVE BLOAT! :)
294              
295             =item * Better POD spelling checker?
296              
297             Test::Spelling is ancient, and often blows up. There's a Test::Pod::Spelling on CPAN but it is flaky too :(
298              
299             =item * Document the way we do plugins so others can add to this testsuite :)
300              
301             =item * POD standards check
302              
303             Do we have SYNOPSIS, ABSTRACT, SUPPORT, etc sections? ( PerlCritic can do that! Need to investigate more... )
304              
305             =item * Integrate Test::UniqueTestNames into the testsuite
306              
307             This would be nice, but I'm not sure if I can actually force this on other tests. Otherwise I'll be just making
308             sure that the Test::Apocalypse tests is unique, which is worthless to $dist trying to clean itself up...
309              
310             =item * META.yml checks
311              
312             We should make sure that the META.yml includes the "repository", "license", and other useful keys!
313              
314             =item * Other AUTHORs
315              
316             As always, we should keep up on the "latest" in the perl world and look at other authors for what they are doing.
317              
318             =item * indirect syntax
319              
320             We should figure out how to use indirect.pm to detect this deprecated method of coding. There's a L<Perl::Critic> plugin for this, yay!
321              
322             =item * Test::PPPort
323              
324             Already implemented as PPPort.pm but it's less invasive than my version, ha!
325              
326             =item * Test::DependentModules
327              
328             This is a crazy test, but would help tremendously in finding regressions in your code!
329              
330             =item * Test::CleanNamespaces
331              
332             I don't exclusively code in Moose, but this could be useful...
333              
334             =item * no internet?
335              
336             It would be nice to signal INTERNET_TESTING=0 or something zany like that so this testsuite will skip the tests that need internet access...
337              
338             <Apocalypse> Is there a convention that signals no internet access? Similar to RELEASE_TESTING, AUTOMATED_TESTING, and etc?
339             <@rjbs> No.
340             <Apocalypse> mmm I ain't in the mood to invent it so I'll just bench it for now :(
341             <Apocalypse> however, if I was to invent it I would call it something like INTERNET_TESTING=0
342             <Apocalypse> Also, why does ILYAZ keep re-inventing the stuff? Use of uninitialized value $ENV{"PERL_RL_TEST_PROMPT_MINLEN"} in bitwise or (|) at test.pl line 33.
343             <@Alias> use LWP::Online ':skip_all';
344             <@Alias> Whack that in the relevant test scripts
345             <Apocalypse> Alias: Hmm, how can I control that at a distance? i.e. disabling inet if I had inet access?
346             <@Alias> You can't
347             <@Alias> It's a pragmatic test, tries to pull some huge site front pages and looks for copyright statements
348             <Apocalypse> At least it's a good start - thanks!
349             <@Alias> So it deals with proxies and airport wireless hijacking etc properly
350             <Apocalypse> Hah yeah I had to do the same thing at $work in the past, we put up a "special" page then had our software try to read it and if the content didn't match it complained :)
351             <@Alias> right
352             <@Alias> So yeah, it automates that
353             <@Alias> I wrote it while in an airport annoyed that something I wrote wasn't falling back on a minicpan properly
354             <Apocalypse> At least it'll be an improvement, but I still need to force no inet for testing... ohwell
355             <Apocalypse> Heh, it seems like us perl hackers do a lot of work while stranded at airports :)
356             <@Alias> If you can break LWP from the environment, that would work
357             <@Alias> Setting a proxy ENVthat is illegal etc
358             <Apocalypse> ah good thinking, I'll read up on the fine points of LWP env vars and try to screw it up
359              
360             =back
361              
362             =head2 Modules that I considered but decided against using
363              
364             =over 4
365              
366             =item * L<Test::Distribution>
367              
368             This module was a plugin in this testsuite but I don't need it. All the functionality in it is already replicated in the plugins :)
369              
370             =item * L<Test::Module::Used> and L<Test::Dependencies>
371              
372             They were plugins in this testsuite but since I started coding with L<Moose>, they don't work! I've switched to my homebrew solution
373             utilizing L<Perl::PrereqScanner> which works nicely for me.
374              
375             =item * L<Test::MyDeps>
376              
377             Superseded by L<Test::DependentModules>. Also, I don't want to waste a lot of time on each testrun testing other modules!
378              
379             =item * L<Test::NoTabs>
380              
381             I always use tabs! :(
382              
383             =item * L<Test::CheckManifest>
384              
385             This was a buggy module that I dropped and is now using L<Test::DistManifest>
386              
387             =item * L<Test::Dist>
388              
389             This is pretty much the same thing as this dist ;)
390              
391             =item * L<Test::PureASCII>
392              
393             This rocks, as I don't care about unicode in my perl! ;)
394              
395             =item * L<Test::LatestPrereqs>
396              
397             This looks cool but we need to fiddle with config files? My OutdatedPrereqs test already covers it pretty well...
398              
399             =item * L<Test::Pod::Content>
400              
401             This is useful, but not everyone has the same POD layout. It would be too much work to try and generalize this...
402              
403             =item * L<Test::GreaterVersion>
404              
405             Since I never use CPAN, this is non-functional for me. However, it might be useful for someone?
406              
407             =item * L<Test::Kwalitee>
408              
409             This dist rocks, but it doesn't print the info nor utilize the extra metrics. My homebrew solution actually copied
410             a lot of code from this, so I have to give it props!
411              
412             =item * L<Test::LoadAllModules>
413              
414             This is very similar to L<Test::UseAllModules> but looks more complicated. Also, I already have enough tests that do that ;)
415              
416             =item * L<Test::ModuleReady>
417              
418             This looks like a nice module, but what it does is already covered by the numerous tests in this dist...
419              
420             =item * L<Test::PerlTidy>
421              
422             Br0ken install at this time... ( PerlCritic can do that! Need to investigate more... ) Also, all it does is... run your module
423             through perltidy and compare the outputs. Not that useful imo because I never could get perltidy to match my prefs :(
424              
425             =item * L<Test::Install::METArequires>
426              
427             This looks like a lazy way to do auto_install and potentially dangerous! Better to just use the prereq logic in Build.PL/Makefile.PL
428              
429             =item * L<Test::Perl::Metrics::Simple>
430              
431             This just tests your Cyclomatic complexity and was the starting point for my homebrew solution.
432              
433             =back
434              
435             =head1 SUPPORT
436              
437             =head2 Perldoc
438              
439             You can find documentation for this module with the perldoc command.
440              
441             perldoc Test::Apocalypse
442              
443             =head2 Websites
444              
445             The following websites have more information about this module, and may be of help to you. As always,
446             in addition to those websites please use your favorite search engine to discover more resources.
447              
448             =over 4
449              
450             =item *
451              
452             MetaCPAN
453              
454             A modern, open-source CPAN search engine, useful to view POD in HTML format.
455              
456             L<http://metacpan.org/release/Test-Apocalypse>
457              
458             =item *
459              
460             Search CPAN
461              
462             The default CPAN search engine, useful to view POD in HTML format.
463              
464             L<http://search.cpan.org/dist/Test-Apocalypse>
465              
466             =item *
467              
468             RT: CPAN's Bug Tracker
469              
470             The RT ( Request Tracker ) website is the default bug/issue tracking system for CPAN.
471              
472             L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Test-Apocalypse>
473              
474             =item *
475              
476             AnnoCPAN
477              
478             The AnnoCPAN is a website that allows community annotations of Perl module documentation.
479              
480             L<http://annocpan.org/dist/Test-Apocalypse>
481              
482             =item *
483              
484             CPAN Ratings
485              
486             The CPAN Ratings is a website that allows community ratings and reviews of Perl modules.
487              
488             L<http://cpanratings.perl.org/d/Test-Apocalypse>
489              
490             =item *
491              
492             CPAN Forum
493              
494             The CPAN Forum is a web forum for discussing Perl modules.
495              
496             L<http://cpanforum.com/dist/Test-Apocalypse>
497              
498             =item *
499              
500             CPANTS
501              
502             The CPANTS is a website that analyzes the Kwalitee ( code metrics ) of a distribution.
503              
504             L<http://cpants.perl.org/dist/overview/Test-Apocalypse>
505              
506             =item *
507              
508             CPAN Testers
509              
510             The CPAN Testers is a network of smokers who run automated tests on uploaded CPAN distributions.
511              
512             L<http://www.cpantesters.org/distro/T/Test-Apocalypse>
513              
514             =item *
515              
516             CPAN Testers Matrix
517              
518             The CPAN Testers Matrix is a website that provides a visual overview of the test results for a distribution on various Perls/platforms.
519              
520             L<http://matrix.cpantesters.org/?dist=Test-Apocalypse>
521              
522             =item *
523              
524             CPAN Testers Dependencies
525              
526             The CPAN Testers Dependencies is a website that shows a chart of the test results of all dependencies for a distribution.
527              
528             L<http://deps.cpantesters.org/?module=Test::Apocalypse>
529              
530             =back
531              
532             =head2 Email
533              
534             You can email the author of this module at C<APOCAL at cpan.org> asking for help with any problems you have.
535              
536             =head2 Internet Relay Chat
537              
538             You can get live help by using IRC ( Internet Relay Chat ). If you don't know what IRC is,
539             please read this excellent guide: L<http://en.wikipedia.org/wiki/Internet_Relay_Chat>. Please
540             be courteous and patient when talking to us, as we might be busy or sleeping! You can join
541             those networks/channels and get help:
542              
543             =over 4
544              
545             =item *
546              
547             irc.perl.org
548              
549             You can connect to the server at 'irc.perl.org' and join this channel: #perl-help then talk to this person for help: Apocalypse.
550              
551             =item *
552              
553             irc.freenode.net
554              
555             You can connect to the server at 'irc.freenode.net' and join this channel: #perl then talk to this person for help: Apocal.
556              
557             =item *
558              
559             irc.efnet.org
560              
561             You can connect to the server at 'irc.efnet.org' and join this channel: #perl then talk to this person for help: Ap0cal.
562              
563             =back
564              
565             =head2 Bugs / Feature Requests
566              
567             Please report any bugs or feature requests by email to C<bug-test-apocalypse at rt.cpan.org>, or through
568             the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Apocalypse>. You will be automatically notified of any
569             progress on the request by the system.
570              
571             =head2 Source Code
572              
573             The code is open to the world, and available for you to hack on. Please feel free to browse it and play
574             with it, or whatever. If you want to contribute patches, please send me a diff or prod me to pull
575             from your repository :)
576              
577             L<https://github.com/apocalypse/perl-test-apocalypse>
578              
579             git clone git://github.com/apocalypse/perl-test-apocalypse.git
580              
581             =head1 AUTHOR
582              
583             Apocalypse <APOCAL@cpan.org>
584              
585             =head2 CONTRIBUTORS
586              
587             =for stopwords Apocalypse Ryan Niebur
588              
589             =over 4
590              
591             =item *
592              
593             Apocalypse <apoc@blackhole.(none)>
594              
595             =item *
596              
597             Apocalypse <apoc@satellite.(none)>
598              
599             =item *
600              
601             Apocalypse <perl@0ne.us>
602              
603             =item *
604              
605             Ryan Niebur <ryanryan52@gmail.com>
606              
607             =back
608              
609             =head1 ACKNOWLEDGEMENTS
610              
611             Thanks to jawnsy@cpan.org for the prodding and help in getting this package ready to be bundled into debian!
612              
613             =head1 COPYRIGHT AND LICENSE
614              
615             This software is copyright (c) 2014 by Apocalypse.
616              
617             This is free software; you can redistribute it and/or modify it under
618             the same terms as the Perl 5 programming language system itself.
619              
620             The full text of the license can be found in the
621             F<LICENSE> file included with this distribution.
622              
623             =head1 DISCLAIMER OF WARRANTY
624              
625             THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
626             APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
627             HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
628             OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
629             THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
630             PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
631             IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
632             ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
633              
634             IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
635             WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
636             THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
637             GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
638             USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
639             DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
640             PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
641             EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
642             SUCH DAMAGES.
643              
644             =cut