1 # -*- Mode: cperl; cperl-indent-level: 4 -*-
6 use Test::Harness::Straps;
7 use Test::Harness::Assert;
15 @ISA @EXPORT @EXPORT_OK
16 $Verbose $Switches $Debug
17 $verbose $switches $debug
26 Test::Harness - Run Perl standard test scripts with statistics
36 # Backwards compatibility for exportable variable names.
38 *switches = *Switches;
41 $ENV{HARNESS_ACTIVE} = 1;
42 $ENV{HARNESS_VERSION} = $VERSION;
46 delete $ENV{HARNESS_ACTIVE};
47 delete $ENV{HARNESS_VERSION};
50 # Some experimental versions of OS/2 build have broken $?
51 my $Ignore_Exitcode = $ENV{HARNESS_IGNORE_EXITCODE};
53 my $Files_In_Dir = $ENV{HARNESS_FILELEAK_IN_DIR};
55 $Strap = Test::Harness::Straps->new;
57 sub strap { return $Strap };
60 @EXPORT = qw(&runtests);
61 @EXPORT_OK = qw($verbose $switches);
63 $Verbose = $ENV{HARNESS_VERBOSE} || 0;
64 $Debug = $ENV{HARNESS_DEBUG} || 0;
66 $Columns = $ENV{HARNESS_COLUMNS} || $ENV{COLUMNS} || 80;
67 $Columns--; # Some shells have trouble with a full line of text.
73 runtests(@test_files);
77 B<STOP!> If all you want to do is write a test script, consider
78 using Test::Simple. Test::Harness is the module that reads the
79 output from Test::Simple, Test::More and other modules based on
80 Test::Builder. You don't need to know about Test::Harness to use
83 Test::Harness runs tests and expects output from the test in a
84 certain format. That format is called TAP, the Test Anything
85 Protocol. It is defined in L<Test::Harness::TAP>.
87 C<Test::Harness::runtests(@tests)> runs all the testscripts named
88 as arguments and checks standard output for the expected strings
91 The F<prove> utility is a thin wrapper around Test::Harness.
95 Test::Harness will honor the C<-T> or C<-t> in the #! line on your
96 test files. So if you begin a test with:
100 the test will be run with taint mode on.
102 =head2 Configuration variables.
104 These variables can be used to configure the behavior of
105 Test::Harness. They are exported on request.
109 =item C<$Test::Harness::Verbose>
111 The package variable C<$Test::Harness::Verbose> is exportable and can be
112 used to let C<runtests()> display the standard output of the script
113 without altering the behavior otherwise. The F<prove> utility's C<-v>
116 =item C<$Test::Harness::switches>
118 The package variable C<$Test::Harness::switches> is exportable and can be
119 used to set perl command line options used for running the test
120 script(s). The default value is C<-w>. It overrides C<HARNESS_SWITCHES>.
127 When tests fail, analyze the summary report:
129 t/base..............ok
130 t/nonumbers.........ok
131 t/ok................ok
132 t/test-harness......ok
133 t/waterloo..........dubious
134 Test returned status 3 (wstat 768, 0x300)
135 DIED. FAILED tests 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
136 Failed 10/20 tests, 50.00% okay
137 Failed Test Stat Wstat Total Fail Failed List of Failed
138 -----------------------------------------------------------------------
139 t/waterloo.t 3 768 20 10 50.00% 1 3 5 7 9 11 13 15 17 19
140 Failed 1/5 test scripts, 80.00% okay. 10/44 subtests failed, 77.27% okay.
142 Everything passed but F<t/waterloo.t>. It failed 10 of 20 tests and
143 exited with non-zero status indicating something dubious happened.
145 The columns in the summary report mean:
151 The test file which failed.
155 If the test exited with non-zero, this is its exit status.
159 The wait status of the test.
163 Total number of tests expected to run.
167 Number which failed, either from "not ok" or because they never ran.
171 Percentage of the total tests which failed.
173 =item B<List of Failed>
175 A list of the tests which failed. Successive failures may be
176 abbreviated (ie. 15-20 to indicate that tests 15, 16, 17, 18, 19 and
184 Test::Harness currently only has one function, here it is.
190 my $allok = runtests(@test_files);
192 This runs all the given I<@test_files> and divines whether they passed
193 or failed based on their output to STDOUT (details above). It prints
194 out each individual test which failed along with a summary report and
195 a how long it all took.
197 It returns true if everything was ok. Otherwise it will C<die()> with
198 one of the messages in the DIAGNOSTICS section.
207 my($tot, $failedtests) = _run_all_tests(@tests);
208 _show_results($tot, $failedtests);
210 my $ok = _all_ok($tot);
212 assert(($ok xor keys %$failedtests),
213 q{ok status jives with $failedtests});
222 my $ok = _all_ok(\%tot);
224 Tells you if this test run is overall successful or not.
231 return $tot->{bad} == 0 && ($tot->{max} || $tot->{skipped}) ? 1 : 0;
236 my @files = _globdir $dir;
238 Returns all the files in a directory. This is shorthand for backwards
239 compatibility on systems where C<glob()> doesn't work right.
245 my @f = readdir DIRH;
251 =item B<_run_all_tests>
253 my($total, $failed) = _run_all_tests(@test_files);
255 Runs all the given C<@test_files> (as C<runtests()>) but does it
256 quietly (no report). $total is a hash ref summary of all the tests
257 run. Its keys and values are this:
259 bonus Number of individual todo tests unexpectedly passed
260 max Number of individual tests ran
261 ok Number of individual tests passed
262 sub_skipped Number of individual tests skipped
263 todo Number of individual todo tests
265 files Number of test files ran
266 good Number of test files passed
267 bad Number of test files failed
268 tests Number of test files originally given
269 skipped Number of test files skipped
271 If C<< $total->{bad} == 0 >> and C<< $total->{max} > 0 >>, you've
272 got a successful test.
274 $failed is a hash ref of all the test scripts which failed. Each key
275 is the name of a test script, each value is another hash representing
276 how that script failed. Its keys are these:
278 name Name of the test which failed
279 estat Script's exit value
280 wstat Script's wait status
281 max Number of individual tests
282 failed Number which failed
283 percent Percentage of tests which failed
284 canon List of tests which failed (as string).
286 C<$failed> should be empty if everything passed.
288 B<NOTE> Currently this function is still noisy. I'm working on it.
292 # Turns on autoflush for the handle passed
294 my $flushy_fh = shift;
295 my $old_fh = select $flushy_fh;
303 _autoflush(\*STDOUT);
304 _autoflush(\*STDERR);
316 tests => scalar @tests,
324 @dir_files = _globdir $Files_In_Dir if defined $Files_In_Dir;
325 my $t_start = new Benchmark;
327 my $width = _leader_width(@tests);
328 foreach my $tfile (@tests) {
329 $Last_ML_Print = 0; # so each test prints at least once
330 my($leader, $ml) = _mk_leader($tfile, $width);
337 $Strap->{_seen_header} = 0;
338 if ( $Test::Harness::Debug ) {
339 print "# Running: ", $Strap->_command_line($tfile), "\n";
341 my %results = $Strap->analyze_file($tfile) or
342 do { warn $Strap->{error}, "\n"; next };
344 # state of the current test.
345 my @failed = grep { !$results{details}[$_-1]{ok} }
346 1..@{$results{details}};
349 'next' => $Strap->{'next'},
350 max => $results{max},
352 bonus => $results{bonus},
353 skipped => $results{skip},
354 skip_reason => $results{skip_reason},
355 skip_all => $Strap->{skip_all},
359 $tot{bonus} += $results{bonus};
360 $tot{max} += $results{max};
361 $tot{ok} += $results{ok};
362 $tot{todo} += $results{todo};
363 $tot{sub_skipped} += $results{skip};
365 my($estatus, $wstatus) = @results{qw(exit wait)};
367 if ($results{passing}) {
368 if ($test{max} and $test{skipped} + $test{bonus}) {
370 push(@msg, "$test{skipped}/$test{max} skipped: $test{skip_reason}")
372 push(@msg, "$test{bonus}/$test{max} unexpectedly succeeded")
374 print "$test{ml}ok\n ".join(', ', @msg)."\n";
375 } elsif ($test{max}) {
376 print "$test{ml}ok\n";
377 } elsif (defined $test{skip_all} and length $test{skip_all}) {
378 print "skipped\n all skipped: $test{skip_all}\n";
381 print "skipped\n all skipped: no reason given\n";
387 # List unrun tests as failures.
388 if ($test{'next'} <= $test{max}) {
389 push @{$test{failed}}, $test{'next'}..$test{max};
391 # List overruns as failures.
393 my $details = $results{details};
394 foreach my $overrun ($test{max}+1..@$details) {
395 next unless ref $details->[$overrun-1];
396 push @{$test{failed}}, $overrun
401 $failedtests{$tfile} = _dubious_return(\%test, \%tot,
403 $failedtests{$tfile}{name} = $tfile;
405 elsif($results{seen}) {
406 if (@{$test{failed}} and $test{max}) {
407 my ($txt, $canon) = _canonfailed($test{max},$test{skipped},
409 print "$test{ml}$txt";
410 $failedtests{$tfile} = { canon => $canon,
412 failed => scalar @{$test{failed}},
414 percent => 100*(scalar @{$test{failed}})/$test{max},
419 print "Don't know which tests failed: got $test{ok} ok, ".
420 "expected $test{max}\n";
421 $failedtests{$tfile} = { canon => '??',
432 print "FAILED before any test output arrived\n";
434 $failedtests{$tfile} = { canon => '??',
445 if (defined $Files_In_Dir) {
446 my @new_dir_files = _globdir $Files_In_Dir;
447 if (@new_dir_files != @dir_files) {
449 @f{@new_dir_files} = (1) x @new_dir_files;
450 delete @f{@dir_files};
451 my @f = sort keys %f;
452 print "LEAKED FILES: @f\n";
453 @dir_files = @new_dir_files;
457 $tot{bench} = timediff(new Benchmark, $t_start);
459 $Strap->_restore_PERL5LIB;
461 return(\%tot, \%failedtests);
466 my($leader, $ml) = _mk_leader($test_file, $width);
468 Generates the 't/foo........' leader for the given C<$test_file> as well
469 as a similar version which will overwrite the current line (by use of
470 \r and such). C<$ml> may be empty if Test::Harness doesn't think you're
473 The C<$width> is the width of the "yada/blah.." string.
478 my($te, $width) = @_;
482 if ($^O eq 'VMS') { $te =~ s/^.*\.t\./\[.t./s; }
483 my $blank = (' ' x 77);
484 my $leader = "$te" . '.' x ($width - length($te));
487 $ml = "\r$blank\r$leader"
488 if -t STDOUT and not $ENV{HARNESS_NOTTY} and not $Verbose;
490 return($leader, $ml);
493 =item B<_leader_width>
495 my($width) = _leader_width(@test_files);
497 Calculates how wide the leader should be based on the length of the
506 my $suf = /\.(\w+)$/ ? $1 : '';
508 my $suflen = length $suf;
509 $maxlen = $len if $len > $maxlen;
510 $maxsuflen = $suflen if $suflen > $maxsuflen;
512 # + 3 : we want three dots between the test name and the "ok"
513 return $maxlen + 3 - $maxsuflen;
518 my($tot, $failedtests) = @_;
521 my $bonusmsg = _bonusmsg($tot);
524 print "All tests successful$bonusmsg.\n";
525 } elsif (!$tot->{tests}){
526 die "FAILED--no tests were run for some reason.\n";
527 } elsif (!$tot->{max}) {
528 my $blurb = $tot->{tests}==1 ? "script" : "scripts";
529 die "FAILED--$tot->{tests} test $blurb could be run, ".
530 "alas--no output ever seen\n";
532 $pct = sprintf("%.2f", $tot->{good} / $tot->{tests} * 100);
533 my $percent_ok = 100*$tot->{ok}/$tot->{max};
534 my $subpct = sprintf " %d/%d subtests failed, %.2f%% okay.",
535 $tot->{max} - $tot->{ok}, $tot->{max},
538 my($fmt_top, $fmt) = _create_fmts($failedtests);
540 # Now write to formats
541 for my $script (sort keys %$failedtests) {
542 $Curtest = $failedtests->{$script};
546 $bonusmsg =~ s/^,\s*//;
547 print "$bonusmsg.\n" if $bonusmsg;
548 die "Failed $tot->{bad}/$tot->{tests} test scripts, $pct% okay.".
553 printf("Files=%d, Tests=%d, %s\n",
554 $tot->{files}, $tot->{max}, timestr($tot->{bench}, 'nop'));
559 header => \&header_handler,
560 test => \&test_handler,
561 bailout => \&bailout_handler,
564 $Strap->{callback} = \&strap_callback;
566 my($self, $line, $type, $totals) = @_;
567 print $line if $Verbose;
569 my $meth = $Handlers{$type};
570 $meth->($self, $line, $type, $totals) if $meth;
575 my($self, $line, $type, $totals) = @_;
577 warn "Test header seen more than once!\n" if $self->{_seen_header};
579 $self->{_seen_header}++;
581 warn "1..M can only appear at the beginning or end of tests\n"
582 if $totals->{seen} &&
583 $totals->{max} < $totals->{seen};
587 my($self, $line, $type, $totals) = @_;
589 my $curr = $totals->{seen};
590 my $next = $self->{'next'};
591 my $max = $totals->{max};
592 my $detail = $totals->{details}[-1];
594 if( $detail->{ok} ) {
595 _print_ml_less("ok $curr/$max");
597 if( $detail->{type} eq 'skip' ) {
598 $totals->{skip_reason} = $detail->{reason}
599 unless defined $totals->{skip_reason};
600 $totals->{skip_reason} = 'various reasons'
601 if $totals->{skip_reason} ne $detail->{reason};
605 _print_ml("NOK $curr");
608 if( $curr > $next ) {
609 print "Test output counter mismatch [test $curr]\n";
611 elsif( $curr < $next ) {
612 print "Confused test output: test $curr answered after ".
613 "test ", $next - 1, "\n";
618 sub bailout_handler {
619 my($self, $line, $type, $totals) = @_;
621 die "FAILED--Further testing stopped" .
622 ($self->{bailout_reason} ? ": $self->{bailout_reason}\n" : ".\n");
627 print join '', $ML, @_ if $ML;
631 # For slow connections, we save lots of bandwidth by printing only once
634 if ( $Last_ML_Print != time ) {
636 $Last_ML_Print = time;
644 $bonusmsg = (" ($tot->{bonus} subtest".($tot->{bonus} > 1 ? 's' : '').
645 " UNEXPECTEDLY SUCCEEDED)")
648 if ($tot->{skipped}) {
649 $bonusmsg .= ", $tot->{skipped} test"
650 . ($tot->{skipped} != 1 ? 's' : '');
651 if ($tot->{sub_skipped}) {
652 $bonusmsg .= " and $tot->{sub_skipped} subtest"
653 . ($tot->{sub_skipped} != 1 ? 's' : '');
655 $bonusmsg .= ' skipped';
657 elsif ($tot->{sub_skipped}) {
658 $bonusmsg .= ", $tot->{sub_skipped} subtest"
659 . ($tot->{sub_skipped} != 1 ? 's' : '')
666 # Test program go boom.
667 sub _dubious_return {
668 my($test, $tot, $estatus, $wstatus) = @_;
669 my ($failed, $canon, $percent) = ('??', '??');
671 printf "$test->{ml}dubious\n\tTest returned status $estatus ".
672 "(wstat %d, 0x%x)\n",
674 print "\t\t(VMS status is $estatus)\n" if $^O eq 'VMS';
679 if ($test->{'next'} == $test->{max} + 1 and not @{$test->{failed}}) {
680 print "\tafter all the subtests completed successfully\n";
682 $failed = 0; # But we do not set $canon!
685 push @{$test->{failed}}, $test->{'next'}..$test->{max};
686 $failed = @{$test->{failed}};
687 (my $txt, $canon) = _canonfailed($test->{max},$test->{skipped},@{$test->{failed}});
688 $percent = 100*(scalar @{$test->{failed}})/$test->{max};
693 return { canon => $canon, max => $test->{max} || '??',
696 estat => $estatus, wstat => $wstatus,
702 my($failedtests) = @_;
704 my $failed_str = "Failed Test";
705 my $middle_str = " Stat Wstat Total Fail Failed ";
706 my $list_str = "List of Failed";
708 # Figure out our longest name string for formatting purposes.
709 my $max_namelen = length($failed_str);
710 foreach my $script (keys %$failedtests) {
711 my $namelen = length $failedtests->{$script}->{name};
712 $max_namelen = $namelen if $namelen > $max_namelen;
715 my $list_len = $Columns - length($middle_str) - $max_namelen;
716 if ($list_len < length($list_str)) {
717 $list_len = length($list_str);
718 $max_namelen = $Columns - length($middle_str) - $list_len;
719 if ($max_namelen < length($failed_str)) {
720 $max_namelen = length($failed_str);
721 $Columns = $max_namelen + length($middle_str) + $list_len;
725 my $fmt_top = "format STDOUT_TOP =\n"
726 . sprintf("%-${max_namelen}s", $failed_str)
732 my $fmt = "format STDOUT =\n"
733 . "@" . "<" x ($max_namelen - 1)
734 . " @>> @>>>> @>>>> @>>> ^##.##% "
735 . "^" . "<" x ($list_len - 1) . "\n"
736 . '{ $Curtest->{name}, $Curtest->{estat},'
737 . ' $Curtest->{wstat}, $Curtest->{max},'
738 . ' $Curtest->{failed}, $Curtest->{percent},'
739 . ' $Curtest->{canon}'
741 . "~~" . " " x ($Columns - $list_len - 2) . "^"
742 . "<" x ($list_len - 1) . "\n"
743 . '$Curtest->{canon}'
751 return($fmt_top, $fmt);
754 sub _canonfailed ($$@) {
755 my($max,$skipped,@failed) = @_;
757 @failed = sort {$a <=> $b} grep !$seen{$_}++, @failed;
758 my $failed = @failed;
762 my $last = $min = shift @failed;
765 for (@failed, $failed[-1]) { # don't forget the last one
766 if ($_ > $last+1 || $_ == $last) {
770 push @canon, "$min-$last";
777 push @result, "FAILED tests @canon\n";
778 $canon = join ' ', @canon;
780 push @result, "FAILED test $last\n";
784 push @result, "\tFailed $failed/$max tests, ";
786 push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay";
788 push @result, "?% okay";
790 my $ender = 's' x ($skipped > 1);
792 my $good = $max - $failed - $skipped;
793 my $skipmsg = " (less $skipped skipped test$ender: $good okay, ";
795 my $goodper = sprintf("%.2f",100*($good/$max));
796 $skipmsg .= "$goodper%)";
800 push @result, $skipmsg;
803 my $txt = join "", @result;
820 C<&runtests> is exported by Test::Harness by default.
822 C<$verbose>, C<$switches> and C<$debug> are exported upon request.
828 =item C<All tests successful.\nFiles=%d, Tests=%d, %s>
830 If all tests are successful some statistics about the performance are
833 =item C<FAILED tests %s\n\tFailed %d/%d tests, %.2f%% okay.>
835 For any single script that has failing subtests statistics like the
838 =item C<Test returned status %d (wstat %d)>
840 Scripts that return a non-zero exit status, both C<$? E<gt>E<gt> 8>
841 and C<$?> are printed in a message similar to the above.
843 =item C<Failed 1 test, %.2f%% okay. %s>
845 =item C<Failed %d/%d tests, %.2f%% okay. %s>
847 If not all tests were successful, the script dies with one of the
850 =item C<FAILED--Further testing stopped: %s>
852 If a single subtest decides that further testing will not make sense,
853 the script dies with this message.
857 =head1 ENVIRONMENT VARIABLES THAT TEST::HARNESS SETS
859 Test::Harness sets these before executing the individual tests.
863 =item C<HARNESS_ACTIVE>
865 This is set to a true value. It allows the tests to determine if they
866 are being executed through the harness or by any other means.
868 =item C<HARNESS_VERSION>
870 This is the version of Test::Harness.
874 =head1 ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
878 =item C<HARNESS_COLUMNS>
880 This value will be used for the width of the terminal. If it is not
881 set then it will default to C<COLUMNS>. If this is not set, it will
882 default to 80. Note that users of Bourne-sh based shells will need to
883 C<export COLUMNS> for this module to use that variable.
885 =item C<HARNESS_COMPILE_TEST>
887 When true it will make harness attempt to compile the test using
888 C<perlcc> before running it.
890 B<NOTE> This currently only works when sitting in the perl source
893 =item C<HARNESS_DEBUG>
895 If true, Test::Harness will print debugging information about itself as
896 it runs the tests. This is different from C<HARNESS_VERBOSE>, which prints
897 the output from the test being run. Setting C<$Test::Harness::Debug> will
898 override this, or you can use the C<-d> switch in the F<prove> utility.
900 =item C<HARNESS_FILELEAK_IN_DIR>
902 When set to the name of a directory, harness will check after each
903 test whether new files appeared in that directory, and report them as
905 LEAKED FILES: scr.tmp 0 my.db
907 If relative, directory name is with respect to the current directory at
908 the moment runtests() was called. Putting absolute path into
909 C<HARNESS_FILELEAK_IN_DIR> may give more predictable results.
911 =item C<HARNESS_IGNORE_EXITCODE>
913 Makes harness ignore the exit status of child processes when defined.
915 =item C<HARNESS_NOTTY>
917 When set to a true value, forces it to behave as though STDOUT were
918 not a console. You may need to set this if you don't want harness to
919 output more frequent progress messages using carriage returns. Some
920 consoles may not handle carriage returns properly (which results in a
921 somewhat messy output).
923 =item C<HARNESS_PERL>
925 Usually your tests will be run by C<$^X>, the currently-executing Perl.
926 However, you may want to have it run by a different executable, such as
927 a threading perl, or a different version.
929 If you're using the F<prove> utility, you can use the C<--perl> switch.
931 =item C<HARNESS_PERL_SWITCHES>
933 Its value will be prepended to the switches used to invoke perl on
934 each test. For example, setting C<HARNESS_PERL_SWITCHES> to C<-W> will
935 run all tests with all warnings enabled.
937 =item C<HARNESS_VERBOSE>
939 If true, Test::Harness will output the verbose results of running
940 its tests. Setting C<$Test::Harness::verbose> will override this,
941 or you can use the C<-v> switch in the F<prove> utility.
947 Here's how Test::Harness tests itself
949 $ cd ~/src/devel/Test-Harness
950 $ perl -Mblib -e 'use Test::Harness qw(&runtests $verbose);
951 $verbose=0; runtests @ARGV;' t/*.t
952 Using /home/schwern/src/devel/Test-Harness/blib
953 t/base..............ok
954 t/nonumbers.........ok
955 t/ok................ok
956 t/test-harness......ok
957 All tests successful.
958 Files=4, Tests=24, 2 wallclock secs ( 0.61 cusr + 0.41 csys = 1.02 CPU)
962 The included F<prove> utility for running test scripts from the command line,
963 L<Test> and L<Test::Simple> for writing test scripts, L<Benchmark> for
964 the underlying timing routines, and L<Devel::Cover> for test coverage
969 Provide a way of running tests quietly (ie. no printing) for automated
970 validation of tests. This will probably take the form of a version
971 of runtests() which rather than printing its output returns raw data
972 on the state of the tests. (Partially done in Test::Harness::Straps)
976 Fix HARNESS_COMPILE_TEST without breaking its core usage.
978 Figure a way to report test names in the failure summary.
980 Rework the test summary so long test names are not truncated as badly.
981 (Partially done with new skip test styles)
983 Add option for coverage analysis.
987 Implement Straps total_results()
991 Completely redo the print summary code.
993 Implement Straps callbacks. (experimentally implemented)
995 Straps->analyze_file() not taint clean, don't know if it can be
997 Fix that damned VMS nit.
999 HARNESS_TODOFAIL to display TODO failures
1001 Add a test for verbose.
1003 Change internal list of test results to a hash.
1005 Fix stats display when there's an overrun.
1007 Fix so perls with spaces in the filename work.
1009 Keeping whittling away at _run_all_tests()
1011 Clean up how the summary is printed. Get rid of those damned formats.
1015 HARNESS_COMPILE_TEST currently assumes it's run from the Perl source
1018 Please use the CPAN bug ticketing system at L<http://rt.cpan.org/>.
1019 You can also mail bugs, fixes and enhancements to
1020 C<< <bug-test-harness >> at C<< rt.cpan.org> >>.
1024 Either Tim Bunce or Andreas Koenig, we don't know. What we know for
1025 sure is, that it was inspired by Larry Wall's TEST script that came
1026 with perl distributions for ages. Numerous anonymous contributors
1027 exist. Andreas Koenig held the torch for many years, and then
1030 Current maintainer is Andy Lester C<< <andy at petdance.com> >>.
1035 by Michael G Schwern C<< <schwern at pobox.com> >>,
1036 Andy Lester C<< <andy at petdance.com> >>.
1038 This program is free software; you can redistribute it and/or
1039 modify it under the same terms as Perl itself.
1041 See L<http://www.perl.com/perl/misc/Artistic.html>.