This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
move back to a stable Test-Simple, v1.001014
authorRicardo Signes <rjbs@cpan.org>
Sun, 8 Mar 2015 22:20:22 +0000 (18:20 -0400)
committerRicardo Signes <rjbs@cpan.org>
Wed, 11 Mar 2015 12:22:07 +0000 (08:22 -0400)
249 files changed:
MANIFEST
Makefile.SH
cpan/Test-Simple/lib/Test/Builder.pm
cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm [new file with mode: 0644]
cpan/Test-Simple/lib/Test/Builder/Module.pm
cpan/Test-Simple/lib/Test/Builder/Tester.pm
cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm
cpan/Test-Simple/lib/Test/CanFork.pm [deleted file]
cpan/Test-Simple/lib/Test/CanThread.pm [deleted file]
cpan/Test-Simple/lib/Test/More.pm
cpan/Test-Simple/lib/Test/More/DeepCheck.pm [deleted file]
cpan/Test-Simple/lib/Test/More/DeepCheck/Strict.pm [deleted file]
cpan/Test-Simple/lib/Test/More/DeepCheck/Tolerant.pm [deleted file]
cpan/Test-Simple/lib/Test/More/Tools.pm [deleted file]
cpan/Test-Simple/lib/Test/MostlyLike.pm [deleted file]
cpan/Test-Simple/lib/Test/Simple.pm
cpan/Test-Simple/lib/Test/Stream.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/API.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Architecture.pod [deleted file]
cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/ArrayBase/Meta.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Block.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Carp.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Context.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Bail.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Diag.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Finish.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Note.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Ok.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Plan.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Event/Subtest.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/ExitMagic.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/ExitMagic/Context.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Explanation.pod [deleted file]
cpan/Test-Simple/lib/Test/Stream/Exporter.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Exporter/Meta.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/ForceExit.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/IOSets.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Meta.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/PackageUtil.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Subtest.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Tester.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Tester/Checks.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Tester/Checks/Event.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Tester/Events.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Tester/Events/Event.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Tester/Grab.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Threads.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Toolset.pm [deleted file]
cpan/Test-Simple/lib/Test/Stream/Util.pm [deleted file]
cpan/Test-Simple/lib/Test/Tester.pm
cpan/Test-Simple/lib/Test/Tester/Capture.pm
cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
cpan/Test-Simple/lib/Test/Tester/Delegate.pm
cpan/Test-Simple/lib/Test/Tutorial/WritingTests.pod [deleted file]
cpan/Test-Simple/lib/Test/Tutorial/WritingTools.pod [deleted file]
cpan/Test-Simple/lib/Test/use/ok.pm
cpan/Test-Simple/lib/ok.pm
cpan/Test-Simple/t/00test_harness_check.t [new file with mode: 0644]
cpan/Test-Simple/t/01-basic.t [new file with mode: 0644]
cpan/Test-Simple/t/478-cmp_ok_hash.t [new file with mode: 0644]
cpan/Test-Simple/t/BEGIN_require_ok.t [moved from cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t with 100% similarity]
cpan/Test-Simple/t/BEGIN_use_ok.t [moved from cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t with 100% similarity]
cpan/Test-Simple/t/Behavior/388-threadedsubtest.load [deleted file]
cpan/Test-Simple/t/Behavior/388-threadedsubtest.t [deleted file]
cpan/Test-Simple/t/Behavior/478-cmp_ok_hash.t [deleted file]
cpan/Test-Simple/t/Behavior/490-inherit_exporter.t [deleted file]
cpan/Test-Simple/t/Behavior/CustomOutput.t [deleted file]
cpan/Test-Simple/t/Behavior/MonkeyPatching_diag.t [deleted file]
cpan/Test-Simple/t/Behavior/MonkeyPatching_done_testing.t [deleted file]
cpan/Test-Simple/t/Behavior/MonkeyPatching_note.t [deleted file]
cpan/Test-Simple/t/Behavior/MonkeyPatching_ok.t [deleted file]
cpan/Test-Simple/t/Behavior/MonkeyPatching_plan.t [deleted file]
cpan/Test-Simple/t/Behavior/Munge.t [deleted file]
cpan/Test-Simple/t/Behavior/NotTB15.t [deleted file]
cpan/Test-Simple/t/Behavior/Tester2_subtest.t [deleted file]
cpan/Test-Simple/t/Behavior/cmp_ok_undef.t [deleted file]
cpan/Test-Simple/t/Behavior/cmp_ok_xor.t [deleted file]
cpan/Test-Simple/t/Behavior/encoding_test.t [deleted file]
cpan/Test-Simple/t/Behavior/event_clone_args.t [deleted file]
cpan/Test-Simple/t/Behavior/fork_new_end.t [deleted file]
cpan/Test-Simple/t/Behavior/skip_all_in_subtest.t [deleted file]
cpan/Test-Simple/t/Behavior/skip_all_in_subtest1.load [deleted file]
cpan/Test-Simple/t/Behavior/skip_all_in_subtest2.load [deleted file]
cpan/Test-Simple/t/Behavior/subtest_die.t [deleted file]
cpan/Test-Simple/t/Behavior/threads_with_taint_mode.t [deleted file]
cpan/Test-Simple/t/Behavior/todo.t [deleted file]
cpan/Test-Simple/t/Builder/Builder.t [moved from cpan/Test-Simple/t/Legacy/Builder/Builder.t with 100% similarity]
cpan/Test-Simple/t/Builder/carp.t [moved from cpan/Test-Simple/t/Legacy/Builder/carp.t with 65% similarity]
cpan/Test-Simple/t/Builder/create.t [moved from cpan/Test-Simple/t/Legacy/Builder/create.t with 100% similarity]
cpan/Test-Simple/t/Builder/current_test.t [moved from cpan/Test-Simple/t/Legacy/Builder/current_test.t with 100% similarity]
cpan/Test-Simple/t/Builder/current_test_without_plan.t [moved from cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t with 100% similarity]
cpan/Test-Simple/t/Builder/details.t [moved from cpan/Test-Simple/t/Legacy/Builder/details.t with 100% similarity]
cpan/Test-Simple/t/Builder/done_testing.t [moved from cpan/Test-Simple/t/Legacy/Builder/done_testing.t with 100% similarity]
cpan/Test-Simple/t/Builder/done_testing_double.t [moved from cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t with 100% similarity]
cpan/Test-Simple/t/Builder/done_testing_plan_mismatch.t [moved from cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t with 100% similarity]
cpan/Test-Simple/t/Builder/done_testing_with_no_plan.t [moved from cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t with 100% similarity]
cpan/Test-Simple/t/Builder/done_testing_with_number.t [moved from cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t with 100% similarity]
cpan/Test-Simple/t/Builder/done_testing_with_plan.t [moved from cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t with 83% similarity]
cpan/Test-Simple/t/Builder/fork_with_new_stdout.t [new file with mode: 0644]
cpan/Test-Simple/t/Builder/has_plan.t [moved from cpan/Test-Simple/t/Legacy/Builder/has_plan.t with 100% similarity]
cpan/Test-Simple/t/Builder/has_plan2.t [moved from cpan/Test-Simple/t/Legacy/Builder/has_plan2.t with 100% similarity]
cpan/Test-Simple/t/Builder/is_fh.t [moved from cpan/Test-Simple/t/Legacy/Builder/is_fh.t with 99% similarity]
cpan/Test-Simple/t/Builder/is_passing.t [moved from cpan/Test-Simple/t/Legacy/Builder/is_passing.t with 100% similarity]
cpan/Test-Simple/t/Builder/maybe_regex.t [moved from cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t with 99% similarity]
cpan/Test-Simple/t/Builder/no_diag.t [moved from cpan/Test-Simple/t/Legacy/Builder/no_diag.t with 100% similarity]
cpan/Test-Simple/t/Builder/no_ending.t [moved from cpan/Test-Simple/t/Legacy/Builder/no_ending.t with 100% similarity]
cpan/Test-Simple/t/Builder/no_header.t [moved from cpan/Test-Simple/t/Legacy/Builder/no_header.t with 100% similarity]
cpan/Test-Simple/t/Builder/no_plan_at_all.t [moved from cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t with 100% similarity]
cpan/Test-Simple/t/Builder/ok_obj.t [moved from cpan/Test-Simple/t/Legacy/Builder/ok_obj.t with 100% similarity]
cpan/Test-Simple/t/Builder/output.t [moved from cpan/Test-Simple/t/Legacy/Builder/output.t with 100% similarity]
cpan/Test-Simple/t/Builder/reset.t [moved from cpan/Test-Simple/t/Legacy/Builder/reset.t with 97% similarity]
cpan/Test-Simple/t/Builder/reset_outputs.t [moved from cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t with 100% similarity]
cpan/Test-Simple/t/Builder/try.t [new file with mode: 0644]
cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t [deleted file]
cpan/Test-Simple/t/Legacy/PerlIO.t [deleted file]
cpan/Test-Simple/t/Legacy/TestTester/auto.t [deleted file]
cpan/Test-Simple/t/Legacy/TestTester/check_tests.t [deleted file]
cpan/Test-Simple/t/Legacy/TestTester/is_bug.t [deleted file]
cpan/Test-Simple/t/Legacy/fork.t [deleted file]
cpan/Test-Simple/t/Legacy/fork_die.t [deleted file]
cpan/Test-Simple/t/Legacy/fork_in_subtest.t [deleted file]
cpan/Test-Simple/t/Legacy/pod.t [deleted file]
cpan/Test-Simple/t/Legacy/ribasushi_threads.t [deleted file]
cpan/Test-Simple/t/Legacy/ribasushi_threads2.t [deleted file]
cpan/Test-Simple/t/Legacy/strays.t [deleted file]
cpan/Test-Simple/t/Legacy/subtest/fork.t [deleted file]
cpan/Test-Simple/t/Legacy/test_use_ok.t [deleted file]
cpan/Test-Simple/t/Legacy/versions.t [deleted file]
cpan/Test-Simple/t/More.t [moved from cpan/Test-Simple/t/Legacy/More.t with 98% similarity]
cpan/Test-Simple/t/MyTest.pm [moved from cpan/Test-Simple/t/lib/MyTest.pm with 100% similarity]
cpan/Test-Simple/t/Simple/load.t [moved from cpan/Test-Simple/t/Legacy/Simple/load.t with 100% similarity]
cpan/Test-Simple/t/SmallTest.pm [moved from cpan/Test-Simple/t/lib/SmallTest.pm with 100% similarity]
cpan/Test-Simple/t/Test-Builder.t [deleted file]
cpan/Test-Simple/t/Test-More-DeepCheck.t [deleted file]
cpan/Test-Simple/t/Test-More.t [deleted file]
cpan/Test-Simple/t/Test-MostlyLike.t [deleted file]
cpan/Test-Simple/t/Test-Simple.t [deleted file]
cpan/Test-Simple/t/Test-Stream-API.t [deleted file]
cpan/Test-Simple/t/Test-Stream-ArrayBase-Meta.t [deleted file]
cpan/Test-Simple/t/Test-Stream-ArrayBase.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Block.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Carp.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Event-Diag.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Event-Finish.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Event-Note.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Event.t [deleted file]
cpan/Test-Simple/t/Test-Stream-ExitMagic-Context.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Exporter-Meta.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Exporter.t [deleted file]
cpan/Test-Simple/t/Test-Stream-ForceExit.t [deleted file]
cpan/Test-Simple/t/Test-Stream-IOSets.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Meta.t [deleted file]
cpan/Test-Simple/t/Test-Stream-PackageUtil.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Tester-Grab.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Tester.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Toolset.t [deleted file]
cpan/Test-Simple/t/Test-Stream-Util.t [deleted file]
cpan/Test-Simple/t/Test-Tester-Capture.t [deleted file]
cpan/Test-Simple/t/Test-Tester.t [deleted file]
cpan/Test-Simple/t/Test-use-ok.t [deleted file]
cpan/Test-Simple/t/Tester/tbt_01basic.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t with 99% similarity]
cpan/Test-Simple/t/Tester/tbt_02fhrestore.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t with 96% similarity]
cpan/Test-Simple/t/Tester/tbt_03die.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t with 100% similarity]
cpan/Test-Simple/t/Tester/tbt_04line_num.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t with 100% similarity]
cpan/Test-Simple/t/Tester/tbt_05faildiag.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t with 100% similarity]
cpan/Test-Simple/t/Tester/tbt_06errormess.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t with 99% similarity]
cpan/Test-Simple/t/Tester/tbt_07args.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t with 99% similarity]
cpan/Test-Simple/t/Tester/tbt_08subtest.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t with 100% similarity]
cpan/Test-Simple/t/Tester/tbt_09do.t [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t with 100% similarity]
cpan/Test-Simple/t/Tester/tbt_09do_script.pl [moved from cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl with 100% similarity]
cpan/Test-Simple/t/auto.t [new file with mode: 0644]
cpan/Test-Simple/t/bad_plan.t [moved from cpan/Test-Simple/t/Legacy/bad_plan.t with 100% similarity]
cpan/Test-Simple/t/bail_out.t [moved from cpan/Test-Simple/t/Legacy/bail_out.t with 100% similarity]
cpan/Test-Simple/t/buffer.t [moved from cpan/Test-Simple/t/Legacy/buffer.t with 100% similarity]
cpan/Test-Simple/t/c_flag.t [moved from cpan/Test-Simple/t/Legacy/c_flag.t with 100% similarity]
cpan/Test-Simple/t/capture.t [new file with mode: 0644]
cpan/Test-Simple/t/check_tests.t [new file with mode: 0644]
cpan/Test-Simple/t/circular_data.t [moved from cpan/Test-Simple/t/Legacy/circular_data.t with 99% similarity]
cpan/Test-Simple/t/cmp_ok.t [moved from cpan/Test-Simple/t/Legacy/cmp_ok.t with 99% similarity]
cpan/Test-Simple/t/dependents.t [moved from cpan/Test-Simple/t/Legacy/dependents.t with 100% similarity]
cpan/Test-Simple/t/depth.t [moved from cpan/Test-Simple/t/Legacy/TestTester/depth.t with 71% similarity]
cpan/Test-Simple/t/diag.t [moved from cpan/Test-Simple/t/Legacy/diag.t with 100% similarity]
cpan/Test-Simple/t/died.t [moved from cpan/Test-Simple/t/Legacy/died.t with 100% similarity]
cpan/Test-Simple/t/dont_overwrite_die_handler.t [moved from cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t with 95% similarity]
cpan/Test-Simple/t/eq_set.t [moved from cpan/Test-Simple/t/Legacy/eq_set.t with 92% similarity]
cpan/Test-Simple/t/exit.t [moved from cpan/Test-Simple/t/Legacy/exit.t with 84% similarity]
cpan/Test-Simple/t/explain.t [moved from cpan/Test-Simple/t/Legacy/explain.t with 100% similarity]
cpan/Test-Simple/t/extra.t [moved from cpan/Test-Simple/t/Legacy/extra.t with 86% similarity]
cpan/Test-Simple/t/extra_one.t [moved from cpan/Test-Simple/t/Legacy/extra_one.t with 100% similarity]
cpan/Test-Simple/t/fail-like.t [moved from cpan/Test-Simple/t/Legacy/fail-like.t with 91% similarity]
cpan/Test-Simple/t/fail-more.t [moved from cpan/Test-Simple/t/Legacy/fail-more.t with 95% similarity]
cpan/Test-Simple/t/fail.t [moved from cpan/Test-Simple/t/Legacy/fail.t with 100% similarity]
cpan/Test-Simple/t/fail_one.t [moved from cpan/Test-Simple/t/Legacy/fail_one.t with 100% similarity]
cpan/Test-Simple/t/filehandles.t [moved from cpan/Test-Simple/t/Legacy/filehandles.t with 100% similarity]
cpan/Test-Simple/t/fork.t [new file with mode: 0644]
cpan/Test-Simple/t/harness_active.t [moved from cpan/Test-Simple/t/Legacy/harness_active.t with 98% similarity]
cpan/Test-Simple/t/import.t [moved from cpan/Test-Simple/t/Legacy/import.t with 100% similarity]
cpan/Test-Simple/t/is_deeply_dne_bug.t [moved from cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t with 100% similarity]
cpan/Test-Simple/t/is_deeply_fail.t [moved from cpan/Test-Simple/t/Legacy/is_deeply_fail.t with 99% similarity]
cpan/Test-Simple/t/is_deeply_with_threads.t [moved from cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t with 73% similarity]
cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm
cpan/Test-Simple/t/missing.t [moved from cpan/Test-Simple/t/Legacy/missing.t with 100% similarity]
cpan/Test-Simple/t/new_ok.t [moved from cpan/Test-Simple/t/Legacy/new_ok.t with 81% similarity]
cpan/Test-Simple/t/no_plan.t [moved from cpan/Test-Simple/t/Legacy/no_plan.t with 100% similarity]
cpan/Test-Simple/t/no_tests.t [moved from cpan/Test-Simple/t/Legacy/no_tests.t with 100% similarity]
cpan/Test-Simple/t/note.t [moved from cpan/Test-Simple/t/Legacy/note.t with 100% similarity]
cpan/Test-Simple/t/overload.t [moved from cpan/Test-Simple/t/Legacy/overload.t with 97% similarity]
cpan/Test-Simple/t/overload_threads.t [moved from cpan/Test-Simple/t/Legacy/overload_threads.t with 100% similarity]
cpan/Test-Simple/t/plan.t [moved from cpan/Test-Simple/t/Legacy/plan.t with 58% similarity]
cpan/Test-Simple/t/plan_bad.t [moved from cpan/Test-Simple/t/Legacy/plan_bad.t with 100% similarity]
cpan/Test-Simple/t/plan_is_noplan.t [moved from cpan/Test-Simple/t/Legacy/plan_is_noplan.t with 100% similarity]
cpan/Test-Simple/t/plan_no_plan.t [moved from cpan/Test-Simple/t/Legacy/plan_no_plan.t with 84% similarity]
cpan/Test-Simple/t/plan_shouldnt_import.t [moved from cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t with 100% similarity]
cpan/Test-Simple/t/plan_skip_all.t [moved from cpan/Test-Simple/t/Legacy/plan_skip_all.t with 100% similarity]
cpan/Test-Simple/t/require_ok.t [moved from cpan/Test-Simple/t/Legacy/require_ok.t with 56% similarity]
cpan/Test-Simple/t/run_test.t [moved from cpan/Test-Simple/t/Legacy/TestTester/run_test.t with 99% similarity]
cpan/Test-Simple/t/simple.t [moved from cpan/Test-Simple/t/Legacy/simple.t with 100% similarity]
cpan/Test-Simple/t/skip.t [moved from cpan/Test-Simple/t/Legacy/skip.t with 86% similarity]
cpan/Test-Simple/t/skipall.t [moved from cpan/Test-Simple/t/Legacy/skipall.t with 98% similarity]
cpan/Test-Simple/t/subtest/args.t [moved from cpan/Test-Simple/t/Legacy/subtest/args.t with 96% similarity]
cpan/Test-Simple/t/subtest/bail_out.t [moved from cpan/Test-Simple/t/Legacy/subtest/bail_out.t with 55% similarity]
cpan/Test-Simple/t/subtest/basic.t [moved from cpan/Test-Simple/t/Legacy/subtest/basic.t with 90% similarity]
cpan/Test-Simple/t/subtest/die.t [moved from cpan/Test-Simple/t/Legacy/subtest/die.t with 100% similarity]
cpan/Test-Simple/t/subtest/do.t [moved from cpan/Test-Simple/t/Legacy/subtest/do.t with 83% similarity]
cpan/Test-Simple/t/subtest/exceptions.t [moved from cpan/Test-Simple/t/Legacy/subtest/exceptions.t with 88% similarity]
cpan/Test-Simple/t/subtest/for_do_t.test [moved from cpan/Test-Simple/t/Legacy/subtest/for_do_t.test with 100% similarity]
cpan/Test-Simple/t/subtest/fork.t [new file with mode: 0644]
cpan/Test-Simple/t/subtest/implicit_done.t [moved from cpan/Test-Simple/t/Legacy/subtest/implicit_done.t with 100% similarity]
cpan/Test-Simple/t/subtest/line_numbers.t [moved from cpan/Test-Simple/t/Legacy/subtest/line_numbers.t with 90% similarity]
cpan/Test-Simple/t/subtest/plan.t [moved from cpan/Test-Simple/t/Legacy/subtest/plan.t with 100% similarity]
cpan/Test-Simple/t/subtest/predicate.t [moved from cpan/Test-Simple/t/Legacy/subtest/predicate.t with 95% similarity]
cpan/Test-Simple/t/subtest/singleton.t [moved from cpan/Test-Simple/t/Legacy/subtest/singleton.t with 100% similarity]
cpan/Test-Simple/t/subtest/threads.t [moved from cpan/Test-Simple/t/Legacy/subtest/threads.t with 52% similarity]
cpan/Test-Simple/t/subtest/todo.t [moved from cpan/Test-Simple/t/Legacy/subtest/todo.t with 87% similarity]
cpan/Test-Simple/t/subtest/wstat.t [moved from cpan/Test-Simple/t/Legacy/subtest/wstat.t with 100% similarity]
cpan/Test-Simple/t/tbm_doesnt_set_exported_to.t [moved from cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t with 88% similarity]
cpan/Test-Simple/t/thread_taint.t [moved from cpan/Test-Simple/t/Legacy/thread_taint.t with 100% similarity]
cpan/Test-Simple/t/threads.t [moved from cpan/Test-Simple/t/Legacy/threads.t with 60% similarity]
cpan/Test-Simple/t/todo.t [moved from cpan/Test-Simple/t/Legacy/todo.t with 93% similarity]
cpan/Test-Simple/t/undef.t [moved from cpan/Test-Simple/t/Legacy/undef.t with 90% similarity]
cpan/Test-Simple/t/use_ok.t [moved from cpan/Test-Simple/t/Legacy/use_ok.t with 100% similarity]
cpan/Test-Simple/t/useing.t [moved from cpan/Test-Simple/t/Legacy/useing.t with 100% similarity]
cpan/Test-Simple/t/utf8.t [moved from cpan/Test-Simple/t/Legacy/utf8.t with 98% similarity]
cpan/Test-Simple/t/versions.t [new file with mode: 0644]
cpan/Test-Simple/t/xt/dependents.t [new file with mode: 0644]
cpan/Test-Simple/t/xxx-changes_updated.t [new file with mode: 0644]
t/porting/known_pod_issues.dat

index aad1be4..ed47fab 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2313,262 +2313,165 @@ cpan/Test-Harness/t/yamlish-output.t                  Test::Harness test
 cpan/Test-Harness/t/yamlish.t                          Test::Harness test
 cpan/Test-Harness/t/yamlish-writer.t                   Test::Harness test
 cpan/Test/lib/Test.pm          A simple framework for writing test scripts
 cpan/Test-Harness/t/yamlish.t                          Test::Harness test
 cpan/Test-Harness/t/yamlish-writer.t                   Test::Harness test
 cpan/Test/lib/Test.pm          A simple framework for writing test scripts
-cpan/Test-Simple/lib/ok.pm                     Test::Simple library
-cpan/Test-Simple/lib/Test/Builder/Module.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Builder.pm                   Test::Simple module
-cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Builder/Tester.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/CanFork.pm                   Test::Simple module
-cpan/Test-Simple/lib/Test/CanThread.pm                 Test::Simple module
-cpan/Test-Simple/lib/Test/More/DeepCheck.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/More/DeepCheck/Strict.pm                     Test::Simple module
-cpan/Test-Simple/lib/Test/More/DeepCheck/Tolerant.pm                   Test::Simple module
-cpan/Test-Simple/lib/Test/More.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/More/Tools.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/MostlyLike.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/Simple.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/API.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Architecture.pod                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/ArrayBase/Meta.pm                     Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm                  Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Block.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Carp.pm                       Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Context.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Bail.pm                 Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Diag.pm                 Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Finish.pm                       Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Note.pm                 Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Ok.pm                   Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Plan.pm                 Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Event/Subtest.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/ExitMagic/Context.pm                  Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/ExitMagic.pm                  Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Explanation.pod                       Test::Simple POD
-cpan/Test-Simple/lib/Test/Stream/Exporter/Meta.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Exporter.pm                   Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/ForceExit.pm                  Test-Simple module
-cpan/Test-Simple/lib/Test/Stream/IOSets.pm                     Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Meta.pm                       Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/PackageUtil.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/Stream.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Subtest.pm                    Test::Simple modules
-cpan/Test-Simple/lib/Test/Stream/Tester/Checks/Event.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Tester/Checks.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Tester/Events/Event.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Tester/Events.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Tester/Grab.pm                        Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Tester.pm                     Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Threads.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Toolset.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Stream/Util.pm                       Test::Simple module
-cpan/Test-Simple/lib/Test/Tester/Capture.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm                      Test::Simple module
-cpan/Test-Simple/lib/Test/Tester/Delegate.pm                   Test::Simple module
-cpan/Test-Simple/lib/Test/Tester.pm                    Test::Simple module
-cpan/Test-Simple/lib/Test/Tutorial.pod                 Test::Simple documentation
-cpan/Test-Simple/lib/Test/Tutorial/WritingTests.pod                    Test::Simple documentation
-cpan/Test-Simple/lib/Test/Tutorial/WritingTools.pod                    Test::Simple documentation
-cpan/Test-Simple/lib/Test/use/ok.pm                    Test::Simple library
-cpan/Test-Simple/t/Behavior/388-threadedsubtest.load                   Test::Simple Test
-cpan/Test-Simple/t/Behavior/388-threadedsubtest.t                      Test::Simple test
-cpan/Test-Simple/t/Behavior/478-cmp_ok_hash.t                  Test::Simple test
-cpan/Test-Simple/t/Behavior/490-inherit_exporter.t                     Test::Simple test
-cpan/Test-Simple/t/Behavior/cmp_ok_undef.t                     Test::Simple Test
-cpan/Test-Simple/t/Behavior/cmp_ok_xor.t                       Test::Simple Test
-cpan/Test-Simple/t/Behavior/CustomOutput.t                     Test::Simple Test
-cpan/Test-Simple/t/Behavior/encoding_test.t                    Test::Simple Test
-cpan/Test-Simple/t/Behavior/event_clone_args.t                 Test::Simple Test
-cpan/Test-Simple/t/Behavior/fork_new_end.t                     Test::Simple Test
-cpan/Test-Simple/t/Behavior/MonkeyPatching_diag.t                      Test::Simple Test
-cpan/Test-Simple/t/Behavior/MonkeyPatching_done_testing.t                      Test::Simple Test
-cpan/Test-Simple/t/Behavior/MonkeyPatching_note.t                      Test::Simple Test
-cpan/Test-Simple/t/Behavior/MonkeyPatching_ok.t                        Test::Simple Test
-cpan/Test-Simple/t/Behavior/MonkeyPatching_plan.t                      Test::Simple Test
-cpan/Test-Simple/t/Behavior/Munge.t                    Test::Simple Test
-cpan/Test-Simple/t/Behavior/NotTB15.t                  Test::Simple Test
-cpan/Test-Simple/t/Behavior/skip_all_in_subtest1.load                  Test::Simple::Test
-cpan/Test-Simple/t/Behavior/skip_all_in_subtest2.load                  Test::Simple::Test
-cpan/Test-Simple/t/Behavior/skip_all_in_subtest.t                      Test::Simple Test
-cpan/Test-Simple/t/Behavior/subtest_die.t      Test::Simple test
-cpan/Test-Simple/t/Behavior/Tester2_subtest.t                  Test::Simple Test
-cpan/Test-Simple/t/Behavior/threads_with_taint_mode.t                  Test::Simple Test
-cpan/Test-Simple/t/Behavior/todo.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/bad_plan.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/bail_out.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/buffer.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/Builder.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/carp.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/create.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/current_test.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/details.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/done_testing.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/has_plan2.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/has_plan.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/is_fh.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/is_passing.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/no_diag.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/no_ending.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/no_header.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/ok_obj.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/output.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/Builder/reset.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/c_flag.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/circular_data.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/cmp_ok.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/dependents.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/diag.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/died.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/eq_set.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/exit.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/explain.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/extra_one.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/extra.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/fail-like.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/fail-more.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/fail_one.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/fail.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/filehandles.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/fork_die.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/fork_in_subtest.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/fork.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/harness_active.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/import.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/is_deeply_fail.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/missing.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/More.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/new_ok.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/no_plan.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/no_tests.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/note.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/overload.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/overload_threads.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/PerlIO.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/plan_bad.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/plan_is_noplan.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/plan_no_plan.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/plan_skip_all.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/plan.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/pod.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/require_ok.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/ribasushi_threads2.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/ribasushi_threads.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Simple/load.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/simple.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/skipall.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/skip.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/strays.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/args.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/bail_out.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/basic.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/die.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/do.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/exceptions.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/for_do_t.test                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/fork.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/implicit_done.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/line_numbers.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/plan.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/predicate.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/singleton.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/threads.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/todo.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/subtest/wstat.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t                 Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/TestTester/auto.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/TestTester/check_tests.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/TestTester/depth.t                   Test::Simple Test
-cpan/Test-Simple/t/Legacy/TestTester/is_bug.t                  Test::Simple Test
-cpan/Test-Simple/t/Legacy/TestTester/run_test.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/test_use_ok.t                        Test::Simple Test
-cpan/Test-Simple/t/Legacy/threads.t                    Test::Simple Test
-cpan/Test-Simple/t/Legacy/thread_taint.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/todo.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/undef.t                      Test::Simple Test
-cpan/Test-Simple/t/Legacy/useing.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/use_ok.t                     Test::Simple Test
-cpan/Test-Simple/t/Legacy/utf8.t                       Test::Simple Test
-cpan/Test-Simple/t/Legacy/versions.t                   Test::Simple Test
-cpan/Test-Simple/t/lib/Dev/Null.pm                     Test::Simple Test
-cpan/Test-Simple/t/lib/Dummy.pm                        Test::Simple Test
-cpan/Test-Simple/t/lib/MyOverload.pm                   Test::Simple Test
-cpan/Test-Simple/t/lib/MyTest.pm                       Test::Simple Test
-cpan/Test-Simple/t/lib/NoExporter.pm                   Test::Simple Test
-cpan/Test-Simple/t/lib/SigDie.pm                       Test::Simple Test
-cpan/Test-Simple/t/lib/SmallTest.pm                    Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm                        Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/Catch.pm                    Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_in_eval.plx                      Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death.plx                      Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_with_handler.plx                 Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/exit.plx                       Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/extras.plx                     Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/five_fail.plx                  Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/last_minute_death.plx                  Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/missing_done_testing.plx                       Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail.plx                   Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail_without_plan.plx                      Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/pre_plan_death.plx                     Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/require.plx                    Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/success.plx                    Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few_fail.plx                       Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few.plx                    Test::Simple Test
-cpan/Test-Simple/t/lib/Test/Simple/sample_tests/two_fail.plx                   Test::Simple Test
-cpan/Test-Simple/t/lib/TieOut.pm                       Test::Simple Test
-cpan/Test-Simple/t/Test-Builder.t                      Test::Simple Test
-cpan/Test-Simple/t/Test-More-DeepCheck.t                       Test::Simple Test
-cpan/Test-Simple/t/Test-More.t                 Test::Simple Test
-cpan/Test-Simple/t/Test-MostlyLike.t                   Test::Simple Test
-cpan/Test-Simple/t/Test-Simple.t                       Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-API.t                   Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-ArrayBase-Meta.t                        Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-ArrayBase.t                     Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Block.t                 Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Carp.t                  Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Event-Diag.t                    Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Event-Finish.t                  Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Event-Note.t                    Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Event.t                 Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-ExitMagic-Context.t                     Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Exporter-Meta.t                 Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Exporter.t                      Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-ForceExit.t                     Test-Simple test
-cpan/Test-Simple/t/Test-Stream-IOSets.t                        Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Meta.t                  Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-PackageUtil.t                   Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Tester-Grab.t                   Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Tester.t                        Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Toolset.t                       Test::Simple Test
-cpan/Test-Simple/t/Test-Stream-Util.t                  Test::Simple Test
-cpan/Test-Simple/t/Test-Tester-Capture.t                       Test::Simple Test
-cpan/Test-Simple/t/Test-Tester.t                       Test::Simple Test
-cpan/Test-Simple/t/Test-use-ok.t                       Test::Simple Test
+cpan/Test-Simple/lib/ok.pm
+cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm
+cpan/Test-Simple/lib/Test/Builder/Module.pm
+cpan/Test-Simple/lib/Test/Builder.pm
+cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm
+cpan/Test-Simple/lib/Test/Builder/Tester.pm
+cpan/Test-Simple/lib/Test/More.pm
+cpan/Test-Simple/lib/Test/Simple.pm
+cpan/Test-Simple/lib/Test/Tester/Capture.pm
+cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
+cpan/Test-Simple/lib/Test/Tester/Delegate.pm
+cpan/Test-Simple/lib/Test/Tester.pm
+cpan/Test-Simple/lib/Test/Tutorial.pod
+cpan/Test-Simple/lib/Test/use/ok.pm
+cpan/Test-Simple/t/00test_harness_check.t
+cpan/Test-Simple/t/01-basic.t
+cpan/Test-Simple/t/478-cmp_ok_hash.t
+cpan/Test-Simple/t/auto.t
+cpan/Test-Simple/t/bad_plan.t
+cpan/Test-Simple/t/bail_out.t
+cpan/Test-Simple/t/BEGIN_require_ok.t
+cpan/Test-Simple/t/BEGIN_use_ok.t
+cpan/Test-Simple/t/buffer.t
+cpan/Test-Simple/t/Builder/Builder.t
+cpan/Test-Simple/t/Builder/carp.t
+cpan/Test-Simple/t/Builder/create.t
+cpan/Test-Simple/t/Builder/current_test.t
+cpan/Test-Simple/t/Builder/current_test_without_plan.t
+cpan/Test-Simple/t/Builder/details.t
+cpan/Test-Simple/t/Builder/done_testing_double.t
+cpan/Test-Simple/t/Builder/done_testing_plan_mismatch.t
+cpan/Test-Simple/t/Builder/done_testing.t
+cpan/Test-Simple/t/Builder/done_testing_with_no_plan.t
+cpan/Test-Simple/t/Builder/done_testing_with_number.t
+cpan/Test-Simple/t/Builder/done_testing_with_plan.t
+cpan/Test-Simple/t/Builder/fork_with_new_stdout.t
+cpan/Test-Simple/t/Builder/has_plan2.t
+cpan/Test-Simple/t/Builder/has_plan.t
+cpan/Test-Simple/t/Builder/is_fh.t
+cpan/Test-Simple/t/Builder/is_passing.t
+cpan/Test-Simple/t/Builder/maybe_regex.t
+cpan/Test-Simple/t/Builder/no_diag.t
+cpan/Test-Simple/t/Builder/no_ending.t
+cpan/Test-Simple/t/Builder/no_header.t
+cpan/Test-Simple/t/Builder/no_plan_at_all.t
+cpan/Test-Simple/t/Builder/ok_obj.t
+cpan/Test-Simple/t/Builder/output.t
+cpan/Test-Simple/t/Builder/reset_outputs.t
+cpan/Test-Simple/t/Builder/reset.t
+cpan/Test-Simple/t/Builder/try.t
+cpan/Test-Simple/t/capture.t
+cpan/Test-Simple/t/c_flag.t
+cpan/Test-Simple/t/check_tests.t
+cpan/Test-Simple/t/circular_data.t
+cpan/Test-Simple/t/cmp_ok.t
+cpan/Test-Simple/t/dependents.t
+cpan/Test-Simple/t/depth.t
+cpan/Test-Simple/t/diag.t
+cpan/Test-Simple/t/died.t
+cpan/Test-Simple/t/dont_overwrite_die_handler.t
+cpan/Test-Simple/t/eq_set.t
+cpan/Test-Simple/t/exit.t
+cpan/Test-Simple/t/explain.t
+cpan/Test-Simple/t/extra_one.t
+cpan/Test-Simple/t/extra.t
+cpan/Test-Simple/t/fail-like.t
+cpan/Test-Simple/t/fail-more.t
+cpan/Test-Simple/t/fail_one.t
+cpan/Test-Simple/t/fail.t
+cpan/Test-Simple/t/filehandles.t
+cpan/Test-Simple/t/fork.t
+cpan/Test-Simple/t/harness_active.t
+cpan/Test-Simple/t/import.t
+cpan/Test-Simple/t/is_deeply_dne_bug.t
+cpan/Test-Simple/t/is_deeply_fail.t
+cpan/Test-Simple/t/is_deeply_with_threads.t
+cpan/Test-Simple/t/lib/Dev/Null.pm
+cpan/Test-Simple/t/lib/Dummy.pm
+cpan/Test-Simple/t/lib/MyOverload.pm
+cpan/Test-Simple/t/lib/NoExporter.pm
+cpan/Test-Simple/t/lib/SigDie.pm
+cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm
+cpan/Test-Simple/t/lib/Test/Simple/Catch.pm
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_in_eval.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_with_handler.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/exit.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/extras.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/five_fail.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/last_minute_death.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/missing_done_testing.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail_without_plan.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/pre_plan_death.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/require.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/success.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few_fail.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few.plx
+cpan/Test-Simple/t/lib/Test/Simple/sample_tests/two_fail.plx
+cpan/Test-Simple/t/lib/TieOut.pm
+cpan/Test-Simple/t/missing.t
+cpan/Test-Simple/t/More.t
+cpan/Test-Simple/t/MyTest.pm
+cpan/Test-Simple/t/new_ok.t
+cpan/Test-Simple/t/no_plan.t
+cpan/Test-Simple/t/no_tests.t
+cpan/Test-Simple/t/note.t
+cpan/Test-Simple/t/overload.t
+cpan/Test-Simple/t/overload_threads.t
+cpan/Test-Simple/t/plan_bad.t
+cpan/Test-Simple/t/plan_is_noplan.t
+cpan/Test-Simple/t/plan_no_plan.t
+cpan/Test-Simple/t/plan_shouldnt_import.t
+cpan/Test-Simple/t/plan_skip_all.t
+cpan/Test-Simple/t/plan.t
+cpan/Test-Simple/t/require_ok.t
+cpan/Test-Simple/t/run_test.t
+cpan/Test-Simple/t/Simple/load.t
+cpan/Test-Simple/t/simple.t
+cpan/Test-Simple/t/skipall.t
+cpan/Test-Simple/t/skip.t
+cpan/Test-Simple/t/SmallTest.pm
+cpan/Test-Simple/t/subtest/args.t
+cpan/Test-Simple/t/subtest/bail_out.t
+cpan/Test-Simple/t/subtest/basic.t
+cpan/Test-Simple/t/subtest/die.t
+cpan/Test-Simple/t/subtest/do.t
+cpan/Test-Simple/t/subtest/exceptions.t
+cpan/Test-Simple/t/subtest/for_do_t.test
+cpan/Test-Simple/t/subtest/fork.t
+cpan/Test-Simple/t/subtest/implicit_done.t
+cpan/Test-Simple/t/subtest/line_numbers.t
+cpan/Test-Simple/t/subtest/plan.t
+cpan/Test-Simple/t/subtest/predicate.t
+cpan/Test-Simple/t/subtest/singleton.t
+cpan/Test-Simple/t/subtest/threads.t
+cpan/Test-Simple/t/subtest/todo.t
+cpan/Test-Simple/t/subtest/wstat.t
+cpan/Test-Simple/t/tbm_doesnt_set_exported_to.t
+cpan/Test-Simple/t/Tester/tbt_01basic.t
+cpan/Test-Simple/t/Tester/tbt_02fhrestore.t
+cpan/Test-Simple/t/Tester/tbt_03die.t
+cpan/Test-Simple/t/Tester/tbt_04line_num.t
+cpan/Test-Simple/t/Tester/tbt_05faildiag.t
+cpan/Test-Simple/t/Tester/tbt_06errormess.t
+cpan/Test-Simple/t/Tester/tbt_07args.t
+cpan/Test-Simple/t/Tester/tbt_08subtest.t
+cpan/Test-Simple/t/Tester/tbt_09do_script.pl
+cpan/Test-Simple/t/Tester/tbt_09do.t
+cpan/Test-Simple/t/threads.t
+cpan/Test-Simple/t/thread_taint.t
+cpan/Test-Simple/t/todo.t
+cpan/Test-Simple/t/undef.t
+cpan/Test-Simple/t/useing.t
+cpan/Test-Simple/t/use_ok.t
+cpan/Test-Simple/t/utf8.t
+cpan/Test-Simple/t/versions.t
+cpan/Test-Simple/t/xt/dependents.t
+cpan/Test-Simple/t/xxx-changes_updated.t
 cpan/Test/t/05_about_verbose.t See if Test works
 cpan/Test/t/fail.t             See if Test works
 cpan/Test/t/mix.t              See if Test works
 cpan/Test/t/05_about_verbose.t See if Test works
 cpan/Test/t/fail.t             See if Test works
 cpan/Test/t/mix.t              See if Test works
index 19c50e8..12414a5 100755 (executable)
@@ -1310,26 +1310,22 @@ _cleaner2:
        -rmdir lib/autodie/Scope lib/autodie lib/XS lib/Win32API lib/VMS
        -rmdir lib/Unicode/Collate/Locale lib/Unicode/Collate/CJK
        -rmdir lib/Unicode/Collate lib/Tie/Hash lib/Thread lib/Text
        -rmdir lib/autodie/Scope lib/autodie lib/XS lib/Win32API lib/VMS
        -rmdir lib/Unicode/Collate/Locale lib/Unicode/Collate/CJK
        -rmdir lib/Unicode/Collate lib/Tie/Hash lib/Thread lib/Text
-       -rmdir lib/Test/use lib/Test/Tutorial lib/Test/Tester
-       -rmdir lib/Test/Stream/Tester/Events lib/Test/Stream/Tester/Checks
-       -rmdir lib/Test/Stream/Tester lib/Test/Stream/Exporter
-       -rmdir lib/Test/Stream/ExitMagic lib/Test/Stream/Event
-       -rmdir lib/Test/Stream/ArrayBase lib/Test/Stream
-       -rmdir lib/Test/More/DeepCheck lib/Test/More lib/Test/Builder/Tester
-       -rmdir lib/Test/Builder lib/Test lib/Term lib/TAP/Parser/YAMLish
-       -rmdir lib/TAP/Parser/SourceHandler lib/TAP/Parser/Scheduler
-       -rmdir lib/TAP/Parser/Result lib/TAP/Parser/Iterator lib/TAP/Parser
-       -rmdir lib/TAP/Harness lib/TAP/Formatter/File
-       -rmdir lib/TAP/Formatter/Console lib/TAP/Formatter lib/TAP
-       -rmdir lib/Sys/Syslog lib/Sys lib/Sub lib/Search lib/Scalar
-       -rmdir lib/Pod/Text lib/Pod/Simple lib/Pod/Perldoc lib/PerlIO/via
-       -rmdir lib/PerlIO lib/Perl lib/Parse/CPAN lib/Parse lib/Params
-       -rmdir lib/Net/FTP lib/Module/Load lib/Module/CoreList lib/Module
-       -rmdir lib/Memoize lib/Math/BigInt lib/Math/BigFloat lib/Math lib/MIME
-       -rmdir lib/Locale/Maketext lib/Locale/Codes lib/Locale lib/List/Util
-       -rmdir lib/List lib/JSON/PP lib/JSON lib/IPC lib/IO/Uncompress/Adapter
-       -rmdir lib/IO/Uncompress lib/IO/Socket lib/IO/Compress/Zlib
-       -rmdir lib/IO/Compress/Zip lib/IO/Compress/Gzip lib/IO/Compress/Base
+       -rmdir lib/Test/use lib/Test/Tester lib/Test/Builder/Tester
+       -rmdir lib/Test/Builder/IO lib/Test/Builder lib/Test lib/Term
+       -rmdir lib/TAP/Parser/YAMLish lib/TAP/Parser/SourceHandler
+       -rmdir lib/TAP/Parser/Scheduler lib/TAP/Parser/Result
+       -rmdir lib/TAP/Parser/Iterator lib/TAP/Parser lib/TAP/Harness
+       -rmdir lib/TAP/Formatter/File lib/TAP/Formatter/Console
+       -rmdir lib/TAP/Formatter lib/TAP lib/Sys/Syslog lib/Sys lib/Sub
+       -rmdir lib/Search lib/Scalar lib/Pod/Text lib/Pod/Simple
+       -rmdir lib/Pod/Perldoc lib/PerlIO/via lib/PerlIO lib/Perl
+       -rmdir lib/Parse/CPAN lib/Parse lib/Params lib/Net/FTP lib/Module/Load
+       -rmdir lib/Module/CoreList lib/Module lib/Memoize lib/Math/BigInt
+       -rmdir lib/Math/BigFloat lib/Math lib/MIME lib/Locale/Maketext
+       -rmdir lib/Locale/Codes lib/Locale lib/List/Util lib/List lib/JSON/PP
+       -rmdir lib/JSON lib/IPC lib/IO/Uncompress/Adapter lib/IO/Uncompress
+       -rmdir lib/IO/Socket lib/IO/Compress/Zlib lib/IO/Compress/Zip
+       -rmdir lib/IO/Compress/Gzip lib/IO/Compress/Base
        -rmdir lib/IO/Compress/Adapter lib/IO/Compress lib/IO
        -rmdir lib/I18N/LangTags lib/I18N lib/Hash/Util lib/Hash lib/HTTP
        -rmdir lib/Filter/Util lib/Filter lib/File/Spec lib/ExtUtils/Typemaps
        -rmdir lib/IO/Compress/Adapter lib/IO/Compress lib/IO
        -rmdir lib/I18N/LangTags lib/I18N lib/Hash/Util lib/Hash lib/HTTP
        -rmdir lib/Filter/Util lib/Filter lib/File/Spec lib/ExtUtils/Typemaps
index 11dadc7..a8e7bd9 100644 (file)
 package Test::Builder;
 
 package Test::Builder;
 
-use 5.008001;
+use 5.006;
 use strict;
 use warnings;
 
 use strict;
 use warnings;
 
-our $VERSION = '1.301001_098';
+our $VERSION = '1.001014';
 $VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
 
 $VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
 
+BEGIN {
+    if( $] < 5.008 ) {
+        require Test::Builder::IO::Scalar;
+    }
+}
 
 
-use Test::Stream 1.301001 qw/ -internal STATE_LEGACY STATE_PLAN STATE_COUNT /;
-use Test::Stream::Toolset;
-use Test::Stream::Context;
-use Test::Stream::Carp qw/confess/;
-use Test::Stream::Meta qw/MODERN/;
-
-use Test::Stream::Util qw/try protect unoverload_str is_regex/;
-use Scalar::Util qw/blessed reftype/;
-
-use Test::More::Tools;
 
 
+# Make Test::Builder thread-safe for ithreads.
 BEGIN {
 BEGIN {
-    my $meta = Test::Stream::Meta->is_tester('main');
-    Test::Stream->shared->set_use_legacy(1)
-        unless $meta && $meta->[MODERN];
-}
+    use Config;
+    # Load threads::shared when threads are turned on.
+    # 5.8.0's threads are so busted we no longer support them.
+    if( $] >= 5.008001 && $Config{useithreads} && $INC{'threads.pm'} ) {
+        require threads::shared;
+
+        # Hack around YET ANOTHER threads::shared bug.  It would
+        # occasionally forget the contents of the variable when sharing it.
+        # So we first copy the data, then share, then put our copy back.
+        *share = sub (\[$@%]) {
+            my $type = ref $_[0];
+            my $data;
+
+            if( $type eq 'HASH' ) {
+                %$data = %{ $_[0] };
+            }
+            elsif( $type eq 'ARRAY' ) {
+                @$data = @{ $_[0] };
+            }
+            elsif( $type eq 'SCALAR' ) {
+                $$data = ${ $_[0] };
+            }
+            else {
+                die( "Unknown type: " . $type );
+            }
 
 
-# The mostly-singleton, and other package vars.
-our $Test  = Test::Builder->new;
-our $_ORIG_Test = $Test;
-our $Level = 1;
+            $_[0] = &threads::shared::share( $_[0] );
+
+            if( $type eq 'HASH' ) {
+                %{ $_[0] } = %$data;
+            }
+            elsif( $type eq 'ARRAY' ) {
+                @{ $_[0] } = @$data;
+            }
+            elsif( $type eq 'SCALAR' ) {
+                ${ $_[0] } = $$data;
+            }
+            else {
+                die( "Unknown type: " . $type );
+            }
 
 
-sub ctx {
-    my $self = shift || die "No self in context";
-    my ($add) = @_;
-    my $ctx = Test::Stream::Context::context(2 + ($add || 0), $self->{stream});
-    if (defined $self->{Todo}) {
-        $ctx->set_in_todo(1);
-        $ctx->set_todo($self->{Todo});
-        $ctx->set_diag_todo(1);
+            return $_[0];
+        };
+    }
+    # 5.8.0's threads::shared is busted when threads are off
+    # and earlier Perls just don't have that module at all.
+    else {
+        *share = sub { return $_[0] };
+        *lock  = sub { 0 };
     }
     }
-    return $ctx;
 }
 
 }
 
-sub stream {
-    my $self = shift;
-    return $self->{stream} || Test::Stream->shared;
-}
+=head1 NAME
 
 
-sub depth { $_[0]->{depth} || 0 }
+Test::Builder - Backend for building test libraries
 
 
-# This is only for unit tests at this point.
-sub _ending {
-    my $self = shift;
-    my ($ctx) = @_;
-    require Test::Stream::ExitMagic;
-    $self->{stream}->set_no_ending(0);
-    Test::Stream::ExitMagic->new->do_magic($self->{stream}, $ctx);
-}
-
-my %WARNED;
-our $CTX;
-our %ORIG = (
-    ok   => \&ok,
-    diag => \&diag,
-    note => \&note,
-    plan => \&plan,
-    done_testing => \&done_testing,
-);
+=head1 SYNOPSIS
 
 
-sub WARN_OF_OVERRIDE {
-    my ($sub, $ctx) = @_;
+  package My::Test::Module;
+  use base 'Test::Builder::Module';
 
 
-    return unless $ctx->modern;
-    my $old = $ORIG{$sub};
-    # Use package instead of self, we want replaced subs, not subclass overrides.
-    my $new = __PACKAGE__->can($sub);
+  my $CLASS = __PACKAGE__;
 
 
-    return if $new == $old;
+  sub ok {
+      my($test, $name) = @_;
+      my $tb = $CLASS->builder;
 
 
-    require B;
-    my $o    = B::svref_2object($new);
-    my $gv   = $o->GV;
-    my $st   = $o->START;
-    my $name = $gv->NAME;
-    my $pkg  = $gv->STASH->NAME;
-    my $line = $st->line;
-    my $file = $st->file;
+      $tb->ok($test, $name);
+  }
 
 
-    warn <<"    EOT" unless $WARNED{"$pkg $name $file $line"}++;
 
 
-*******************************************************************************
-Something monkeypatched Test::Builder::$sub()!
-The new sub is '$pkg\::$name' defined in $file around line $line.
-In the near future monkeypatching Test::Builder::ok() will no longer work
-as expected.
-*******************************************************************************
-    EOT
-}
+=head1 DESCRIPTION
 
 
+L<Test::Simple> and L<Test::More> have proven to be popular testing modules,
+but they're not always flexible enough.  Test::Builder provides a
+building block upon which to write your own test libraries I<which can
+work together>.
 
 
-####################
-# {{{ Constructors #
-####################
+=head2 Construction
 
 
-sub new {
-    my $class  = shift;
-    my %params = @_;
-    $Test ||= $class->create(shared_stream => 1);
+=over 4
+
+=item B<new>
+
+  my $Test = Test::Builder->new;
+
+Returns a Test::Builder object representing the current state of the
+test.
+
+Since you only run one test per program C<new> always returns the same
+Test::Builder object.  No matter how many times you call C<new()>, you're
+getting the same object.  This is called a singleton.  This is done so that
+multiple modules share such global information as the test counter and
+where test output is going.
+
+If you want a completely new Test::Builder object different from the
+singleton, use C<create>.
 
 
+=cut
+
+our $Test = Test::Builder->new;
+
+sub new {
+    my($class) = shift;
+    $Test ||= $class->create;
     return $Test;
 }
 
     return $Test;
 }
 
+=item B<create>
+
+  my $Test = Test::Builder->create;
+
+Ok, so there can be more than one Test::Builder object and this is how
+you get it.  You might use this instead of C<new()> if you're testing
+a Test::Builder based module, but otherwise you probably want C<new>.
+
+B<NOTE>: the implementation is not complete.  C<level>, for example, is
+still shared amongst B<all> Test::Builder objects, even ones created using
+this method.  Also, the method name may change in the future.
+
+=cut
+
 sub create {
 sub create {
-    my $class  = shift;
-    my %params = @_;
+    my $class = shift;
 
     my $self = bless {}, $class;
 
     my $self = bless {}, $class;
-    $self->reset(%params);
+    $self->reset;
 
     return $self;
 }
 
 
     return $self;
 }
 
+
 # Copy an object, currently a shallow.
 # This does *not* bless the destination.  This keeps the destructor from
 # firing when we're just storing a copy of the object to restore later.
 sub _copy {
 # Copy an object, currently a shallow.
 # This does *not* bless the destination.  This keeps the destructor from
 # firing when we're just storing a copy of the object to restore later.
 sub _copy {
-    my ($src, $dest) = @_;
+    my($src, $dest) = @_;
+
     %$dest = %$src;
     %$dest = %$src;
+    _share_keys($dest);
+
     return;
 }
 
     return;
 }
 
-####################
-# }}} Constructors #
-####################
 
 
-#############################
-# {{{ Children and subtests #
-#############################
+=item B<child>
 
 
-sub subtest {
-    my $self = shift;
-    my $ctx = $self->ctx();
-    require Test::Stream::Subtest;
-    return Test::Stream::Subtest::subtest(@_);
-}
+  my $child = $builder->child($name_of_child);
+  $child->plan( tests => 4 );
+  $child->ok(some_code());
+  ...
+  $child->finalize;
+
+Returns a new instance of C<Test::Builder>.  Any output from this child will
+be indented four spaces more than the parent's indentation.  When done, the
+C<finalize> method I<must> be called explicitly.
+
+Trying to create a new child with a previous child still active (i.e.,
+C<finalize> not called) will C<croak>.
+
+Trying to run a test when you have an open child will also C<croak> and cause
+the test suite to fail.
+
+=cut
 
 sub child {
     my( $self, $name ) = @_;
 
 
 sub child {
     my( $self, $name ) = @_;
 
-    my $ctx = $self->ctx;
-
-    if ($self->{child}) {
-        my $cname = $self->{child}->{Name};
-        $ctx->throw("You already have a child named ($cname) running");
+    if( $self->{Child_Name} ) {
+        $self->croak("You already have a child named ($self->{Child_Name}) running");
     }
 
     }
 
-    $name ||= "Child of " . $self->{Name};
-    my $stream = $self->{stream} || Test::Stream->shared;
-    $ctx->subtest_start($name, parent_todo => $ctx->in_todo);
+    my $parent_in_todo = $self->in_todo;
 
 
-    my $child = bless {
-        %$self,
-        '?' => $?,
-        parent => $self,
-    };
+    # Clear $TODO for the child.
+    my $orig_TODO = $self->find_TODO(undef, 1, undef);
+
+    my $class = ref $self;
+    my $child = $class->create;
+
+    # Add to our indentation
+    $child->_indent( $self->_indent . '    ' );
+
+    # Make the child use the same outputs as the parent
+    for my $method (qw(output failure_output todo_output)) {
+        $child->$method( $self->$method );
+    }
 
 
-    $? = 0;
-    $child->{Name} = $name;
-    $self->{child} = $child;
-    Scalar::Util::weaken($self->{child});
+    # Ensure the child understands if they're inside a TODO
+    if( $parent_in_todo ) {
+        $child->failure_output( $self->todo_output );
+    }
 
 
+    # This will be reset in finalize. We do this here lest one child failure
+    # cause all children to fail.
+    $child->{Child_Error} = $?;
+    $?                    = 0;
+    $child->{Parent}      = $self;
+    $child->{Parent_TODO} = $orig_TODO;
+    $child->{Name}        = $name || "Child of " . $self->name;
+    $self->{Child_Name}   = $child->name;
     return $child;
 }
 
     return $child;
 }
 
-sub finalize {
-    my $self = shift;
 
 
-    return unless $self->{parent};
+=item B<subtest>
+
+    $builder->subtest($name, \&subtests, @args);
 
 
-    my $ctx = $self->ctx;
+See documentation of C<subtest> in Test::More.  
+
+C<subtest> also, and optionally, accepts arguments which will be passed to the
+subtests reference.
+
+=cut
+
+sub subtest {
+    my $self = shift;
+    my($name, $subtests, @args) = @_;
 
 
-    if ($self->{child}) {
-        my $cname = $self->{child}->{Name};
-        $ctx->throw("Can't call finalize() with child ($cname) active");
+    if ('CODE' ne ref $subtests) {
+        $self->croak("subtest()'s second argument must be a code ref");
     }
 
     }
 
-    $self->_ending($ctx);
-    my $passing = $ctx->stream->is_passing;
-    my $count = $ctx->stream->count;
-    my $name = $self->{Name};
+    # Turn the child into the parent so anyone who has stored a copy of
+    # the Test::Builder singleton will get the child.
+    my $error;
+    my $child;
+    my $parent = {};
+    {
+        # child() calls reset() which sets $Level to 1, so we localize
+        # $Level first to limit the scope of the reset to the subtest.
+        local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+        # Store the guts of $self as $parent and turn $child into $self.
+        $child  = $self->child($name);
+        _copy($self,  $parent);
+        _copy($child, $self);
+
+        my $run_the_subtests = sub {
+            # Add subtest name for clarification of starting point
+            $self->note("Subtest: $name");
+            $subtests->(@args);
+            $self->done_testing unless $self->_plan_handled;
+            1;
+        };
+
+        if( !eval { $run_the_subtests->() } ) {
+            $error = $@;
+        }
+    }
 
 
-    my $stream = $self->{stream} || Test::Stream->shared;
+    # Restore the parent and the copied child.
+    _copy($self,   $child);
+    _copy($parent, $self);
 
 
-    my $parent = $self->parent;
-    $self->{parent}->{child} = undef;
-    $self->{parent} = undef;
+    # Restore the parent's $TODO
+    $self->find_TODO(undef, 1, $child->{Parent_TODO});
 
 
-    $? = $self->{'?'};
+    # Die *after* we restore the parent.
+    die $error if $error and !eval { $error->isa('Test::Builder::Exception') };
 
 
-    my $st = $ctx->subtest_stop($name);
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+    my $finalize = $child->finalize;
 
 
-    $parent->ctx->subtest(
-        # Stuff from ok (most of this gets initialized inside)
-        undef, # real_bool, gets set properly by initializer
-        $st->{name}, # name
-        undef, # diag
-        undef, # bool
-        undef, # level
+    $self->BAIL_OUT($child->{Bailed_Out_Reason}) if $child->{Bailed_Out};
 
 
-        # Subtest specific stuff
-        $st->{state},
-        $st->{events},
-        $st->{exception},
-        $st->{early_return},
-        $st->{delayed},
-        $st->{instant},
-    );
+    return $finalize;
 }
 
 }
 
-sub in_subtest {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    return scalar @{$ctx->stream->subtests};
-}
+=begin _private
 
 
-sub parent { $_[0]->{parent} }
-sub name   { $_[0]->{Name} }
+=item B<_plan_handled>
 
 
-sub DESTROY {
-    my $self = shift;
-    return unless $self->{parent};
-    return if $self->{Skip_All};
-    $self->{parent}->is_passing(0);
-    my $name = $self->{Name};
-    die "Child ($name) exited without calling finalize()";
-}
+    if ( $Test->_plan_handled ) { ... }
 
 
-#############################
-# }}} Children and subtests #
-#############################
+Returns true if the developer has explicitly handled the plan via:
 
 
-#####################################
-# {{{ stuff for TODO status #
-#####################################
+=over 4
 
 
-sub find_TODO {
-    my ($self, $pack, $set, $new_value) = @_;
-
-    unless ($pack) {
-        if (my $ctx = Test::Stream::Context->peek) {
-            $pack = $ctx->package;
-            my $old = $ctx->todo;
-            $ctx->set_todo($new_value) if $set;
-            return $old;
-        }
+=item * Explicitly setting the number of tests
 
 
-        $pack = $self->exported_to || return;
-    }
+=item * Setting 'no_plan'
 
 
-    no strict 'refs';    ## no critic
-    no warnings 'once';
-    my $old_value = ${$pack . '::TODO'};
-    $set and ${$pack . '::TODO'} = $new_value;
-    return $old_value;
-}
+=item * Set 'skip_all'.
 
 
-sub todo {
-    my ($self, $pack) = @_;
+=back
 
 
-    return $self->{Todo} if defined $self->{Todo};
+This is currently used in subtests when we implicitly call C<< $Test->done_testing >>
+if the developer has not set a plan.
 
 
-    my $ctx = $self->ctx;
+=end _private
 
 
-    my $todo = $self->find_TODO($pack);
-    return $todo if defined $todo;
+=cut
 
 
-    return '';
+sub _plan_handled {
+    my $self = shift;
+    return $self->{Have_Plan} || $self->{No_Plan} || $self->{Skip_All};
 }
 
 }
 
-sub in_todo {
-    my $self = shift;
 
 
-    my $ctx = $self->ctx;
-    return 1 if $ctx->in_todo;
+=item B<finalize>
 
 
-    return (defined $self->{Todo} || $self->find_TODO) ? 1 : 0;
-}
+  my $ok = $child->finalize;
 
 
-sub todo_start {
-    my $self = shift;
-    my $message = @_ ? shift : '';
+When your child is done running tests, you must call C<finalize> to clean up
+and tell the parent your pass/fail status.
 
 
-    $self->{Start_Todo}++;
-    if ($self->in_todo) {
-        push @{$self->{Todo_Stack}} => $self->todo;
-    }
-    $self->{Todo} = $message;
+Calling C<finalize> on a child with open children will C<croak>.
 
 
-    return;
-}
+If the child falls out of scope before C<finalize> is called, a failure
+diagnostic will be issued and the child is considered to have failed.
 
 
-sub todo_end {
+No attempt to call methods on a child after C<finalize> is called is
+guaranteed to succeed.
+
+Calling this on the root builder is a no-op.
+
+=cut
+
+sub finalize {
     my $self = shift;
 
     my $self = shift;
 
-    if (!$self->{Start_Todo}) {
-        $self->ctx(-1)->throw('todo_end() called without todo_start()');
+    return unless $self->parent;
+    if( $self->{Child_Name} ) {
+        $self->croak("Can't call finalize() with child ($self->{Child_Name}) active");
     }
 
     }
 
-    $self->{Start_Todo}--;
+    local $? = 0;     # don't fail if $subtests happened to set $? nonzero
+    $self->_ending;
 
 
-    if ($self->{Start_Todo} && @{$self->{Todo_Stack}}) {
-        $self->{Todo} = pop @{$self->{Todo_Stack}};
-    }
-    else {
-        delete $self->{Todo};
+    # XXX This will only be necessary for TAP envelopes (we think)
+    #$self->_print( $self->is_passing ? "PASS\n" : "FAIL\n" );
+
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+    my $ok = 1;
+    $self->parent->{Child_Name} = undef;
+    unless ($self->{Bailed_Out}) {
+        if ( $self->{Skip_All} ) {
+            $self->parent->skip($self->{Skip_All}, $self->name);
+        }
+        elsif ( not @{ $self->{Test_Results} } ) {
+            $self->parent->ok( 0, sprintf q[No tests run for subtest "%s"], $self->name );
+        }
+        else {
+            $self->parent->ok( $self->is_passing, $self->name );
+        }
     }
     }
+    $? = $self->{Child_Error};
+    delete $self->{Parent};
 
 
-    return;
+    return $self->is_passing;
 }
 
 }
 
-#####################################
-# }}} Finding Testers and Providers #
-#####################################
-
-################
-# {{{ Planning #
-################
-
-my %PLAN_CMDS = (
-    no_plan  => 'no_plan',
-    skip_all => 'skip_all',
-    tests    => '_plan_tests',
-);
+sub _indent      {
+    my $self = shift;
 
 
-sub plan {
-    my ($self, $cmd, @args) = @_;
+    if( @_ ) {
+        $self->{Indent} = shift;
+    }
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
-    WARN_OF_OVERRIDE(plan => $ctx);
+    return $self->{Indent};
+}
 
 
-    return unless $cmd;
+=item B<parent>
 
 
-    if (my $method = $PLAN_CMDS{$cmd}) {
-        $self->$method(@args);
-    }
-    else {
-        my @in = grep { defined } ($cmd, @args);
-        $self->ctx->throw("plan() doesn't understand @in");
-    }
+ if ( my $parent = $builder->parent ) {
+     ...
+ }
 
 
-    return 1;
-}
+Returns the parent C<Test::Builder> instance, if any.  Only used with child
+builders for nested TAP.
 
 
-sub skip_all {
-    my ($self, $reason) = @_;
+=cut
 
 
-    $self->{Skip_All} = 1;
+sub parent { shift->{Parent} }
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
+=item B<name>
 
 
-    $ctx->_plan(0, 'SKIP', $reason);
-}
+ diag $builder->name;
 
 
-sub no_plan {
-    my ($self, @args) = @_;
+Returns the name of the current builder.  Top level builders default to C<$0>
+(the name of the executable).  Child builders are named via the C<child>
+method.  If no name is supplied, will be named "Child of $parent->name".
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
+=cut
 
 
-    $ctx->alert("no_plan takes no arguments") if @args;
-    $ctx->_plan(0, 'NO PLAN');
+sub name { shift->{Name} }
 
 
-    return 1;
+sub DESTROY {
+    my $self = shift;
+    if ( $self->parent and $$ == $self->{Original_Pid} ) {
+        my $name = $self->name;
+        $self->diag(<<"FAIL");
+Child ($name) exited without calling finalize()
+FAIL
+        $self->parent->{In_Destroy} = 1;
+        $self->parent->ok(0, $name);
+    }
 }
 
 }
 
-sub _plan_tests {
-    my ($self, $arg) = @_;
+=item B<reset>
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
+  $Test->reset;
 
 
-    if ($arg) {
-        $ctx->throw("Number of tests must be a positive integer.  You gave it '$arg'")
-            unless $arg =~ /^\+?\d+$/;
+Reinitializes the Test::Builder singleton to its original state.
+Mostly useful for tests run in persistent environments where the same
+test might be run multiple times in the same process.
 
 
-        $ctx->_plan($arg);
-    }
-    elsif (!defined $arg) {
-        $ctx->throw("Got an undefined number of tests");
-    }
-    else {
-        $ctx->throw("You said to run 0 tests");
-    }
+=cut
 
 
-    return;
-}
+our $Level;
 
 
-sub done_testing {
-    my ($self, $num_tests) = @_;
+sub reset {    ## no critic (Subroutines::ProhibitBuiltinHomonyms)
+    my($self) = @_;
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
-    WARN_OF_OVERRIDE(done_testing => $ctx);
+    # We leave this a global because it has to be localized and localizing
+    # hash keys is just asking for pain.  Also, it was documented.
+    $Level = 1;
 
 
-    my $out = $ctx->stream->done_testing($ctx, $num_tests);
-    return $out;
-}
+    $self->{Name}         = $0;
+    $self->is_passing(1);
+    $self->{Ending}       = 0;
+    $self->{Have_Plan}    = 0;
+    $self->{No_Plan}      = 0;
+    $self->{Have_Output_Plan} = 0;
+    $self->{Done_Testing} = 0;
 
 
-################
-# }}} Planning #
-################
+    $self->{Original_Pid} = $$;
+    $self->{Child_Name}   = undef;
+    $self->{Indent}     ||= '';
 
 
-#############################
-# {{{ Base Event Producers #
-#############################
+    $self->{Curr_Test} = 0;
+    $self->{Test_Results} = &share( [] );
 
 
-sub ok {
-    my $self = shift;
-    my($test, $name) = @_;
+    $self->{Exported_To}    = undef;
+    $self->{Expected_Tests} = 0;
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
-    WARN_OF_OVERRIDE(ok => $ctx);
+    $self->{Skip_All} = 0;
 
 
-    if ($self->{child}) {
-        $self->is_passing(0);
-        $ctx->throw("Cannot run test ($name) with active children");
-    }
+    $self->{Use_Nums} = 1;
 
 
-    $ctx->_unwind_ok($test, $name);
-    return $test ? 1 : 0;
-}
+    $self->{No_Header} = 0;
+    $self->{No_Ending} = 0;
 
 
-sub BAIL_OUT {
-    my( $self, $reason ) = @_;
-    $self->ctx()->bail($reason);
-}
+    $self->{Todo}       = undef;
+    $self->{Todo_Stack} = [];
+    $self->{Start_Todo} = 0;
+    $self->{Opened_Testhandles} = 0;
 
 
-sub skip {
-    my( $self, $why ) = @_;
-    $why ||= '';
-    unoverload_str( \$why );
+    $self->_share_keys;
+    $self->_dup_stdhandles;
 
 
-    my $ctx = $self->ctx();
-    $ctx->set_skip($why);
-    $ctx->ok(1, '');
-    $ctx->set_skip(undef);
+    return;
 }
 
 }
 
-sub todo_skip {
-    my( $self, $why ) = @_;
-    $why ||= '';
-    unoverload_str( \$why );
-
-    my $ctx = $self->ctx();
-    $ctx->set_skip($why);
-    $ctx->set_todo($why);
-    $ctx->ok(0, '');
-    $ctx->set_skip(undef);
-    $ctx->set_todo(undef);
-}
 
 
-sub diag {
+# Shared scalar values are lost when a hash is copied, so we have
+# a separate method to restore them.
+# Shared references are retained across copies.
+sub _share_keys {
     my $self = shift;
     my $self = shift;
-    my $msg = join '', map { defined($_) ? $_ : 'undef' } @_;
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
-    WARN_OF_OVERRIDE(diag => $ctx);
+    share( $self->{Curr_Test} );
 
 
-    $ctx->_diag($msg);
     return;
 }
 
     return;
 }
 
-sub note {
-    my $self = shift;
-    my $msg = join '', map { defined($_) ? $_ : 'undef' } @_;
 
 
-    my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
-    WARN_OF_OVERRIDE(note => $ctx);
+=back
 
 
-    $ctx->_note($msg);
-}
+=head2 Setting up tests
 
 
-#############################
-# }}} Base Event Producers #
-#############################
+These methods are for setting up tests and declaring how many there
+are.  You usually only want to call one of these methods.
 
 
-#######################
-# {{{ Public helpers #
-#######################
+=over 4
 
 
-sub explain {
-    my $self = shift;
+=item B<plan>
 
 
-    return map {
-        ref $_
-          ? do {
-            protect { require Data::Dumper };
-            my $dumper = Data::Dumper->new( [$_] );
-            $dumper->Indent(1)->Terse(1);
-            $dumper->Sortkeys(1) if $dumper->can("Sortkeys");
-            $dumper->Dump;
-          }
-          : $_
-    } @_;
-}
+  $Test->plan('no_plan');
+  $Test->plan( skip_all => $reason );
+  $Test->plan( tests => $num_tests );
 
 
-sub carp {
-    my $self = shift;
-    $self->ctx->alert(join '' => @_);
-}
+A convenient way to set up your tests.  Call this and Test::Builder
+will print the appropriate headers and take the appropriate actions.
 
 
-sub croak {
-    my $self = shift;
-    $self->ctx->throw(join '' => @_);
-}
+If you call C<plan()>, don't call any of the other methods below.
 
 
-sub has_plan {
-    my $self = shift;
+If a child calls "skip_all" in the plan, a C<Test::Builder::Exception> is
+thrown.  Trap this error, call C<finalize()> and don't run any more tests on
+the child.
 
 
-    my $plan = $self->ctx->stream->plan || return undef;
-    return 'no_plan' if $plan->directive && $plan->directive eq 'NO PLAN';
-    return $plan->max;
-}
+ my $child = $Test->child('some child');
+ eval { $child->plan( $condition ? ( skip_all => $reason ) : ( tests => 3 )  ) };
+ if ( eval { $@->isa('Test::Builder::Exception') } ) {
+    $child->finalize;
+    return;
+ }
+ # run your tests
 
 
-sub reset {
-    my $self = shift;
-    my %params = @_;
+=cut
+
+my %plan_cmds = (
+    no_plan     => \&no_plan,
+    skip_all    => \&skip_all,
+    tests       => \&_plan_tests,
+);
+
+sub plan {
+    my( $self, $cmd, $arg ) = @_;
+
+    return unless $cmd;
+
+    local $Level = $Level + 1;
 
 
-    $self->{use_shared} = 1 if $params{shared_stream};
+    $self->croak("You tried to plan twice") if $self->{Have_Plan};
 
 
-    if ($self->{use_shared}) {
-        Test::Stream->shared->_reset;
-        Test::Stream->shared->state->[-1]->[STATE_LEGACY] = [];
+    if( my $method = $plan_cmds{$cmd} ) {
+        local $Level = $Level + 1;
+        $self->$method($arg);
     }
     else {
     }
     else {
-        $self->{stream} = Test::Stream->new();
-        $self->{stream}->set_use_legacy(1);
-        $self->{stream}->state->[-1]->[STATE_LEGACY] = [];
+        my @args = grep { defined } ( $cmd, $arg );
+        $self->croak("plan() doesn't understand @args");
     }
 
     }
 
-    # We leave this a global because it has to be localized and localizing
-    # hash keys is just asking for pain.  Also, it was documented.
-    $Level = 1;
-
-    $self->{Name} = $0;
+    return 1;
+}
 
 
-    $self->{Original_Pid} = $$;
-    $self->{Child_Name}   = undef;
 
 
-    $self->{Exported_To} = undef;
+sub _plan_tests {
+    my($self, $arg) = @_;
 
 
-    $self->{Todo}               = undef;
-    $self->{Todo_Stack}         = [];
-    $self->{Start_Todo}         = 0;
-    $self->{Opened_Testhandles} = 0;
+    if($arg) {
+        local $Level = $Level + 1;
+        return $self->expected_tests($arg);
+    }
+    elsif( !defined $arg ) {
+        $self->croak("Got an undefined number of tests");
+    }
+    else {
+        $self->croak("You said to run 0 tests");
+    }
 
     return;
 }
 
 
     return;
 }
 
-#######################
-# }}} Public helpers #
-#######################
+=item B<expected_tests>
 
 
-#################################
-# {{{ Advanced Event Producers #
-#################################
+    my $max = $Test->expected_tests;
+    $Test->expected_tests($max);
 
 
-sub cmp_ok {
-    my( $self, $got, $type, $expect, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->cmp_check($got, $type, $expect);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
+Gets/sets the number of tests we expect this test to run and prints out
+the appropriate headers.
 
 
-sub is_eq {
-    my( $self, $got, $expect, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->is_eq($got, $expect);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
+=cut
 
 
-sub is_num {
-    my( $self, $got, $expect, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->is_num($got, $expect);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
+sub expected_tests {
+    my $self = shift;
+    my($max) = @_;
 
 
-sub isnt_eq {
-    my( $self, $got, $dont_expect, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->isnt_eq($got, $dont_expect);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
+    if(@_) {
+        $self->croak("Number of tests must be a positive integer.  You gave it '$max'")
+          unless $max =~ /^\+?\d+$/;
 
 
-sub isnt_num {
-    my( $self, $got, $dont_expect, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->isnt_num($got, $dont_expect);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
+        $self->{Expected_Tests} = $max;
+        $self->{Have_Plan}      = 1;
 
 
-sub like {
-    my( $self, $thing, $regex, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->regex_check($thing, $regex, '=~');
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
+        $self->_output_plan($max) unless $self->no_header;
+    }
+    return $self->{Expected_Tests};
 }
 
 }
 
-sub unlike {
-    my( $self, $thing, $regex, $name ) = @_;
-    my $ctx = $self->ctx;
-    my ($ok, @diag) = tmt->regex_check($thing, $regex, '!~');
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
+=item B<no_plan>
 
 
-#################################
-# }}} Advanced Event Producers #
-#################################
+  $Test->no_plan;
 
 
-################################################
-# {{{ Misc #
-################################################
+Declares that this test will run an indeterminate number of tests.
 
 
-sub _new_fh {
-    my $self = shift;
-    my($file_or_fh) = shift;
+=cut
 
 
-    return $file_or_fh if $self->is_fh($file_or_fh);
+sub no_plan {
+    my($self, $arg) = @_;
 
 
-    my $fh;
-    if( ref $file_or_fh eq 'SCALAR' ) {
-        open $fh, ">>", $file_or_fh
-          or croak("Can't open scalar ref $file_or_fh: $!");
-    }
-    else {
-        open $fh, ">", $file_or_fh
-          or croak("Can't open test output log $file_or_fh: $!");
-        Test::Stream::IOSets->_autoflush($fh);
+    $self->carp("no_plan takes no arguments") if $arg;
+
+    $self->{No_Plan}   = 1;
+    $self->{Have_Plan} = 1;
+
+    return 1;
+}
+
+=begin private
+
+=item B<_output_plan>
+
+  $tb->_output_plan($max);
+  $tb->_output_plan($max, $directive);
+  $tb->_output_plan($max, $directive => $reason);
+
+Handles displaying the test plan.
+
+If a C<$directive> and/or C<$reason> are given they will be output with the
+plan.  So here's what skipping all tests looks like:
+
+    $tb->_output_plan(0, "SKIP", "Because I said so");
+
+It sets C<< $tb->{Have_Output_Plan} >> and will croak if the plan was already
+output.
+
+=end private
+
+=cut
+
+sub _output_plan {
+    my($self, $max, $directive, $reason) = @_;
+
+    $self->carp("The plan was already output") if $self->{Have_Output_Plan};
+
+    my $plan = "1..$max";
+    $plan .= " # $directive" if defined $directive;
+    $plan .= " $reason"      if defined $reason;
+
+    $self->_print("$plan\n");
+
+    $self->{Have_Output_Plan} = 1;
+
+    return;
+}
+
+
+=item B<done_testing>
+
+  $Test->done_testing();
+  $Test->done_testing($num_tests);
+
+Declares that you are done testing, no more tests will be run after this point.
+
+If a plan has not yet been output, it will do so.
+
+$num_tests is the number of tests you planned to run.  If a numbered
+plan was already declared, and if this contradicts, a failing test
+will be run to reflect the planning mistake.  If C<no_plan> was declared,
+this will override.
+
+If C<done_testing()> is called twice, the second call will issue a
+failing test.
+
+If C<$num_tests> is omitted, the number of tests run will be used, like
+no_plan.
+
+C<done_testing()> is, in effect, used when you'd want to use C<no_plan>, but
+safer. You'd use it like so:
+
+    $Test->ok($a == $b);
+    $Test->done_testing();
+
+Or to plan a variable number of tests:
+
+    for my $test (@tests) {
+        $Test->ok($test);
+    }
+    $Test->done_testing(scalar @tests);
+
+=cut
+
+sub done_testing {
+    my($self, $num_tests) = @_;
+
+    # If done_testing() specified the number of tests, shut off no_plan.
+    if( defined $num_tests ) {
+        $self->{No_Plan} = 0;
+    }
+    else {
+        $num_tests = $self->current_test;
+    }
+
+    if( $self->{Done_Testing} ) {
+        my($file, $line) = @{$self->{Done_Testing}}[1,2];
+        $self->ok(0, "done_testing() was already called at $file line $line");
+        return;
+    }
+
+    $self->{Done_Testing} = [caller];
+
+    if( $self->expected_tests && $num_tests != $self->expected_tests ) {
+        $self->ok(0, "planned to run @{[ $self->expected_tests ]} ".
+                     "but done_testing() expects $num_tests");
+    }
+    else {
+        $self->{Expected_Tests} = $num_tests;
+    }
+
+    $self->_output_plan($num_tests) unless $self->{Have_Output_Plan};
+
+    $self->{Have_Plan} = 1;
+
+    # The wrong number of tests were run
+    $self->is_passing(0) if $self->{Expected_Tests} != $self->{Curr_Test};
+
+    # No tests were run
+    $self->is_passing(0) if $self->{Curr_Test} == 0;
+
+    return 1;
+}
+
+
+=item B<has_plan>
+
+  $plan = $Test->has_plan
+
+Find out whether a plan has been defined. C<$plan> is either C<undef> (no plan
+has been set), C<no_plan> (indeterminate # of tests) or an integer (the number
+of expected tests).
+
+=cut
+
+sub has_plan {
+    my $self = shift;
+
+    return( $self->{Expected_Tests} ) if $self->{Expected_Tests};
+    return('no_plan') if $self->{No_Plan};
+    return(undef);
+}
+
+=item B<skip_all>
+
+  $Test->skip_all;
+  $Test->skip_all($reason);
+
+Skips all the tests, using the given C<$reason>.  Exits immediately with 0.
+
+=cut
+
+sub skip_all {
+    my( $self, $reason ) = @_;
+
+    $self->{Skip_All} = $self->parent ? $reason : 1;
+
+    $self->_output_plan(0, "SKIP", $reason) unless $self->no_header;
+    if ( $self->parent ) {
+        die bless {} => 'Test::Builder::Exception';
+    }
+    exit(0);
+}
+
+=item B<exported_to>
+
+  my $pack = $Test->exported_to;
+  $Test->exported_to($pack);
+
+Tells Test::Builder what package you exported your functions to.
+
+This method isn't terribly useful since modules which share the same
+Test::Builder object might get exported to different packages and only
+the last one will be honored.
+
+=cut
+
+sub exported_to {
+    my( $self, $pack ) = @_;
+
+    if( defined $pack ) {
+        $self->{Exported_To} = $pack;
+    }
+    return $self->{Exported_To};
+}
+
+=back
+
+=head2 Running tests
+
+These actually run the tests, analogous to the functions in Test::More.
+
+They all return true if the test passed, false if the test failed.
+
+C<$name> is always optional.
+
+=over 4
+
+=item B<ok>
+
+  $Test->ok($test, $name);
+
+Your basic test.  Pass if C<$test> is true, fail if $test is false.  Just
+like Test::Simple's C<ok()>.
+
+=cut
+
+sub ok {
+    my( $self, $test, $name ) = @_;
+
+    if ( $self->{Child_Name} and not $self->{In_Destroy} ) {
+        $name = 'unnamed test' unless defined $name;
+        $self->is_passing(0);
+        $self->croak("Cannot run test ($name) with active children");
+    }
+    # $test might contain an object which we don't want to accidentally
+    # store, so we turn it into a boolean.
+    $test = $test ? 1 : 0;
+
+    lock $self->{Curr_Test};
+    $self->{Curr_Test}++;
+
+    # In case $name is a string overloaded object, force it to stringify.
+    $self->_unoverload_str( \$name );
+
+    $self->diag(<<"ERR") if defined $name and $name =~ /^[\d\s]+$/;
+    You named your test '$name'.  You shouldn't use numbers for your test names.
+    Very confusing.
+ERR
+
+    # Capture the value of $TODO for the rest of this ok() call
+    # so it can more easily be found by other routines.
+    my $todo    = $self->todo();
+    my $in_todo = $self->in_todo;
+    local $self->{Todo} = $todo if $in_todo;
+
+    $self->_unoverload_str( \$todo );
+
+    my $out;
+    my $result = &share( {} );
+
+    unless($test) {
+        $out .= "not ";
+        @$result{ 'ok', 'actual_ok' } = ( ( $self->in_todo ? 1 : 0 ), 0 );
+    }
+    else {
+        @$result{ 'ok', 'actual_ok' } = ( 1, $test );
+    }
+
+    $out .= "ok";
+    $out .= " $self->{Curr_Test}" if $self->use_numbers;
+
+    if( defined $name ) {
+        $name =~ s|#|\\#|g;    # # in a name can confuse Test::Harness.
+        $out .= " - $name";
+        $result->{name} = $name;
+    }
+    else {
+        $result->{name} = '';
+    }
+
+    if( $self->in_todo ) {
+        $out .= " # TODO $todo";
+        $result->{reason} = $todo;
+        $result->{type}   = 'todo';
+    }
+    else {
+        $result->{reason} = '';
+        $result->{type}   = '';
+    }
+
+    $self->{Test_Results}[ $self->{Curr_Test} - 1 ] = $result;
+    $out .= "\n";
+
+    $self->_print($out);
+
+    unless($test) {
+        my $msg = $self->in_todo ? "Failed (TODO)" : "Failed";
+        $self->_print_to_fh( $self->_diag_fh, "\n" ) if $ENV{HARNESS_ACTIVE};
+
+        my( undef, $file, $line ) = $self->caller;
+        if( defined $name ) {
+            $self->diag(qq[  $msg test '$name'\n]);
+            $self->diag(qq[  at $file line $line.\n]);
+        }
+        else {
+            $self->diag(qq[  $msg test at $file line $line.\n]);
+        }
+    }
+
+    $self->is_passing(0) unless $test || $self->in_todo;
+
+    # Check that we haven't violated the plan
+    $self->_check_is_passing_plan();
+
+    return $test ? 1 : 0;
+}
+
+
+# Check that we haven't yet violated the plan and set
+# is_passing() accordingly
+sub _check_is_passing_plan {
+    my $self = shift;
+
+    my $plan = $self->has_plan;
+    return unless defined $plan;        # no plan yet defined
+    return unless $plan !~ /\D/;        # no numeric plan
+    $self->is_passing(0) if $plan < $self->{Curr_Test};
+}
+
+
+sub _unoverload {
+    my $self = shift;
+    my $type = shift;
+
+    $self->_try(sub { require overload; }, die_on_fail => 1);
+
+    foreach my $thing (@_) {
+        if( $self->_is_object($$thing) ) {
+            if( my $string_meth = overload::Method( $$thing, $type ) ) {
+                $$thing = $$thing->$string_meth();
+            }
+        }
+    }
+
+    return;
+}
+
+sub _is_object {
+    my( $self, $thing ) = @_;
+
+    return $self->_try( sub { ref $thing && $thing->isa('UNIVERSAL') } ) ? 1 : 0;
+}
+
+sub _unoverload_str {
+    my $self = shift;
+
+    return $self->_unoverload( q[""], @_ );
+}
+
+sub _unoverload_num {
+    my $self = shift;
+
+    $self->_unoverload( '0+', @_ );
+
+    for my $val (@_) {
+        next unless $self->_is_dualvar($$val);
+        $$val = $$val + 0;
+    }
+
+    return;
+}
+
+# This is a hack to detect a dualvar such as $!
+sub _is_dualvar {
+    my( $self, $val ) = @_;
+
+    # Objects are not dualvars.
+    return 0 if ref $val;
+
+    no warnings 'numeric';
+    my $numval = $val + 0;
+    return ($numval != 0 and $numval ne $val ? 1 : 0);
+}
+
+=item B<is_eq>
+
+  $Test->is_eq($got, $expected, $name);
+
+Like Test::More's C<is()>.  Checks if C<$got eq $expected>.  This is the
+string version.
+
+C<undef> only ever matches another C<undef>.
+
+=item B<is_num>
+
+  $Test->is_num($got, $expected, $name);
+
+Like Test::More's C<is()>.  Checks if C<$got == $expected>.  This is the
+numeric version.
+
+C<undef> only ever matches another C<undef>.
+
+=cut
+
+sub is_eq {
+    my( $self, $got, $expect, $name ) = @_;
+    local $Level = $Level + 1;
+
+    if( !defined $got || !defined $expect ) {
+        # undef only matches undef and nothing else
+        my $test = !defined $got && !defined $expect;
+
+        $self->ok( $test, $name );
+        $self->_is_diag( $got, 'eq', $expect ) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok( $got, 'eq', $expect, $name );
+}
+
+sub is_num {
+    my( $self, $got, $expect, $name ) = @_;
+    local $Level = $Level + 1;
+
+    if( !defined $got || !defined $expect ) {
+        # undef only matches undef and nothing else
+        my $test = !defined $got && !defined $expect;
+
+        $self->ok( $test, $name );
+        $self->_is_diag( $got, '==', $expect ) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok( $got, '==', $expect, $name );
+}
+
+sub _diag_fmt {
+    my( $self, $type, $val ) = @_;
+
+    if( defined $$val ) {
+        if( $type eq 'eq' or $type eq 'ne' ) {
+            # quote and force string context
+            $$val = "'$$val'";
+        }
+        else {
+            # force numeric context
+            $self->_unoverload_num($val);
+        }
+    }
+    else {
+        $$val = 'undef';
+    }
+
+    return;
+}
+
+sub _is_diag {
+    my( $self, $got, $type, $expect ) = @_;
+
+    $self->_diag_fmt( $type, $_ ) for \$got, \$expect;
+
+    local $Level = $Level + 1;
+    return $self->diag(<<"DIAGNOSTIC");
+         got: $got
+    expected: $expect
+DIAGNOSTIC
+
+}
+
+sub _isnt_diag {
+    my( $self, $got, $type ) = @_;
+
+    $self->_diag_fmt( $type, \$got );
+
+    local $Level = $Level + 1;
+    return $self->diag(<<"DIAGNOSTIC");
+         got: $got
+    expected: anything else
+DIAGNOSTIC
+}
+
+=item B<isnt_eq>
+
+  $Test->isnt_eq($got, $dont_expect, $name);
+
+Like L<Test::More>'s C<isnt()>.  Checks if C<$got ne $dont_expect>.  This is
+the string version.
+
+=item B<isnt_num>
+
+  $Test->isnt_num($got, $dont_expect, $name);
+
+Like L<Test::More>'s C<isnt()>.  Checks if C<$got ne $dont_expect>.  This is
+the numeric version.
+
+=cut
+
+sub isnt_eq {
+    my( $self, $got, $dont_expect, $name ) = @_;
+    local $Level = $Level + 1;
+
+    if( !defined $got || !defined $dont_expect ) {
+        # undef only matches undef and nothing else
+        my $test = defined $got || defined $dont_expect;
+
+        $self->ok( $test, $name );
+        $self->_isnt_diag( $got, 'ne' ) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok( $got, 'ne', $dont_expect, $name );
+}
+
+sub isnt_num {
+    my( $self, $got, $dont_expect, $name ) = @_;
+    local $Level = $Level + 1;
+
+    if( !defined $got || !defined $dont_expect ) {
+        # undef only matches undef and nothing else
+        my $test = defined $got || defined $dont_expect;
+
+        $self->ok( $test, $name );
+        $self->_isnt_diag( $got, '!=' ) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok( $got, '!=', $dont_expect, $name );
+}
+
+=item B<like>
+
+  $Test->like($thing, qr/$regex/, $name);
+  $Test->like($thing, '/$regex/', $name);
+
+Like L<Test::More>'s C<like()>.  Checks if $thing matches the given C<$regex>.
+
+=item B<unlike>
+
+  $Test->unlike($thing, qr/$regex/, $name);
+  $Test->unlike($thing, '/$regex/', $name);
+
+Like L<Test::More>'s C<unlike()>.  Checks if $thing B<does not match> the
+given C<$regex>.
+
+=cut
+
+sub like {
+    my( $self, $thing, $regex, $name ) = @_;
+
+    local $Level = $Level + 1;
+    return $self->_regex_ok( $thing, $regex, '=~', $name );
+}
+
+sub unlike {
+    my( $self, $thing, $regex, $name ) = @_;
+
+    local $Level = $Level + 1;
+    return $self->_regex_ok( $thing, $regex, '!~', $name );
+}
+
+=item B<cmp_ok>
+
+  $Test->cmp_ok($thing, $type, $that, $name);
+
+Works just like L<Test::More>'s C<cmp_ok()>.
+
+    $Test->cmp_ok($big_num, '!=', $other_big_num);
+
+=cut
+
+my %numeric_cmps = map { ( $_, 1 ) } ( "<", "<=", ">", ">=", "==", "!=", "<=>" );
+
+# Bad, these are not comparison operators. Should we include more?
+my %cmp_ok_bl = map { ( $_, 1 ) } ( "=", "+=", ".=", "x=", "^=", "|=", "||=", "&&=", "...");
+
+sub cmp_ok {
+    my( $self, $got, $type, $expect, $name ) = @_;
+
+    if ($cmp_ok_bl{$type}) {
+        $self->croak("$type is not a valid comparison operator in cmp_ok()");
+    }
+
+    my ($test, $succ);
+    my $error;
+    {
+        ## no critic (BuiltinFunctions::ProhibitStringyEval)
+
+        local( $@, $!, $SIG{__DIE__} );    # isolate eval
+
+        my($pack, $file, $line) = $self->caller();
+
+        # This is so that warnings come out at the caller's level
+        $succ = eval qq[
+#line $line "(eval in cmp_ok) $file"
+\$test = (\$got $type \$expect);
+1;
+];
+        $error = $@;
+    }
+    local $Level = $Level + 1;
+    my $ok = $self->ok( $test, $name );
+
+    # Treat overloaded objects as numbers if we're asked to do a
+    # numeric comparison.
+    my $unoverload
+      = $numeric_cmps{$type}
+      ? '_unoverload_num'
+      : '_unoverload_str';
+
+    $self->diag(<<"END") unless $succ;
+An error occurred while using $type:
+------------------------------------
+$error
+------------------------------------
+END
+
+    unless($ok) {
+        $self->$unoverload( \$got, \$expect );
+
+        if( $type =~ /^(eq|==)$/ ) {
+            $self->_is_diag( $got, $type, $expect );
+        }
+        elsif( $type =~ /^(ne|!=)$/ ) {
+            $self->_isnt_diag( $got, $type );
+        }
+        else {
+            $self->_cmp_diag( $got, $type, $expect );
+        }
     }
     }
+    return $ok;
+}
 
 
-    return $fh;
+sub _cmp_diag {
+    my( $self, $got, $type, $expect ) = @_;
+
+    $got    = defined $got    ? "'$got'"    : 'undef';
+    $expect = defined $expect ? "'$expect'" : 'undef';
+
+    local $Level = $Level + 1;
+    return $self->diag(<<"DIAGNOSTIC");
+    $got
+        $type
+    $expect
+DIAGNOSTIC
 }
 
 }
 
-sub output {
+sub _caller_context {
     my $self = shift;
     my $self = shift;
-    my $handles = $self->ctx->stream->io_sets->init_encoding('legacy');
-    $handles->[0] = $self->_new_fh(@_) if @_;
-    return $handles->[0];
+
+    my( $pack, $file, $line ) = $self->caller(1);
+
+    my $code = '';
+    $code .= "#line $line $file\n" if defined $file and defined $line;
+
+    return $code;
 }
 
 }
 
-sub failure_output {
-    my $self = shift;
-    my $handles = $self->ctx->stream->io_sets->init_encoding('legacy');
-    $handles->[1] = $self->_new_fh(@_) if @_;
-    return $handles->[1];
+=back
+
+
+=head2 Other Testing Methods
+
+These are methods which are used in the course of writing a test but are not themselves tests.
+
+=over 4
+
+=item B<BAIL_OUT>
+
+    $Test->BAIL_OUT($reason);
+
+Indicates to the L<Test::Harness> that things are going so badly all
+testing should terminate.  This includes running any additional test
+scripts.
+
+It will exit with 255.
+
+=cut
+
+sub BAIL_OUT {
+    my( $self, $reason ) = @_;
+
+    $self->{Bailed_Out} = 1;
+
+    if ($self->parent) {
+        $self->{Bailed_Out_Reason} = $reason;
+        $self->no_ending(1);
+        die bless {} => 'Test::Builder::Exception';
+    }
+
+    $self->_print("Bail out!  $reason");
+    exit 255;
 }
 
 }
 
-sub todo_output {
-    my $self = shift;
-    my $handles = $self->ctx->stream->io_sets->init_encoding('legacy');
-    $handles->[2] = $self->_new_fh(@_) if @_;
-    return $handles->[2] || $handles->[0];
+=for deprecated
+BAIL_OUT() used to be BAILOUT()
+
+=cut
+
+{
+    no warnings 'once';
+    *BAILOUT = \&BAIL_OUT;
 }
 
 }
 
-sub reset_outputs {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    $ctx->stream->io_sets->reset_legacy;
+=item B<skip>
+
+    $Test->skip;
+    $Test->skip($why);
+
+Skips the current test, reporting C<$why>.
+
+=cut
+
+sub skip {
+    my( $self, $why, $name ) = @_;
+    $why ||= '';
+    $name = '' unless defined $name;
+    $self->_unoverload_str( \$why );
+
+    lock( $self->{Curr_Test} );
+    $self->{Curr_Test}++;
+
+    $self->{Test_Results}[ $self->{Curr_Test} - 1 ] = &share(
+        {
+            'ok'      => 1,
+            actual_ok => 1,
+            name      => $name,
+            type      => 'skip',
+            reason    => $why,
+        }
+    );
+
+    my $out = "ok";
+    $out .= " $self->{Curr_Test}" if $self->use_numbers;
+    $out .= " # skip";
+    $out .= " $why"               if length $why;
+    $out .= "\n";
+
+    $self->_print($out);
+
+    return 1;
 }
 
 }
 
-sub use_numbers {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    $ctx->stream->set_use_numbers(@_) if @_;
-    $ctx->stream->use_numbers;
+=item B<todo_skip>
+
+  $Test->todo_skip;
+  $Test->todo_skip($why);
+
+Like C<skip()>, only it will declare the test as failing and TODO.  Similar
+to
+
+    print "not ok $tnum # TODO $why\n";
+
+=cut
+
+sub todo_skip {
+    my( $self, $why ) = @_;
+    $why ||= '';
+
+    lock( $self->{Curr_Test} );
+    $self->{Curr_Test}++;
+
+    $self->{Test_Results}[ $self->{Curr_Test} - 1 ] = &share(
+        {
+            'ok'      => 1,
+            actual_ok => 0,
+            name      => '',
+            type      => 'todo_skip',
+            reason    => $why,
+        }
+    );
+
+    my $out = "not ok";
+    $out .= " $self->{Curr_Test}" if $self->use_numbers;
+    $out .= " # TODO & SKIP $why\n";
+
+    $self->_print($out);
+
+    return 1;
 }
 
 }
 
-sub no_ending {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    $ctx->stream->set_no_ending(@_) if @_;
-    $ctx->stream->no_ending || 0;
+=begin _unimplemented
+
+=item B<skip_rest>
+
+  $Test->skip_rest;
+  $Test->skip_rest($reason);
+
+Like C<skip()>, only it skips all the rest of the tests you plan to run
+and terminates the test.
+
+If you're running under C<no_plan>, it skips once and terminates the
+test.
+
+=end _unimplemented
+
+=back
+
+
+=head2 Test building utility methods
+
+These methods are useful when writing your own test methods.
+
+=over 4
+
+=item B<maybe_regex>
+
+  $Test->maybe_regex(qr/$regex/);
+  $Test->maybe_regex('/$regex/');
+
+This method used to be useful back when Test::Builder worked on Perls
+before 5.6 which didn't have qr//.  Now its pretty useless.
+
+Convenience method for building testing functions that take regular
+expressions as arguments.
+
+Takes a quoted regular expression produced by C<qr//>, or a string
+representing a regular expression.
+
+Returns a Perl value which may be used instead of the corresponding
+regular expression, or C<undef> if its argument is not recognised.
+
+For example, a version of C<like()>, sans the useful diagnostic messages,
+could be written as:
+
+  sub laconic_like {
+      my ($self, $thing, $regex, $name) = @_;
+      my $usable_regex = $self->maybe_regex($regex);
+      die "expecting regex, found '$regex'\n"
+          unless $usable_regex;
+      $self->ok($thing =~ m/$usable_regex/, $name);
+  }
+
+=cut
+
+sub maybe_regex {
+    my( $self, $regex ) = @_;
+    my $usable_regex = undef;
+
+    return $usable_regex unless defined $regex;
+
+    my( $re, $opts );
+
+    # Check for qr/foo/
+    if( _is_qr($regex) ) {
+        $usable_regex = $regex;
+    }
+    # Check for '/foo/' or 'm,foo,'
+    elsif(( $re, $opts )        = $regex =~ m{^ /(.*)/ (\w*) $ }sx              or
+          ( undef, $re, $opts ) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx
+    )
+    {
+        $usable_regex = length $opts ? "(?$opts)$re" : $re;
+    }
+
+    return $usable_regex;
 }
 
 }
 
-sub no_header {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    $ctx->stream->set_no_header(@_) if @_;
-    $ctx->stream->no_header || 0;
+sub _is_qr {
+    my $regex = shift;
+
+    # is_regexp() checks for regexes in a robust manner, say if they're
+    # blessed.
+    return re::is_regexp($regex) if defined &re::is_regexp;
+    return ref $regex eq 'Regexp';
 }
 
 }
 
-sub no_diag {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    $ctx->stream->set_no_diag(@_) if @_;
-    $ctx->stream->no_diag || 0;
+sub _regex_ok {
+    my( $self, $thing, $regex, $cmp, $name ) = @_;
+
+    my $ok           = 0;
+    my $usable_regex = $self->maybe_regex($regex);
+    unless( defined $usable_regex ) {
+        local $Level = $Level + 1;
+        $ok = $self->ok( 0, $name );
+        $self->diag("    '$regex' doesn't look much like a regex to me.");
+        return $ok;
+    }
+
+    {
+        my $test;
+        my $context = $self->_caller_context;
+
+        {
+            ## no critic (BuiltinFunctions::ProhibitStringyEval)
+
+            local( $@, $!, $SIG{__DIE__} );    # isolate eval
+
+            # No point in issuing an uninit warning, they'll see it in the diagnostics
+            no warnings 'uninitialized';
+
+            $test = eval $context . q{$test = $thing =~ /$usable_regex/ ? 1 : 0};
+        }
+
+        $test = !$test if $cmp eq '!~';
+
+        local $Level = $Level + 1;
+        $ok = $self->ok( $test, $name );
+    }
+
+    unless($ok) {
+        $thing = defined $thing ? "'$thing'" : 'undef';
+        my $match = $cmp eq '=~' ? "doesn't match" : "matches";
+
+        local $Level = $Level + 1;
+        $self->diag( sprintf <<'DIAGNOSTIC', $thing, $match, $regex );
+                  %s
+    %13s '%s'
+DIAGNOSTIC
+
+    }
+
+    return $ok;
 }
 
 }
 
-sub exported_to {
-    my($self, $pack) = @_;
-    $self->{Exported_To} = $pack if defined $pack;
-    return $self->{Exported_To};
+# I'm not ready to publish this.  It doesn't deal with array return
+# values from the code or context.
+
+=begin private
+
+=item B<_try>
+
+    my $return_from_code          = $Test->try(sub { code });
+    my($return_from_code, $error) = $Test->try(sub { code });
+
+Works like eval BLOCK except it ensures it has no effect on the rest
+of the test (ie. C<$@> is not set) nor is effected by outside
+interference (ie. C<$SIG{__DIE__}>) and works around some quirks in older
+Perls.
+
+C<$error> is what would normally be in C<$@>.
+
+It is suggested you use this in place of eval BLOCK.
+
+=cut
+
+sub _try {
+    my( $self, $code, %opts ) = @_;
+
+    my $error;
+    my $return;
+    {
+        local $!;               # eval can mess up $!
+        local $@;               # don't set $@ in the test
+        local $SIG{__DIE__};    # don't trip an outside DIE handler.
+        $return = eval { $code->() };
+        $error = $@;
+    }
+
+    die $error if $error and $opts{die_on_fail};
+
+    return wantarray ? ( $return, $error ) : $return;
 }
 
 }
 
+=end private
+
+
+=item B<is_fh>
+
+    my $is_fh = $Test->is_fh($thing);
+
+Determines if the given C<$thing> can be used as a filehandle.
+
+=cut
+
 sub is_fh {
     my $self     = shift;
     my $maybe_fh = shift;
 sub is_fh {
     my $self     = shift;
     my $maybe_fh = shift;
@@ -716,628 +1552,1121 @@ sub is_fh {
     return 1 if ref $maybe_fh  eq 'GLOB';    # its a glob ref
     return 1 if ref \$maybe_fh eq 'GLOB';    # its a glob
 
     return 1 if ref $maybe_fh  eq 'GLOB';    # its a glob ref
     return 1 if ref \$maybe_fh eq 'GLOB';    # its a glob
 
-    my $out;
-    protect {
-        $out = eval { $maybe_fh->isa("IO::Handle") }
-            || eval { tied($maybe_fh)->can('TIEHANDLE') };
+    return eval { $maybe_fh->isa("IO::Handle") } ||
+           eval { tied($maybe_fh)->can('TIEHANDLE') };
+}
+
+=back
+
+
+=head2 Test style
+
+
+=over 4
+
+=item B<level>
+
+    $Test->level($how_high);
+
+How far up the call stack should C<$Test> look when reporting where the
+test failed.
+
+Defaults to 1.
+
+Setting L<$Test::Builder::Level> overrides.  This is typically useful
+localized:
+
+    sub my_ok {
+        my $test = shift;
+
+        local $Test::Builder::Level = $Test::Builder::Level + 1;
+        $TB->ok($test);
+    }
+
+To be polite to other functions wrapping your own you usually want to increment C<$Level> rather than set it to a constant.
+
+=cut
+
+sub level {
+    my( $self, $level ) = @_;
+
+    if( defined $level ) {
+        $Level = $level;
+    }
+    return $Level;
+}
+
+=item B<use_numbers>
+
+    $Test->use_numbers($on_or_off);
+
+Whether or not the test should output numbers.  That is, this if true:
+
+  ok 1
+  ok 2
+  ok 3
+
+or this if false
+
+  ok
+  ok
+  ok
+
+Most useful when you can't depend on the test output order, such as
+when threads or forking is involved.
+
+Defaults to on.
+
+=cut
+
+sub use_numbers {
+    my( $self, $use_nums ) = @_;
+
+    if( defined $use_nums ) {
+        $self->{Use_Nums} = $use_nums;
+    }
+    return $self->{Use_Nums};
+}
+
+=item B<no_diag>
+
+    $Test->no_diag($no_diag);
+
+If set true no diagnostics will be printed.  This includes calls to
+C<diag()>.
+
+=item B<no_ending>
+
+    $Test->no_ending($no_ending);
+
+Normally, Test::Builder does some extra diagnostics when the test
+ends.  It also changes the exit code as described below.
+
+If this is true, none of that will be done.
+
+=item B<no_header>
+
+    $Test->no_header($no_header);
+
+If set to true, no "1..N" header will be printed.
+
+=cut
+
+foreach my $attribute (qw(No_Header No_Ending No_Diag)) {
+    my $method = lc $attribute;
+
+    my $code = sub {
+        my( $self, $no ) = @_;
+
+        if( defined $no ) {
+            $self->{$attribute} = $no;
+        }
+        return $self->{$attribute};
     };
 
     };
 
-    return $out;
+    no strict 'refs';    ## no critic
+    *{ __PACKAGE__ . '::' . $method } = $code;
 }
 
 }
 
-sub BAILOUT { goto &BAIL_OUT }
+=back
+
+=head2 Output
 
 
-sub expected_tests {
+Controlling where the test output goes.
+
+It's ok for your test to change where STDOUT and STDERR point to,
+Test::Builder's default output settings will not be affected.
+
+=over 4
+
+=item B<diag>
+
+    $Test->diag(@msgs);
+
+Prints out the given C<@msgs>.  Like C<print>, arguments are simply
+appended together.
+
+Normally, it uses the C<failure_output()> handle, but if this is for a
+TODO test, the C<todo_output()> handle is used.
+
+Output will be indented and marked with a # so as not to interfere
+with test output.  A newline will be put on the end if there isn't one
+already.
+
+We encourage using this rather than calling print directly.
+
+Returns false.  Why?  Because C<diag()> is often used in conjunction with
+a failing test (C<ok() || diag()>) it "passes through" the failure.
+
+    return ok(...) || diag(...);
+
+=for blame transfer
+Mark Fowler <mark@twoshortplanks.com>
+
+=cut
+
+sub diag {
+    my $self = shift;
+
+    $self->_print_comment( $self->_diag_fh, @_ );
+}
+
+=item B<note>
+
+    $Test->note(@msgs);
+
+Like C<diag()>, but it prints to the C<output()> handle so it will not
+normally be seen by the user except in verbose mode.
+
+=cut
+
+sub note {
+    my $self = shift;
+
+    $self->_print_comment( $self->output, @_ );
+}
+
+sub _diag_fh {
+    my $self = shift;
+
+    local $Level = $Level + 1;
+    return $self->in_todo ? $self->todo_output : $self->failure_output;
+}
+
+sub _print_comment {
+    my( $self, $fh, @msgs ) = @_;
+
+    return if $self->no_diag;
+    return unless @msgs;
+
+    # Prevent printing headers when compiling (i.e. -c)
+    return if $^C;
+
+    # Smash args together like print does.
+    # Convert undef to 'undef' so its readable.
+    my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs;
+
+    # Escape the beginning, _print will take care of the rest.
+    $msg =~ s/^/# /;
+
+    local $Level = $Level + 1;
+    $self->_print_to_fh( $fh, $msg );
+
+    return 0;
+}
+
+=item B<explain>
+
+    my @dump = $Test->explain(@msgs);
+
+Will dump the contents of any references in a human readable format.
+Handy for things like...
+
+    is_deeply($have, $want) || diag explain $have;
+
+or
+
+    is_deeply($have, $want) || note explain $have;
+
+=cut
+
+sub explain {
     my $self = shift;
 
     my $self = shift;
 
-    my $ctx = $self->ctx;
-    $ctx->plan(@_) if @_;
+    return map {
+        ref $_
+          ? do {
+            $self->_try(sub { require Data::Dumper }, die_on_fail => 1);
 
 
-    my $plan = $ctx->stream->state->[-1]->[STATE_PLAN] || return 0;
-    return $plan->max || 0;
+            my $dumper = Data::Dumper->new( [$_] );
+            $dumper->Indent(1)->Terse(1);
+            $dumper->Sortkeys(1) if $dumper->can("Sortkeys");
+            $dumper->Dump;
+          }
+          : $_
+    } @_;
 }
 
 }
 
-sub caller {    ## no critic (Subroutines::ProhibitBuiltinHomonyms)
-    my $self = shift;
+=begin _private
 
 
-    my $ctx = $self->ctx;
+=item B<_print>
 
 
-    return wantarray ? $ctx->call : $ctx->package;
-}
+    $Test->_print(@msgs);
 
 
-sub level {
-    my( $self, $level ) = @_;
-    $Level = $level if defined $level;
-    return $Level;
-}
+Prints to the C<output()> filehandle.
 
 
-sub maybe_regex {
-    my ($self, $regex) = @_;
-    return is_regex($regex);
-}
+=end _private
 
 
-sub is_passing {
+=cut
+
+sub _print {
     my $self = shift;
     my $self = shift;
-    my $ctx = $self->ctx;
-    $ctx->stream->is_passing(@_);
+    return $self->_print_to_fh( $self->output, @_ );
 }
 
 }
 
-# Yeah, this is not efficient, but it is only legacy support, barely anything
-# uses it, and they really should not.
-sub current_test {
-    my $self = shift;
+sub _print_to_fh {
+    my( $self, $fh, @msgs ) = @_;
 
 
-    my $ctx = $self->ctx;
-
-    if (@_) {
-        my ($num) = @_;
-        my $state = $ctx->stream->state->[-1];
-        $state->[STATE_COUNT] = $num;
-
-        my $old = $state->[STATE_LEGACY] || [];
-        my $new = [];
-
-        my $nctx = $ctx->snapshot;
-        $nctx->set_todo('incrementing test number');
-        $nctx->set_in_todo(1);
-
-        for (1 .. $num) {
-            my $i;
-            $i = shift @$old while @$old && (!$i || !$i->isa('Test::Stream::Event::Ok'));
-            $i ||= Test::Stream::Event::Ok->new(
-                $nctx,
-                [CORE::caller()],
-                0,
-                undef,
-                undef,
-                undef,
-                1,
-            );
-
-            push @$new => $i;
-        }
+    # Prevent printing headers when only compiling.  Mostly for when
+    # tests are deparsed with B::Deparse
+    return if $^C;
 
 
-        $state->[STATE_LEGACY] = $new;
-    }
+    my $msg = join '', @msgs;
+    my $indent = $self->_indent;
 
 
-    $ctx->stream->count;
-}
+    local( $\, $", $, ) = ( undef, ' ', '' );
 
 
-sub details {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    my $state = $ctx->stream->state->[-1];
-    my @out;
-    return @out unless $state->[STATE_LEGACY];
+    # Escape each line after the first with a # so we don't
+    # confuse Test::Harness.
+    $msg =~ s{\n(?!\z)}{\n$indent# }sg;
 
 
-    for my $e (@{$state->[STATE_LEGACY]}) {
-        next unless $e && $e->isa('Test::Stream::Event::Ok');
-        push @out => $e->to_legacy;
-    }
+    # Stick a newline on the end if it needs it.
+    $msg .= "\n" unless $msg =~ /\n\z/;
 
 
-    return @out;
+    return print $fh $indent, $msg;
 }
 
 }
 
-sub summary {
-    my $self = shift;
-    my $ctx = $self->ctx;
-    my $state = $ctx->stream->state->[-1];
-    return @{[]} unless $state->[STATE_LEGACY];
-    return map { $_->isa('Test::Stream::Event::Ok') ? ($_->bool ? 1 : 0) : ()} @{$state->[STATE_LEGACY]};
-}
+=item B<output>
 
 
-###################################
-# }}} Misc #
-###################################
+=item B<failure_output>
 
 
-####################
-# {{{ TB1.5 stuff  #
-####################
+=item B<todo_output>
 
 
-# This is just a list of method Test::Builder current does not have that Test::Builder 1.5 does.
-my %TB15_METHODS = map { $_ => 1 } qw{
-    _file_and_line _join_message _make_default _my_exit _reset_todo_state
-    _result_to_hash _results _todo_state formatter history in_test
-    no_change_exit_code post_event post_result set_formatter set_plan test_end
-    test_exit_code test_start test_state
-};
+    my $filehandle = $Test->output;
+    $Test->output($filehandle);
+    $Test->output($filename);
+    $Test->output(\$scalar);
 
 
-our $AUTOLOAD;
+These methods control where Test::Builder will print its output.
+They take either an open C<$filehandle>, a C<$filename> to open and write to
+or a C<$scalar> reference to append to.  It will always return a C<$filehandle>.
 
 
-sub AUTOLOAD {
-    $AUTOLOAD =~ m/^(.*)::([^:]+)$/;
-    my ($package, $sub) = ($1, $2);
+B<output> is where normal "ok/not ok" test output goes.
 
 
-    my @caller = CORE::caller();
-    my $msg    = qq{Can't locate object method "$sub" via package "$package" at $caller[1] line $caller[2].\n};
+Defaults to STDOUT.
 
 
-    $msg .= <<"    EOT" if $TB15_METHODS{$sub};
+B<failure_output> is where diagnostic output on test failures and
+C<diag()> goes.  It is normally not read by Test::Harness and instead is
+displayed to the user.
 
 
-    *************************************************************************
-    '$sub' is a Test::Builder 1.5 method. Test::Builder 1.5 is a dead branch.
-    You need to update your code so that it no longer treats Test::Builders
-    over a specific version number as anything special.
+Defaults to STDERR.
 
 
-    See: http://blogs.perl.org/users/chad_exodist_granum/2014/03/testmore---new-maintainer-also-stop-version-checking.html
-    *************************************************************************
-    EOT
+C<todo_output> is used instead of C<failure_output()> for the
+diagnostics of a failing TODO test.  These will not be seen by the
+user.
 
 
-    die $msg;
-}
+Defaults to STDOUT.
 
 
-####################
-# }}} TB1.5 stuff  #
-####################
+=cut
 
 
-##################################
-# {{{ Legacy support, do not use #
-##################################
+sub output {
+    my( $self, $fh ) = @_;
 
 
-# These are here to support old versions of Test::More which may be bundled
-# with some dists. See https://github.com/Test-More/test-more/issues/479
+    if( defined $fh ) {
+        $self->{Out_FH} = $self->_new_fh($fh);
+    }
+    return $self->{Out_FH};
+}
 
 
-sub _try {
-    my( $self, $code, %opts ) = @_;
+sub failure_output {
+    my( $self, $fh ) = @_;
 
 
-    my $error;
-    my $return;
-    protect {
-        $return = eval { $code->() };
-        $error = $@;
-    };
+    if( defined $fh ) {
+        $self->{Fail_FH} = $self->_new_fh($fh);
+    }
+    return $self->{Fail_FH};
+}
 
 
-    die $error if $error and $opts{die_on_fail};
+sub todo_output {
+    my( $self, $fh ) = @_;
 
 
-    return wantarray ? ( $return, $error ) : $return;
+    if( defined $fh ) {
+        $self->{Todo_FH} = $self->_new_fh($fh);
+    }
+    return $self->{Todo_FH};
 }
 
 }
 
-sub _unoverload {
+sub _new_fh {
     my $self = shift;
     my $self = shift;
-    my $type = shift;
-
-    $self->_try(sub { require overload; }, die_on_fail => 1);
+    my($file_or_fh) = shift;
 
 
-    foreach my $thing (@_) {
-        if( $self->_is_object($$thing) ) {
-            if( my $string_meth = overload::Method( $$thing, $type ) ) {
-                $$thing = $$thing->$string_meth();
-            }
+    my $fh;
+    if( $self->is_fh($file_or_fh) ) {
+        $fh = $file_or_fh;
+    }
+    elsif( ref $file_or_fh eq 'SCALAR' ) {
+        # Scalar refs as filehandles was added in 5.8.
+        if( $] >= 5.008 ) {
+            open $fh, ">>", $file_or_fh
+              or $self->croak("Can't open scalar ref $file_or_fh: $!");
+        }
+        # Emulate scalar ref filehandles with a tie.
+        else {
+            $fh = Test::Builder::IO::Scalar->new($file_or_fh)
+              or $self->croak("Can't tie scalar ref $file_or_fh");
         }
     }
         }
     }
+    else {
+        open $fh, ">", $file_or_fh
+          or $self->croak("Can't open test output log $file_or_fh: $!");
+        _autoflush($fh);
+    }
 
 
-    return;
+    return $fh;
 }
 
 }
 
-sub _is_object {
-    my( $self, $thing ) = @_;
+sub _autoflush {
+    my($fh) = shift;
+    my $old_fh = select $fh;
+    $| = 1;
+    select $old_fh;
 
 
-    return $self->_try( sub { ref $thing && $thing->isa('UNIVERSAL') } ) ? 1 : 0;
+    return;
 }
 
 }
 
-sub _unoverload_str {
+my( $Testout, $Testerr );
+
+sub _dup_stdhandles {
     my $self = shift;
 
     my $self = shift;
 
-    return $self->_unoverload( q[""], @_ );
+    $self->_open_testhandles;
+
+    # Set everything to unbuffered else plain prints to STDOUT will
+    # come out in the wrong order from our own prints.
+    _autoflush($Testout);
+    _autoflush( \*STDOUT );
+    _autoflush($Testerr);
+    _autoflush( \*STDERR );
+
+    $self->reset_outputs;
+
+    return;
 }
 
 }
 
-sub _unoverload_num {
+sub _open_testhandles {
     my $self = shift;
 
     my $self = shift;
 
-    $self->_unoverload( '0+', @_ );
+    return if $self->{Opened_Testhandles};
 
 
-    for my $val (@_) {
-        next unless $self->_is_dualvar($$val);
-        $$val = $$val + 0;
-    }
+    # We dup STDOUT and STDERR so people can change them in their
+    # test suites while still getting normal test output.
+    open( $Testout, ">&STDOUT" ) or die "Can't dup STDOUT:  $!";
+    open( $Testerr, ">&STDERR" ) or die "Can't dup STDERR:  $!";
+
+    $self->_copy_io_layers( \*STDOUT, $Testout );
+    $self->_copy_io_layers( \*STDERR, $Testerr );
+
+    $self->{Opened_Testhandles} = 1;
 
     return;
 }
 
 
     return;
 }
 
-# This is a hack to detect a dualvar such as $!
-sub _is_dualvar {
-    my( $self, $val ) = @_;
+sub _copy_io_layers {
+    my( $self, $src, $dst ) = @_;
 
 
-    # Objects are not dualvars.
-    return 0 if ref $val;
+    $self->_try(
+        sub {
+            require PerlIO;
+            my @src_layers = PerlIO::get_layers($src);
 
 
-    no warnings 'numeric';
-    my $numval = $val + 0;
-    return ($numval != 0 and $numval ne $val ? 1 : 0);
+            _apply_layers($dst, @src_layers) if @src_layers;
+        }
+    );
+
+    return;
 }
 
 }
 
-##################################
-# }}} Legacy support, do not use #
-##################################
+sub _apply_layers {
+    my ($fh, @layers) = @_;
+    my %seen;
+    my @unique = grep { $_ ne 'unix' and !$seen{$_}++ } @layers;
+    binmode($fh, join(":", "", "raw", @unique));
+}
 
 
-1;
 
 
-__END__
+=item reset_outputs
 
 
-=pod
+  $tb->reset_outputs;
 
 
-=encoding UTF-8
+Resets all the output filehandles back to their defaults.
 
 
-=head1 NAME
+=cut
+
+sub reset_outputs {
+    my $self = shift;
 
 
-Test::Builder - *DEPRECATED* Module for building testing libraries.
+    $self->output        ($Testout);
+    $self->failure_output($Testerr);
+    $self->todo_output   ($Testout);
 
 
-=head1 DESCRIPTION
+    return;
+}
 
 
-This module was previously the base module for almost any testing library. This
-module is now little more than a compatability wrapper around L<Test::Stream>.
-If you are looking to write or update a testing library you should look at
-L<Test::Stream::Toolset>.
+=item carp
 
 
-=head1 PACKAGE VARS
+  $tb->carp(@message);
 
 
-=over 4
+Warns with C<@message> but the message will appear to come from the
+point where the original test function was called (C<< $tb->caller >>).
+
+=item croak
+
+  $tb->croak(@message);
 
 
-=item $Test::Builder::Test
+Dies with C<@message> but the message will appear to come from the
+point where the original test function was called (C<< $tb->caller >>).
 
 
-The variable that holds the Test::Builder singleton.
+=cut
 
 
-=item $Test::Builder::Level
+sub _message_at_caller {
+    my $self = shift;
+
+    local $Level = $Level + 1;
+    my( $pack, $file, $line ) = $self->caller;
+    return join( "", @_ ) . " at $file line $line.\n";
+}
+
+sub carp {
+    my $self = shift;
+    return warn $self->_message_at_caller(@_);
+}
+
+sub croak {
+    my $self = shift;
+    return die $self->_message_at_caller(@_);
+}
 
 
-In the past this variable was used to track stack depth so that Test::Builder
-could report the correct line number. If you use Test::Builder this will still
-work, but in new code it is better to use the L<Test::Stream::Context> module.
 
 =back
 
 
 =back
 
-=head1 METHODS
 
 
-=head2 CONSTRUCTORS
+=head2 Test Status and Info
 
 =over 4
 
 
 =over 4
 
-=item Test::Builder->new
+=item B<current_test>
 
 
-Returns the singleton stored in C<$Test::Builder::Test>.
+    my $curr_test = $Test->current_test;
+    $Test->current_test($num);
 
 
-=item Test::Builder->create
+Gets/sets the current test number we're on.  You usually shouldn't
+have to set this.
 
 
-=item Test::Builder->create(use_shared => 1)
+If set forward, the details of the missing tests are filled in as 'unknown'.
+if set backward, the details of the intervening tests are deleted.  You
+can erase history if you really want to.
 
 
-Returns a new instance of Test::Builder. It is important to note that this
-instance will not use the shared L<Test::Stream> object unless you pass in the
-C<< use_shared => 1 >> argument.
+=cut
 
 
-=back
+sub current_test {
+    my( $self, $num ) = @_;
+
+    lock( $self->{Curr_Test} );
+    if( defined $num ) {
+        $self->{Curr_Test} = $num;
+
+        # If the test counter is being pushed forward fill in the details.
+        my $test_results = $self->{Test_Results};
+        if( $num > @$test_results ) {
+            my $start = @$test_results ? @$test_results : 0;
+            for( $start .. $num - 1 ) {
+                $test_results->[$_] = &share(
+                    {
+                        'ok'      => 1,
+                        actual_ok => undef,
+                        reason    => 'incrementing test number',
+                        type      => 'unknown',
+                        name      => undef
+                    }
+                );
+            }
+        }
+        # If backward, wipe history.  Its their funeral.
+        elsif( $num < @$test_results ) {
+            $#{$test_results} = $num - 1;
+        }
+    }
+    return $self->{Curr_Test};
+}
 
 
-=head2 UTIL
+=item B<is_passing>
 
 
-=over 4
+   my $ok = $builder->is_passing;
 
 
-=item $TB->ctx
+Indicates if the test suite is currently passing.
 
 
-Helper method for Test::Builder to get a L<Test::Stream::Context> object.
+More formally, it will be false if anything has happened which makes
+it impossible for the test suite to pass.  True otherwise.
 
 
-=item $TB->depth
+For example, if no tests have run C<is_passing()> will be true because
+even though a suite with no tests is a failure you can add a passing
+test to it and start passing.
 
 
-Get the subtest depth
+Don't think about it too much.
 
 
-=item $TB->find_TODO
+=cut
 
 
-=item $TB->in_todo
+sub is_passing {
+    my $self = shift;
 
 
-=item $TB->todo
+    if( @_ ) {
+        $self->{Is_Passing} = shift;
+    }
 
 
-These all check on todo state and value
+    return $self->{Is_Passing};
+}
 
 
-=back
 
 
-=head2 OTHER
+=item B<summary>
 
 
-=over 4
+    my @tests = $Test->summary;
 
 
-=item $TB->caller
+A simple summary of the tests so far.  True for pass, false for fail.
+This is a logical pass/fail, so todos are passes.
 
 
-=item $TB->carp
+Of course, test #1 is $tests[0], etc...
 
 
-=item $TB->croak
+=cut
 
 
-These let you figure out when/where the test is defined in the test file.
+sub summary {
+    my($self) = shift;
 
 
-=item $TB->child
+    return map { $_->{'ok'} } @{ $self->{Test_Results} };
+}
 
 
-Start a subtest (Please do not use this)
+=item B<details>
 
 
-=item $TB->finalize
+    my @tests = $Test->details;
 
 
-Finish a subtest (Please do not use this)
+Like C<summary()>, but with a lot more detail.
 
 
-=item $TB->explain
+    $tests[$test_num - 1] = 
+            { 'ok'       => is the test considered a pass?
+              actual_ok  => did it literally say 'ok'?
+              name       => name of the test (if any)
+              type       => type of test (if any, see below).
+              reason     => reason for the above (if any)
+            };
 
 
-Interface to Data::Dumper that dumps whatever you give it.
+'ok' is true if Test::Harness will consider the test to be a pass.
 
 
-=item $TB->exported_to
+'actual_ok' is a reflection of whether or not the test literally
+printed 'ok' or 'not ok'.  This is for examining the result of 'todo'
+tests.
 
 
-This used to tell you what package used Test::Builder, it never worked well.
-The previous bad and unpredictable behavior of this has largely been preserved,
-however nothing internal uses it in any meaningful way anymore.
+'name' is the name of the test.
 
 
-=item $TB->is_fh
+'type' indicates if it was a special test.  Normal tests have a type
+of ''.  Type can be one of the following:
 
 
-Check if something is a filehandle
+    skip        see skip()
+    todo        see todo()
+    todo_skip   see todo_skip()
+    unknown     see below
 
 
-=item $TB->level
+Sometimes the Test::Builder test counter is incremented without it
+printing any test output, for example, when C<current_test()> is changed.
+In these cases, Test::Builder doesn't know the result of the test, so
+its type is 'unknown'.  These details for these tests are filled in.
+They are considered ok, but the name and actual_ok is left C<undef>.
 
 
-Get/Set C<$Test::Builder::Level>. $Level is a package var, and most things
-localize it, so this method is pretty useless.
+For example "not ok 23 - hole count # TODO insufficient donuts" would
+result in this structure:
 
 
-=item $TB->maybe_regex
+    $tests[22] =    # 23 - 1, since arrays start from 0.
+      { ok        => 1,   # logically, the test passed since its todo
+        actual_ok => 0,   # in absolute terms, it failed
+        name      => 'hole count',
+        type      => 'todo',
+        reason    => 'insufficient donuts'
+      };
 
 
-Check if something might be a regex.
+=cut
 
 
-=item $TB->reset
+sub details {
+    my $self = shift;
+    return @{ $self->{Test_Results} };
+}
 
 
-Reset the builder object to a very basic and default state. You almost
-certainly do not need this unless you are writing a tool to test testing
-libraries. Even then you probably do not want this.
+=item B<todo>
 
 
-=item $TB->todo_end
+    my $todo_reason = $Test->todo;
+    my $todo_reason = $Test->todo($pack);
 
 
-=item $TB->todo_start
+If the current tests are considered "TODO" it will return the reason,
+if any.  This reason can come from a C<$TODO> variable or the last call
+to C<todo_start()>.
 
 
-Start/end TODO state, there are better ways to do this now.
+Since a TODO test does not need a reason, this function can return an
+empty string even when inside a TODO block.  Use C<< $Test->in_todo >>
+to determine if you are currently inside a TODO block.
 
 
-=back
+C<todo()> is about finding the right package to look for C<$TODO> in.  It's
+pretty good at guessing the right package to look at.  It first looks for
+the caller based on C<$Level + 1>, since C<todo()> is usually called inside
+a test function.  As a last resort it will use C<exported_to()>.
 
 
-=head2 STREAM INTERFACE
+Sometimes there is some confusion about where C<todo()> should be looking
+for the C<$TODO> variable.  If you want to be sure, tell it explicitly
+what $pack to use.
 
 
-These simply interface into functionality of L<Test::Stream>.
+=cut
 
 
-=over 4
+sub todo {
+    my( $self, $pack ) = @_;
 
 
-=item $TB->failure_output
+    return $self->{Todo} if defined $self->{Todo};
 
 
-=item $TB->output
+    local $Level = $Level + 1;
+    my $todo = $self->find_TODO($pack);
+    return $todo if defined $todo;
 
 
-=item $TB->reset_outputs
+    return '';
+}
 
 
-=item $TB->todo_output
+=item B<find_TODO>
 
 
-These get/set the IO handle used in the 'legacy' tap encoding.
+    my $todo_reason = $Test->find_TODO();
+    my $todo_reason = $Test->find_TODO($pack);
 
 
-=item $TB->no_diag
+Like C<todo()> but only returns the value of C<$TODO> ignoring
+C<todo_start()>.
 
 
-Do not display L<Test::Stream::Event::Diag> events.
+Can also be used to set C<$TODO> to a new value while returning the
+old value:
 
 
-=item $TB->no_ending
+    my $old_reason = $Test->find_TODO($pack, 1, $new_reason);
 
 
-Do not do some special magic at the end that tells you what went wrong with
-tests.
+=cut
 
 
-=item $TB->no_header
+sub find_TODO {
+    my( $self, $pack, $set, $new_value ) = @_;
 
 
-Do not display the plan
+    $pack = $pack || $self->caller(1) || $self->exported_to;
+    return unless $pack;
 
 
-=item $TB->use_numbers
+    no strict 'refs';    ## no critic
+    my $old_value = ${ $pack . '::TODO' };
+    $set and ${ $pack . '::TODO' } = $new_value;
+    return $old_value;
+}
 
 
-Turn numbers in TAP on and off.
+=item B<in_todo>
 
 
-=back
+    my $in_todo = $Test->in_todo;
 
 
-=head2 HISTORY
+Returns true if the test is currently inside a TODO block.
 
 
-=over
+=cut
 
 
-=item $TB->details
+sub in_todo {
+    my $self = shift;
 
 
-Get all the events that occured on this object. Each event will be transformed
-into a hash that matches the legacy output of this method.
+    local $Level = $Level + 1;
+    return( defined $self->{Todo} || $self->find_TODO ) ? 1 : 0;
+}
 
 
-=item $TB->expected_tests
+=item B<todo_start>
 
 
-Set/Get expected number of tests
+    $Test->todo_start();
+    $Test->todo_start($message);
 
 
-=item $TB->has_plan
+This method allows you declare all subsequent tests as TODO tests, up until
+the C<todo_end> method has been called.
 
 
-Check if there is a plan
+The C<TODO:> and C<$TODO> syntax is generally pretty good about figuring out
+whether or not we're in a TODO test.  However, often we find that this is not
+possible to determine (such as when we want to use C<$TODO> but
+the tests are being executed in other packages which can't be inferred
+beforehand).
 
 
-=item $TB->summary
+Note that you can use this to nest "todo" tests
 
 
-List of pass/fail results.
+ $Test->todo_start('working on this');
+ # lots of code
+ $Test->todo_start('working on that');
+ # more code
+ $Test->todo_end;
+ $Test->todo_end;
 
 
-=back
+This is generally not recommended, but large testing systems often have weird
+internal needs.
 
 
-=head2 EVENT GENERATORS
+We've tried to make this also work with the TODO: syntax, but it's not
+guaranteed and its use is also discouraged:
 
 
-See L<Test::Stream::Context>, L<Test::Stream::Toolset>, and
-L<Test::More::Tools>. Calling the methods below is not advised.
+ TODO: {
+     local $TODO = 'We have work to do!';
+     $Test->todo_start('working on this');
+     # lots of code
+     $Test->todo_start('working on that');
+     # more code
+     $Test->todo_end;
+     $Test->todo_end;
+ }
 
 
-=over 4
+Pick one style or another of "TODO" to be on the safe side.
 
 
-=item $TB->BAILOUT
+=cut
 
 
-=item $TB->BAIL_OUT
+sub todo_start {
+    my $self = shift;
+    my $message = @_ ? shift : '';
 
 
-=item $TB->cmp_ok
+    $self->{Start_Todo}++;
+    if( $self->in_todo ) {
+        push @{ $self->{Todo_Stack} } => $self->todo;
+    }
+    $self->{Todo} = $message;
 
 
-=item $TB->current_test
+    return;
+}
 
 
-=item $TB->diag
+=item C<todo_end>
 
 
-=item $TB->done_testing
+ $Test->todo_end;
 
 
-=item $TB->is_eq
+Stops running tests as "TODO" tests.  This method is fatal if called without a
+preceding C<todo_start> method call.
 
 
-=item $TB->is_num
+=cut
 
 
-=item $TB->is_passing
+sub todo_end {
+    my $self = shift;
 
 
-=item $TB->isnt_eq
+    if( !$self->{Start_Todo} ) {
+        $self->croak('todo_end() called without todo_start()');
+    }
 
 
-=item $TB->isnt_num
+    $self->{Start_Todo}--;
 
 
-=item $TB->like
+    if( $self->{Start_Todo} && @{ $self->{Todo_Stack} } ) {
+        $self->{Todo} = pop @{ $self->{Todo_Stack} };
+    }
+    else {
+        delete $self->{Todo};
+    }
 
 
-=item $TB->no_plan
+    return;
+}
 
 
-=item $TB->note
+=item B<caller>
 
 
-=item $TB->ok
+    my $package = $Test->caller;
+    my($pack, $file, $line) = $Test->caller;
+    my($pack, $file, $line) = $Test->caller($height);
 
 
-=item $TB->plan
+Like the normal C<caller()>, except it reports according to your C<level()>.
 
 
-=item $TB->skip
+C<$height> will be added to the C<level()>.
 
 
-=item $TB->skip_all
+If C<caller()> winds up off the top of the stack it report the highest context.
 
 
-=item $TB->subtest
+=cut
 
 
-=item $TB->todo_skip
+sub caller {    ## no critic (Subroutines::ProhibitBuiltinHomonyms)
+    my( $self, $height ) = @_;
+    $height ||= 0;
 
 
-=item $TB->unlike
+    my $level = $self->level + $height + 1;
+    my @caller;
+    do {
+        @caller = CORE::caller( $level );
+        $level--;
+    } until @caller;
+    return wantarray ? @caller : $caller[0];
+}
 
 =back
 
 
 =back
 
-=head2 ACCESSORS
+=cut
+
+=begin _private
 
 =over 4
 
 
 =over 4
 
-=item $TB->stream
+=item B<_sanity_check>
+
+  $self->_sanity_check();
 
 
-Get the stream used by this builder (or the shared stream).
+Runs a bunch of end of test sanity checks to make sure reality came
+through ok.  If anything is wrong it will die with a fairly friendly
+error message.
 
 
-=item $TB->name
+=cut
 
 
-Name of the test
+#'#
+sub _sanity_check {
+    my $self = shift;
 
 
-=item $TB->parent
+    $self->_whoa( $self->{Curr_Test} < 0, 'Says here you ran a negative number of tests!' );
+    $self->_whoa( $self->{Curr_Test} != @{ $self->{Test_Results} },
+        'Somehow you got a different number of results than tests ran!' );
 
 
-Parent if this is a child.
+    return;
+}
 
 
-=back
+=item B<_whoa>
 
 
-=head1 MONKEYPATCHING
+  $self->_whoa($check, $description);
 
 
-Many legacy testing modules monkeypatch C<ok()>, C<plan()>, and others. The
-abillity to monkeypatch these to effect all events of the specified type is now
-considered discouraged. For backwords compatability monkeypatching continues to
-work, however in the distant future it will be removed. L<Test::Stream> upon
-which Test::Builder is now built, provides hooks and API's for doing everything
-that previously required monkeypatching.
+A sanity check, similar to C<assert()>.  If the C<$check> is true, something
+has gone horribly wrong.  It will die with the given C<$description> and
+a note to contact the author.
 
 
-=head1 TUTORIALS
+=cut
 
 
-=over 4
+sub _whoa {
+    my( $self, $check, $desc ) = @_;
+    if($check) {
+        local $Level = $Level + 1;
+        $self->croak(<<"WHOA");
+WHOA!  $desc
+This should never happen!  Please contact the author immediately!
+WHOA
+    }
+
+    return;
+}
 
 
-=item L<Test::Tutorial>
+=item B<_my_exit>
 
 
-The original L<Test::Tutorial>. Uses comedy to introduce you to testing from
-scratch.
+  _my_exit($exit_num);
 
 
-=item L<Test::Tutorial::WritingTests>
+Perl seems to have some trouble with exiting inside an C<END> block.
+5.6.1 does some odd things.  Instead, this function edits C<$?>
+directly.  It should B<only> be called from inside an C<END> block.
+It doesn't actually exit, that's your job.
 
 
-The L<Test::Tutorial::WritingTests> tutorial takes a more technical approach.
-The idea behind this tutorial is to give you a technical introduction to
-testing that can easily be used as a reference. This is for people who say
-"Just tell me how to do it, and quickly!".
+=cut
 
 
-=item L<Test::Tutorial::WritingTools>
+sub _my_exit {
+    $? = $_[0];    ## no critic (Variables::RequireLocalizedPunctuationVars)
 
 
-The L<Test::Tutorial::WritingTools> tutorial is an introduction to writing
-testing tools that play nicely with other L<Test::Stream> and L<Test::Builder>
-based tools. This is what you should look at if you want to write
-Test::MyWidget.
+    return 1;
+}
 
 =back
 
 
 =back
 
-=head1 SOURCE
+=end _private
 
 
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
+=cut
 
 
-=head1 MAINTAINER
+sub _ending {
+    my $self = shift;
+    return if $self->no_ending;
+    return if $self->{Ending}++;
 
 
-=over 4
+    my $real_exit_code = $?;
 
 
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+    # Don't bother with an ending if this is a forked copy.  Only the parent
+    # should do the ending.
+    if( $self->{Original_Pid} != $$ ) {
+        return;
+    }
 
 
-=back
+    # Ran tests but never declared a plan or hit done_testing
+    if( !$self->{Have_Plan} and $self->{Curr_Test} ) {
+        $self->is_passing(0);
+        $self->diag("Tests were run but no plan was declared and done_testing() was not seen.");
+
+        if($real_exit_code) {
+            $self->diag(<<"FAIL");
+Looks like your test exited with $real_exit_code just after $self->{Curr_Test}.
+FAIL
+            $self->is_passing(0);
+            _my_exit($real_exit_code) && return;
+        }
 
 
-=head1 AUTHORS
+        # But if the tests ran, handle exit code.
+        my $test_results = $self->{Test_Results};
+        if(@$test_results) {
+            my $num_failed = grep !$_->{'ok'}, @{$test_results}[ 0 .. $self->{Curr_Test} - 1 ];
+            if ($num_failed > 0) {
 
 
-The following people have all contributed to the Test-More dist (sorted using
-VIM's sort function).
+                my $exit_code = $num_failed <= 254 ? $num_failed : 254;
+                _my_exit($exit_code) && return;
+            }
+        }
+        _my_exit(254) && return;
+    }
 
 
-=over 4
+    # Exit if plan() was never called.  This is so "require Test::Simple"
+    # doesn't puke.
+    if( !$self->{Have_Plan} ) {
+        return;
+    }
 
 
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+    # Don't do an ending if we bailed out.
+    if( $self->{Bailed_Out} ) {
+        $self->is_passing(0);
+        return;
+    }
+    # Figure out if we passed or failed and print helpful messages.
+    my $test_results = $self->{Test_Results};
+    if(@$test_results) {
+        # The plan?  We have no plan.
+        if( $self->{No_Plan} ) {
+            $self->_output_plan($self->{Curr_Test}) unless $self->no_header;
+            $self->{Expected_Tests} = $self->{Curr_Test};
+        }
 
 
-=item Fergal Daly E<lt>fergal@esatclear.ie>E<gt>
+        # Auto-extended arrays and elements which aren't explicitly
+        # filled in with a shared reference will puke under 5.8.0
+        # ithreads.  So we have to fill them in by hand. :(
+        my $empty_result = &share( {} );
+        for my $idx ( 0 .. $self->{Expected_Tests} - 1 ) {
+            $test_results->[$idx] = $empty_result
+              unless defined $test_results->[$idx];
+        }
 
 
-=item Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
+        my $num_failed = grep !$_->{'ok'}, @{$test_results}[ 0 .. $self->{Curr_Test} - 1 ];
 
 
-=item Michael G Schwern E<lt>schwern@pobox.comE<gt>
+        my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests};
 
 
-=item 唐鳳
+        if( $num_extra != 0 ) {
+            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
+            $self->diag(<<"FAIL");
+Looks like you planned $self->{Expected_Tests} test$s but ran $self->{Curr_Test}.
+FAIL
+            $self->is_passing(0);
+        }
 
 
-=back
+        if($num_failed) {
+            my $num_tests = $self->{Curr_Test};
+            my $s = $num_failed == 1 ? '' : 's';
 
 
-=head1 COPYRIGHT
+            my $qualifier = $num_extra == 0 ? '' : ' run';
 
 
-There has been a lot of code migration between modules,
-here are all the original copyrights together:
+            $self->diag(<<"FAIL");
+Looks like you failed $num_failed test$s of $num_tests$qualifier.
+FAIL
+            $self->is_passing(0);
+        }
 
 
-=over 4
+        if($real_exit_code) {
+            $self->diag(<<"FAIL");
+Looks like your test exited with $real_exit_code just after $self->{Curr_Test}.
+FAIL
+            $self->is_passing(0);
+            _my_exit($real_exit_code) && return;
+        }
+
+        my $exit_code;
+        if($num_failed) {
+            $exit_code = $num_failed <= 254 ? $num_failed : 254;
+        }
+        elsif( $num_extra != 0 ) {
+            $exit_code = 255;
+        }
+        else {
+            $exit_code = 0;
+        }
 
 
-=item Test::Stream
+        _my_exit($exit_code) && return;
+    }
+    elsif( $self->{Skip_All} ) {
+        _my_exit(0) && return;
+    }
+    elsif($real_exit_code) {
+        $self->diag(<<"FAIL");
+Looks like your test exited with $real_exit_code before it could output anything.
+FAIL
+        $self->is_passing(0);
+        _my_exit($real_exit_code) && return;
+    }
+    else {
+        $self->diag("No tests run!\n");
+        $self->is_passing(0);
+        _my_exit(255) && return;
+    }
+
+    $self->is_passing(0);
+    $self->_whoa( 1, "We fell off the end of _ending()" );
+}
 
 
-=item Test::Stream::Tester
+END {
+    $Test->_ending if defined $Test;
+}
 
 
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
+=head1 EXIT CODES
 
 
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
+If all your tests passed, Test::Builder will exit with zero (which is
+normal).  If anything failed it will exit with how many failed.  If
+you run less (or more) tests than you planned, the missing (or extras)
+will be considered failures.  If no tests were ever run Test::Builder
+will throw a warning and exit with 255.  If the test died, even after
+having successfully completed all its tests, it will still be
+considered a failure and will exit with 255.
 
 
-See F<http://www.perl.com/perl/misc/Artistic.html>
+So the exit codes are...
 
 
-=item Test::Simple
+    0                   all tests successful
+    255                 test died or all passed but wrong # of tests run
+    any other number    how many failed (including missing or extras)
 
 
-=item Test::More
+If you fail more than 254 tests, it will be reported as 254.
 
 
-=item Test::Builder
+=head1 THREADS
 
 
-Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much
-inspiration from Joshua Pritikin's Test module and lots of help from Barrie
-Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa
-gang.
+In perl 5.8.1 and later, Test::Builder is thread-safe.  The test
+number is shared amongst all threads.  This means if one thread sets
+the test number using C<current_test()> they will all be effected.
 
 
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
+While versions earlier than 5.8.1 had threads they contain too many
+bugs to support.
 
 
-Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
+Test::Builder is only thread-aware if threads.pm is loaded I<before>
+Test::Builder.
 
 
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
+=head1 MEMORY
 
 
-See F<http://www.perl.com/perl/misc/Artistic.html>
+An informative hash, accessible via C<details()>, is stored for each
+test you perform.  So memory usage will scale linearly with each test
+run. Although this is not a problem for most test suites, it can
+become an issue if you do large (hundred thousands to million)
+combinatorics tests in the same run.
 
 
-=item Test::use::ok
+In such cases, you are advised to either split the test file into smaller
+ones, or use a reverse approach, doing "normal" (code) compares and
+triggering C<fail()> should anything go unexpected.
 
 
-To the extent possible under law, 唐鳳 has waived all copyright and related
-or neighboring rights to L<Test-use-ok>.
+Future versions of Test::Builder will have a way to turn history off.
 
 
-This work is published from Taiwan.
 
 
-L<http://creativecommons.org/publicdomain/zero/1.0>
+=head1 EXAMPLES
 
 
-=item Test::Tester
+CPAN can provide the best examples.  L<Test::Simple>, L<Test::More>,
+L<Test::Exception> and L<Test::Differences> all use Test::Builder.
 
 
-This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts
-are based on other people's work.
+=head1 SEE ALSO
 
 
-Under the same license as Perl itself
+L<Test::Simple>, L<Test::More>, L<Test::Harness>
 
 
-See http://www.perl.com/perl/misc/Artistic.html
+=head1 AUTHORS
+
+Original code by chromatic, maintained by Michael G Schwern
+E<lt>schwern@pobox.comE<gt>
 
 
-=item Test::Builder::Tester
+=head1 MAINTAINERS
 
 
-Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
+=over 4
 
 
-This program is free software; you can redistribute it
-and/or modify it under the same terms as Perl itself.
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
 
 =back
 
 =back
+
+=head1 COPYRIGHT
+
+Copyright 2002-2008 by chromatic E<lt>chromatic@wgz.orgE<gt> and
+                       Michael G Schwern E<lt>schwern@pobox.comE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
+
+1;
+
diff --git a/cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm b/cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm
new file mode 100644 (file)
index 0000000..54700c4
--- /dev/null
@@ -0,0 +1,658 @@
+package Test::Builder::IO::Scalar;
+
+
+=head1 NAME
+
+Test::Builder::IO::Scalar - A copy of IO::Scalar for Test::Builder
+
+=head1 DESCRIPTION
+
+This is a copy of L<IO::Scalar> which ships with L<Test::Builder> to
+support scalar references as filehandles on Perl 5.6.  Newer
+versions of Perl simply use C<open()>'s built in support.
+
+L<Test::Builder> can not have dependencies on other modules without
+careful consideration, so its simply been copied into the distribution.
+
+=head1 COPYRIGHT and LICENSE
+
+This file came from the "IO-stringy" Perl5 toolkit.
+
+Copyright (c) 1996 by Eryq.  All rights reserved.
+Copyright (c) 1999,2001 by ZeeGee Software Inc.  All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=cut
+
+# This is copied code, I don't care.
+##no critic
+
+use Carp;
+use strict;
+use vars qw($VERSION @ISA);
+use IO::Handle;
+
+use 5.005;
+
+### The package version, both in 1.23 style *and* usable by MakeMaker:
+$VERSION = "2.113";
+
+### Inheritance:
+@ISA = qw(IO::Handle);
+
+#==============================
+
+=head2 Construction
+
+=over 4
+
+=cut
+
+#------------------------------
+
+=item new [ARGS...]
+
+I<Class method.>
+Return a new, unattached scalar handle.
+If any arguments are given, they're sent to open().
+
+=cut
+
+sub new {
+    my $proto = shift;
+    my $class = ref($proto) || $proto;
+    my $self = bless \do { local *FH }, $class;
+    tie *$self, $class, $self;
+    $self->open(@_);   ### open on anonymous by default
+    $self;
+}
+sub DESTROY {
+    shift->close;
+}
+
+#------------------------------
+
+=item open [SCALARREF]
+
+I<Instance method.>
+Open the scalar handle on a new scalar, pointed to by SCALARREF.
+If no SCALARREF is given, a "private" scalar is created to hold
+the file data.
+
+Returns the self object on success, undefined on error.
+
+=cut
+
+sub open {
+    my ($self, $sref) = @_;
+
+    ### Sanity:
+    defined($sref) or do {my $s = ''; $sref = \$s};
+    (ref($sref) eq "SCALAR") or croak "open() needs a ref to a scalar";
+
+    ### Setup:
+    *$self->{Pos} = 0;          ### seek position
+    *$self->{SR}  = $sref;      ### scalar reference
+    $self;
+}
+
+#------------------------------
+
+=item opened
+
+I<Instance method.>
+Is the scalar handle opened on something?
+
+=cut
+
+sub opened {
+    *{shift()}->{SR};
+}
+
+#------------------------------
+
+=item close
+
+I<Instance method.>
+Disassociate the scalar handle from its underlying scalar.
+Done automatically on destroy.
+
+=cut
+
+sub close {
+    my $self = shift;
+    %{*$self} = ();
+    1;
+}
+
+=back
+
+=cut
+
+
+
+#==============================
+
+=head2 Input and output
+
+=over 4
+
+=cut
+
+
+#------------------------------
+
+=item flush
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub flush { "0 but true" }
+
+#------------------------------
+
+=item getc
+
+I<Instance method.>
+Return the next character, or undef if none remain.
+
+=cut
+
+sub getc {
+    my $self = shift;
+
+    ### Return undef right away if at EOF; else, move pos forward:
+    return undef if $self->eof;
+    substr(${*$self->{SR}}, *$self->{Pos}++, 1);
+}
+
+#------------------------------
+
+=item getline
+
+I<Instance method.>
+Return the next line, or undef on end of string.
+Can safely be called in an array context.
+Currently, lines are delimited by "\n".
+
+=cut
+
+sub getline {
+    my $self = shift;
+
+    ### Return undef right away if at EOF:
+    return undef if $self->eof;
+
+    ### Get next line:
+    my $sr = *$self->{SR};
+    my $i  = *$self->{Pos};            ### Start matching at this point.
+
+    ### Minimal impact implementation!
+    ### We do the fast fast thing (no regexps) if using the
+    ### classic input record separator.
+
+    ### Case 1: $/ is undef: slurp all...
+    if    (!defined($/)) {
+       *$self->{Pos} = length $$sr;
+        return substr($$sr, $i);
+    }
+
+    ### Case 2: $/ is "\n": zoom zoom zoom...
+    elsif ($/ eq "\012") {
+
+        ### Seek ahead for "\n"... yes, this really is faster than regexps.
+        my $len = length($$sr);
+        for (; $i < $len; ++$i) {
+           last if ord (substr ($$sr, $i, 1)) == 10;
+        }
+
+        ### Extract the line:
+        my $line;
+        if ($i < $len) {                ### We found a "\n":
+            $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos} + 1);
+            *$self->{Pos} = $i+1;            ### Remember where we finished up.
+        }
+        else {                          ### No "\n"; slurp the remainder:
+            $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos});
+            *$self->{Pos} = $len;
+        }
+        return $line;
+    }
+
+    ### Case 3: $/ is ref to int. Do fixed-size records.
+    ###        (Thanks to Dominique Quatravaux.)
+    elsif (ref($/)) {
+        my $len = length($$sr);
+               my $i = ${$/} + 0;
+               my $line = substr ($$sr, *$self->{Pos}, $i);
+               *$self->{Pos} += $i;
+        *$self->{Pos} = $len if (*$self->{Pos} > $len);
+               return $line;
+    }
+
+    ### Case 4: $/ is either "" (paragraphs) or something weird...
+    ###         This is Graham's general-purpose stuff, which might be
+    ###         a tad slower than Case 2 for typical data, because
+    ###         of the regexps.
+    else {
+        pos($$sr) = $i;
+
+       ### If in paragraph mode, skip leading lines (and update i!):
+        length($/) or
+           (($$sr =~ m/\G\n*/g) and ($i = pos($$sr)));
+
+        ### If we see the separator in the buffer ahead...
+        if (length($/)
+           ?  $$sr =~ m,\Q$/\E,g          ###   (ordinary sep) TBD: precomp!
+            :  $$sr =~ m,\n\n,g            ###   (a paragraph)
+            ) {
+            *$self->{Pos} = pos $$sr;
+            return substr($$sr, $i, *$self->{Pos}-$i);
+        }
+        ### Else if no separator remains, just slurp the rest:
+        else {
+            *$self->{Pos} = length $$sr;
+            return substr($$sr, $i);
+        }
+    }
+}
+
+#------------------------------
+
+=item getlines
+
+I<Instance method.>
+Get all remaining lines.
+It will croak() if accidentally called in a scalar context.
+
+=cut
+
+sub getlines {
+    my $self = shift;
+    wantarray or croak("can't call getlines in scalar context!");
+    my ($line, @lines);
+    push @lines, $line while (defined($line = $self->getline));
+    @lines;
+}
+
+#------------------------------
+
+=item print ARGS...
+
+I<Instance method.>
+Print ARGS to the underlying scalar.
+
+B<Warning:> this continues to always cause a seek to the end
+of the string, but if you perform seek()s and tell()s, it is
+still safer to explicitly seek-to-end before subsequent print()s.
+
+=cut
+
+sub print {
+    my $self = shift;
+    *$self->{Pos} = length(${*$self->{SR}} .= join('', @_) . (defined($\) ? $\ : ""));
+    1;
+}
+sub _unsafe_print {
+    my $self = shift;
+    my $append = join('', @_) . $\;
+    ${*$self->{SR}} .= $append;
+    *$self->{Pos}   += length($append);
+    1;
+}
+sub _old_print {
+    my $self = shift;
+    ${*$self->{SR}} .= join('', @_) . $\;
+    *$self->{Pos} = length(${*$self->{SR}});
+    1;
+}
+
+
+#------------------------------
+
+=item read BUF, NBYTES, [OFFSET]
+
+I<Instance method.>
+Read some bytes from the scalar.
+Returns the number of bytes actually read, 0 on end-of-file, undef on error.
+
+=cut
+
+sub read {
+    my $self = $_[0];
+    my $n    = $_[2];
+    my $off  = $_[3] || 0;
+
+    my $read = substr(${*$self->{SR}}, *$self->{Pos}, $n);
+    $n = length($read);
+    *$self->{Pos} += $n;
+    ($off ? substr($_[1], $off) : $_[1]) = $read;
+    return $n;
+}
+
+#------------------------------
+
+=item write BUF, NBYTES, [OFFSET]
+
+I<Instance method.>
+Write some bytes to the scalar.
+
+=cut
+
+sub write {
+    my $self = $_[0];
+    my $n    = $_[2];
+    my $off  = $_[3] || 0;
+
+    my $data = substr($_[1], $off, $n);
+    $n = length($data);
+    $self->print($data);
+    return $n;
+}
+
+#------------------------------
+
+=item sysread BUF, LEN, [OFFSET]
+
+I<Instance method.>
+Read some bytes from the scalar.
+Returns the number of bytes actually read, 0 on end-of-file, undef on error.
+
+=cut
+
+sub sysread {
+  my $self = shift;
+  $self->read(@_);
+}
+
+#------------------------------
+
+=item syswrite BUF, NBYTES, [OFFSET]
+
+I<Instance method.>
+Write some bytes to the scalar.
+
+=cut
+
+sub syswrite {
+  my $self = shift;
+  $self->write(@_);
+}
+
+=back
+
+=cut
+
+
+#==============================
+
+=head2 Seeking/telling and other attributes
+
+=over 4
+
+=cut
+
+
+#------------------------------
+
+=item autoflush
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub autoflush {}
+
+#------------------------------
+
+=item binmode
+
+I<Instance method.>
+No-op, provided for OO compatibility.
+
+=cut
+
+sub binmode {}
+
+#------------------------------
+
+=item clearerr
+
+I<Instance method.>  Clear the error and EOF flags.  A no-op.
+
+=cut
+
+sub clearerr { 1 }
+
+#------------------------------
+
+=item eof
+
+I<Instance method.>  Are we at end of file?
+
+=cut
+
+sub eof {
+    my $self = shift;
+    (*$self->{Pos} >= length(${*$self->{SR}}));
+}
+
+#------------------------------
+
+=item seek OFFSET, WHENCE
+
+I<Instance method.>  Seek to a given position in the stream.
+
+=cut
+
+sub seek {
+    my ($self, $pos, $whence) = @_;
+    my $eofpos = length(${*$self->{SR}});
+
+    ### Seek:
+    if    ($whence == 0) { *$self->{Pos} = $pos }             ### SEEK_SET
+    elsif ($whence == 1) { *$self->{Pos} += $pos }            ### SEEK_CUR
+    elsif ($whence == 2) { *$self->{Pos} = $eofpos + $pos}    ### SEEK_END
+    else                 { croak "bad seek whence ($whence)" }
+
+    ### Fixup:
+    if (*$self->{Pos} < 0)       { *$self->{Pos} = 0 }
+    if (*$self->{Pos} > $eofpos) { *$self->{Pos} = $eofpos }
+    return 1;
+}
+
+#------------------------------
+
+=item sysseek OFFSET, WHENCE
+
+I<Instance method.> Identical to C<seek OFFSET, WHENCE>, I<q.v.>
+
+=cut
+
+sub sysseek {
+    my $self = shift;
+    $self->seek (@_);
+}
+
+#------------------------------
+
+=item tell
+
+I<Instance method.>
+Return the current position in the stream, as a numeric offset.
+
+=cut
+
+sub tell { *{shift()}->{Pos} }
+
+#------------------------------
+
+=item  use_RS [YESNO]
+
+I<Instance method.>
+B<Deprecated and ignored.>
+Obey the current setting of $/, like IO::Handle does?
+Default is false in 1.x, but cold-welded true in 2.x and later.
+
+=cut
+
+sub use_RS {
+    my ($self, $yesno) = @_;
+    carp "use_RS is deprecated and ignored; \$/ is always consulted\n";
+ }
+
+#------------------------------
+
+=item setpos POS
+
+I<Instance method.>
+Set the current position, using the opaque value returned by C<getpos()>.
+
+=cut
+
+sub setpos { shift->seek($_[0],0) }
+
+#------------------------------
+
+=item getpos
+
+I<Instance method.>
+Return the current position in the string, as an opaque object.
+
+=cut
+
+*getpos = \&tell;
+
+
+#------------------------------
+
+=item sref
+
+I<Instance method.>
+Return a reference to the underlying scalar.
+
+=cut
+
+sub sref { *{shift()}->{SR} }
+
+
+#------------------------------
+# Tied handle methods...
+#------------------------------
+
+# Conventional tiehandle interface:
+sub TIEHANDLE {
+    ((defined($_[1]) && UNIVERSAL::isa($_[1], __PACKAGE__))
+     ? $_[1]
+     : shift->new(@_));
+}
+sub GETC      { shift->getc(@_) }
+sub PRINT     { shift->print(@_) }
+sub PRINTF    { shift->print(sprintf(shift, @_)) }
+sub READ      { shift->read(@_) }
+sub READLINE  { wantarray ? shift->getlines(@_) : shift->getline(@_) }
+sub WRITE     { shift->write(@_); }
+sub CLOSE     { shift->close(@_); }
+sub SEEK      { shift->seek(@_); }
+sub TELL      { shift->tell(@_); }
+sub EOF       { shift->eof(@_); }
+
+#------------------------------------------------------------
+
+1;
+
+__END__
+
+
+
+=back
+
+=cut
+
+
+=head1 WARNINGS
+
+Perl's TIEHANDLE spec was incomplete prior to 5.005_57;
+it was missing support for C<seek()>, C<tell()>, and C<eof()>.
+Attempting to use these functions with an IO::Scalar will not work
+prior to 5.005_57. IO::Scalar will not have the relevant methods
+invoked; and even worse, this kind of bug can lie dormant for a while.
+If you turn warnings on (via C<$^W> or C<perl -w>),
+and you see something like this...
+
+    attempt to seek on unopened filehandle
+
+...then you are probably trying to use one of these functions
+on an IO::Scalar with an old Perl.  The remedy is to simply
+use the OO version; e.g.:
+
+    $SH->seek(0,0);    ### GOOD: will work on any 5.005
+    seek($SH,0,0);     ### WARNING: will only work on 5.005_57 and beyond
+
+
+=head1 VERSION
+
+$Id: Scalar.pm,v 1.6 2005/02/10 21:21:53 dfs Exp $
+
+
+=head1 AUTHORS
+
+=head2 Primary Maintainer
+
+David F. Skoll (F<dfs@roaringpenguin.com>).
+
+=head2 Principal author
+
+Eryq (F<eryq@zeegee.com>).
+President, ZeeGee Software Inc (F<http://www.zeegee.com>).
+
+
+=head2 Other contributors
+
+The full set of contributors always includes the folks mentioned
+in L<IO::Stringy/"CHANGE LOG">.  But just the same, special
+thanks to the following individuals for their invaluable contributions
+(if I've forgotten or misspelled your name, please email me!):
+
+I<Andy Glew,>
+for contributing C<getc()>.
+
+I<Brandon Browning,>
+for suggesting C<opened()>.
+
+I<David Richter,>
+for finding and fixing the bug in C<PRINTF()>.
+
+I<Eric L. Brine,>
+for his offset-using read() and write() implementations.
+
+I<Richard Jones,>
+for his patches to massively improve the performance of C<getline()>
+and add C<sysread> and C<syswrite>.
+
+I<B. K. Oxley (binkley),>
+for stringification and inheritance improvements,
+and sundry good ideas.
+
+I<Doug Wilson,>
+for the IO::Handle inheritance and automatic tie-ing.
+
+
+=head1 SEE ALSO
+
+L<IO::String>, which is quite similar but which was designed
+more-recently and with an IO::Handle-like interface in mind,
+so you could mix OO- and native-filehandle usage without using tied().
+
+I<Note:> as of version 2.x, these classes all work like
+their IO::Handle counterparts, so we have comparable
+functionality to IO::String.
+
+=cut
+
index a5d8eba..2322d8a 100644 (file)
@@ -2,27 +2,18 @@ package Test::Builder::Module;
 
 use strict;
 
 
 use strict;
 
-use Test::Stream 1.301001 '-internal';
-use Test::Builder 0.99;
+use Test::Builder 1.00;
 
 require Exporter;
 our @ISA = qw(Exporter);
 
 
 require Exporter;
 our @ISA = qw(Exporter);
 
-our $VERSION = '1.301001_098';
+our $VERSION = '1.001014';
 $VERSION = eval $VERSION;      ## no critic (BuiltinFunctions::ProhibitStringyEval)
 
 $VERSION = eval $VERSION;      ## no critic (BuiltinFunctions::ProhibitStringyEval)
 
-=pod
-
-=encoding UTF-8
 
 =head1 NAME
 
 
 =head1 NAME
 
-Test::Builder::Module - *DEPRECATED* Base class for test modules
-
-=head1 DEPRECATED
-
-B<This module is deprecated> See L<Test::Stream::Toolset> for what you should
-use instead.
+Test::Builder::Module - Base class for test modules
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
@@ -38,15 +29,12 @@ use instead.
       my $tb = $CLASS->builder;
       return $tb->ok(@_);
   }
       my $tb = $CLASS->builder;
       return $tb->ok(@_);
   }
-
+  
   1;
 
 
 =head1 DESCRIPTION
 
   1;
 
 
 =head1 DESCRIPTION
 
-B<This module is deprecated> See L<Test::Stream::Toolset> for what you should
-use instead.
-
 This is a superclass for L<Test::Builder>-based modules.  It provides a
 handful of common functionality and a method of getting at the underlying
 L<Test::Builder> object.
 This is a superclass for L<Test::Builder>-based modules.  It provides a
 handful of common functionality and a method of getting at the underlying
 L<Test::Builder> object.
@@ -68,8 +56,8 @@ same basic way as L<Test::More>'s, setting the plan and controlling
 exporting of functions and variables.  This allows your module to set
 the plan independent of L<Test::More>.
 
 exporting of functions and variables.  This allows your module to set
 the plan independent of L<Test::More>.
 
-All arguments passed to C<import()> are passed onto
-C<< Your::Module->builder->plan() >> with the exception of
+All arguments passed to C<import()> are passed onto 
+C<< Your::Module->builder->plan() >> with the exception of 
 C<< import =>[qw(things to import)] >>.
 
     use Your::Module import => [qw(this that)], tests => 23;
 C<< import =>[qw(things to import)] >>.
 
     use Your::Module import => [qw(this that)], tests => 23;
@@ -88,14 +76,12 @@ C<import_extra()>.
 sub import {
     my($class) = shift;
 
 sub import {
     my($class) = shift;
 
-    my $test = $class->builder;
-    my $caller = caller;
-
-    warn __PACKAGE__ . " is deprecated!\n" if $caller->can('TB_INSTANCE') && $caller->TB_INSTANCE->modern;
-
     # Don't run all this when loading ourself.
     return 1 if $class eq 'Test::Builder::Module';
 
     # Don't run all this when loading ourself.
     return 1 if $class eq 'Test::Builder::Module';
 
+    my $test = $class->builder;
+
+    my $caller = caller;
 
     $test->exported_to($caller);
 
 
     $test->exported_to($caller);
 
@@ -185,103 +171,3 @@ sub builder {
 }
 
 1;
 }
 
 1;
-
-__END__
-
-=head1 SOURCE
-
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
-
-=head1 MAINTAINER
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=back
-
-=head1 AUTHORS
-
-The following people have all contributed to the Test-More dist (sorted using
-VIM's sort function).
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=item Fergal Daly E<lt>fergal@esatclear.ie>E<gt>
-
-=item Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
-
-=item Michael G Schwern E<lt>schwern@pobox.comE<gt>
-
-=item 唐鳳
-
-=back
-
-=head1 COPYRIGHT
-
-There has been a lot of code migration between modules,
-here are all the original copyrights together:
-
-=over 4
-
-=item Test::Stream
-
-=item Test::Stream::Tester
-
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::Simple
-
-=item Test::More
-
-=item Test::Builder
-
-Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much
-inspiration from Joshua Pritikin's Test module and lots of help from Barrie
-Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa
-gang.
-
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
-
-Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::use::ok
-
-To the extent possible under law, 唐鳳 has waived all copyright and related
-or neighboring rights to L<Test-use-ok>.
-
-This work is published from Taiwan.
-
-L<http://creativecommons.org/publicdomain/zero/1.0>
-
-=item Test::Tester
-
-This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts
-are based on other people's work.
-
-Under the same license as Perl itself
-
-See http://www.perl.com/perl/misc/Artistic.html
-
-=item Test::Builder::Tester
-
-Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
-
-This program is free software; you can redistribute it
-and/or modify it under the same terms as Perl itself.
-
-=back
index 8762147..b0554b8 100644 (file)
@@ -1,28 +1,17 @@
 package Test::Builder::Tester;
 
 use strict;
 package Test::Builder::Tester;
 
 use strict;
-our $VERSION = '1.301001_098';
-$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
+our $VERSION = "1.28";
 
 
-use Test::Stream 1.301001 '-internal';
-use Test::Builder 1.301001;
+use Test::Builder 0.99;
 use Symbol;
 use Symbol;
-use Test::Stream::Carp qw/croak/;
-
-=pod
-
-=encoding UTF-8
+use Carp;
 
 =head1 NAME
 
 
 =head1 NAME
 
-Test::Builder::Tester - *DEPRECATED* test testsuites that have been built with
+Test::Builder::Tester - test testsuites that have been built with
 Test::Builder
 
 Test::Builder
 
-=head1 DEPRECATED
-
-B<This module is deprecated.> Please see L<Test::Stream::Tester> for a
-better alternative that does not involve dealing with TAP/string output.
-
 =head1 SYNOPSIS
 
     use Test::Builder::Tester tests => 1;
 =head1 SYNOPSIS
 
     use Test::Builder::Tester tests => 1;
@@ -59,55 +48,37 @@ output.
 # set up testing
 ####
 
 # set up testing
 ####
 
-#my $t = Test::Builder->new;
+my $t = Test::Builder->new;
 
 ###
 # make us an exporter
 ###
 
 
 ###
 # make us an exporter
 ###
 
-use Test::Stream::Toolset;
-use Test::Stream::Exporter;
-default_exports qw/test_out test_err test_fail test_diag test_test line_num/;
-Test::Stream::Exporter->cleanup;
+use Exporter;
+our @ISA = qw(Exporter);
+
+our @EXPORT = qw(test_out test_err test_fail test_diag test_test line_num);
 
 
-sub before_import {
+sub import {
     my $class = shift;
     my $class = shift;
-    my ($importer, $list) = @_;
+    my(@plan) = @_;
 
 
-    my $meta    = init_tester($importer);
-    my $context = context(1);
-    my $other   = [];
-    my $idx     = 0;
+    my $caller = caller;
 
 
-    while ($idx <= $#{$list}) {
-        my $item = $list->[$idx++];
-        next unless $item;
+    $t->exported_to($caller);
+    $t->plan(@plan);
 
 
-        if (defined $item and $item eq 'no_diag') {
-            Test::Stream->shared->set_no_diag(1);
-        }
-        elsif ($item eq 'tests') {
-            $context->plan($list->[$idx++]);
-        }
-        elsif ($item eq 'skip_all') {
-            $context->plan(0, 'SKIP', $list->[$idx++]);
-        }
-        elsif ($item eq 'no_plan') {
-            $context->plan(0, 'NO PLAN');
-        }
-        elsif ($item eq 'import') {
-            push @$other => @{$list->[$idx++]};
+    my @imports = ();
+    foreach my $idx ( 0 .. $#plan ) {
+        if( $plan[$idx] eq 'import' ) {
+            @imports = @{ $plan[ $idx + 1 ] };
+            last;
         }
     }
 
         }
     }
 
-    @$list = @$other;
-
-    return;
+    __PACKAGE__->export_to_level( 1, __PACKAGE__, @imports );
 }
 
 }
 
-
-sub builder { Test::Builder->new }
-
 ###
 # set up file handles
 ###
 ###
 # set up file handles
 ###
@@ -129,9 +100,6 @@ my $testing = 0;
 my $testing_num;
 my $original_is_passing;
 
 my $testing_num;
 my $original_is_passing;
 
-my $original_stream;
-my $original_state;
-
 # remembering where the file handles were originally connected
 my $original_output_handle;
 my $original_failure_handle;
 # remembering where the file handles were originally connected
 my $original_output_handle;
 my $original_failure_handle;
@@ -146,18 +114,15 @@ sub _start_testing {
     $original_harness_env = $ENV{HARNESS_ACTIVE} || 0;
     $ENV{HARNESS_ACTIVE} = 0;
 
     $original_harness_env = $ENV{HARNESS_ACTIVE} || 0;
     $ENV{HARNESS_ACTIVE} = 0;
 
-    $original_stream = builder->{stream} || Test::Stream->shared;
-    $original_state  = [@{$original_stream->state->[-1]}];
-
     # remember what the handles were set to
     # remember what the handles were set to
-    $original_output_handle  = builder()->output();
-    $original_failure_handle = builder()->failure_output();
-    $original_todo_handle    = builder()->todo_output();
+    $original_output_handle  = $t->output();
+    $original_failure_handle = $t->failure_output();
+    $original_todo_handle    = $t->todo_output();
 
     # switch out to our own handles
 
     # switch out to our own handles
-    builder()->output($output_handle);
-    builder()->failure_output($error_handle);
-    builder()->todo_output($output_handle);
+    $t->output($output_handle);
+    $t->failure_output($error_handle);
+    $t->todo_output($output_handle);
 
     # clear the expected list
     $out->reset();
 
     # clear the expected list
     $out->reset();
@@ -165,13 +130,13 @@ sub _start_testing {
 
     # remember that we're testing
     $testing     = 1;
 
     # remember that we're testing
     $testing     = 1;
-    $testing_num = builder()->current_test;
-    builder()->current_test(0);
-    $original_is_passing  = builder()->is_passing;
-    builder()->is_passing(1);
+    $testing_num = $t->current_test;
+    $t->current_test(0);
+    $original_is_passing  = $t->is_passing;
+    $t->is_passing(1);
 
     # look, we shouldn't do the ending stuff
 
     # look, we shouldn't do the ending stuff
-    builder()->no_ending(1);
+    $t->no_ending(1);
 }
 
 =head2 Functions
 }
 
 =head2 Functions
@@ -209,7 +174,6 @@ output filehandles)
 =cut
 
 sub test_out {
 =cut
 
 sub test_out {
-    my $ctx = context;
     # do we need to do any setup?
     _start_testing() unless $testing;
 
     # do we need to do any setup?
     _start_testing() unless $testing;
 
@@ -217,7 +181,6 @@ sub test_out {
 }
 
 sub test_err {
 }
 
 sub test_err {
-    my $ctx = context;
     # do we need to do any setup?
     _start_testing() unless $testing;
 
     # do we need to do any setup?
     _start_testing() unless $testing;
 
@@ -251,7 +214,6 @@ more simply as:
 =cut
 
 sub test_fail {
 =cut
 
 sub test_fail {
-    my $ctx = context;
     # do we need to do any setup?
     _start_testing() unless $testing;
 
     # do we need to do any setup?
     _start_testing() unless $testing;
 
@@ -294,13 +256,12 @@ without the newlines.
 =cut
 
 sub test_diag {
 =cut
 
 sub test_diag {
-    my $ctx = context;
     # do we need to do any setup?
     _start_testing() unless $testing;
 
     # expect the same thing, but prepended with "#     "
     local $_;
     # do we need to do any setup?
     _start_testing() unless $testing;
 
     # expect the same thing, but prepended with "#     "
     local $_;
-    $err->expect( map { m/\S/ ? "# $_" : "" } @_ );
+    $err->expect( map { "# $_" } @_ );
 }
 
 =item test_test
 }
 
 =item test_test
@@ -343,7 +304,6 @@ will function normally and cause success/errors for L<Test::Harness>.
 =cut
 
 sub test_test {
 =cut
 
 sub test_test {
-    my $ctx = context;
     # decode the arguments as described in the pod
     my $mess;
     my %args;
     # decode the arguments as described in the pod
     my $mess;
     my %args;
@@ -362,23 +322,21 @@ sub test_test {
       unless $testing;
 
     # okay, reconnect the test suite back to the saved handles
       unless $testing;
 
     # okay, reconnect the test suite back to the saved handles
-    builder()->output($original_output_handle);
-    builder()->failure_output($original_failure_handle);
-    builder()->todo_output($original_todo_handle);
+    $t->output($original_output_handle);
+    $t->failure_output($original_failure_handle);
+    $t->todo_output($original_todo_handle);
 
     # restore the test no, etc, back to the original point
 
     # restore the test no, etc, back to the original point
-    builder()->current_test($testing_num);
+    $t->current_test($testing_num);
     $testing = 0;
     $testing = 0;
-    builder()->is_passing($original_is_passing);
+    $t->is_passing($original_is_passing);
 
     # re-enable the original setting of the harness
     $ENV{HARNESS_ACTIVE} = $original_harness_env;
 
 
     # re-enable the original setting of the harness
     $ENV{HARNESS_ACTIVE} = $original_harness_env;
 
-    @{$original_stream->state->[-1]} = @$original_state;
-
     # check the output we've stashed
     # check the output we've stashed
-    unless( builder()->ok( ( $args{skip_out} || $out->check ) &&
-                    ( $args{skip_err} || $err->check ), $mess )
+    unless( $t->ok( ( $args{skip_out} || $out->check ) &&
+                    ( $args{skip_err} || $err->check ), $mess ) 
     )
     {
         # print out the diagnostic information about why this
     )
     {
         # print out the diagnostic information about why this
@@ -386,10 +344,10 @@ sub test_test {
 
         local $_;
 
 
         local $_;
 
-        builder()->diag( map { "$_\n" } $out->complaint )
+        $t->diag( map { "$_\n" } $out->complaint )
           unless $args{skip_out} || $out->check;
 
           unless $args{skip_out} || $out->check;
 
-        builder()->diag( map { "$_\n" } $err->complaint )
+        $t->diag( map { "$_\n" } $err->complaint )
           unless $args{skip_err} || $err->check;
     }
 }
           unless $args{skip_err} || $err->check;
     }
 }
@@ -460,112 +418,48 @@ sub color {
 
 =back
 
 
 =back
 
-=head1 NOTES
-
-Thanks to Richard Clamp E<lt>richardc@unixbeard.netE<gt> for letting
-me use his testing system to try this module out on.
+=head1 BUGS
 
 
-=head1 SEE ALSO
-
-L<Test::Builder>, L<Test::Builder::Tester::Color>, L<Test::More>.
+Calls C<< Test::Builder->no_ending >> turning off the ending tests.
+This is needed as otherwise it will trip out because we've run more
+tests than we strictly should have and it'll register any failures we
+had that we were testing for as real failures.
 
 
-=head1 SOURCE
+The color function doesn't work unless L<Term::ANSIColor> is
+compatible with your terminal.
 
 
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
+Bugs (and requests for new features) can be reported to the author
+though the CPAN RT system:
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Builder-Tester>
 
 
-=head1 MAINTAINER
+=head1 AUTHOR
 
 
-=over 4
+Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
 
 
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+Some code taken from L<Test::More> and L<Test::Catch>, written by
+Michael G Schwern E<lt>schwern@pobox.comE<gt>.  Hence, those parts
+Copyright Micheal G Schwern 2001.  Used and distributed with
+permission.
 
 
-=back
-
-=head1 AUTHORS
+This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
 
 
-The following people have all contributed to the Test-More dist (sorted using
-VIM's sort function).
+=head1 MAINTAINERS
 
 =over 4
 
 =item Chad Granum E<lt>exodist@cpan.orgE<gt>
 
 
 =over 4
 
 =item Chad Granum E<lt>exodist@cpan.orgE<gt>
 
-=item Fergal Daly E<lt>fergal@esatclear.ie>E<gt>
-
-=item Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
-
-=item Michael G Schwern E<lt>schwern@pobox.comE<gt>
-
-=item 唐鳳
-
 =back
 
 =back
 
-=head1 COPYRIGHT
-
-There has been a lot of code migration between modules,
-here are all the original copyrights together:
-
-=over 4
-
-=item Test::Stream
-
-=item Test::Stream::Tester
-
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::Simple
-
-=item Test::More
-
-=item Test::Builder
-
-Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much
-inspiration from Joshua Pritikin's Test module and lots of help from Barrie
-Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa
-gang.
-
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
-
-Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::use::ok
-
-To the extent possible under law, 唐鳳 has waived all copyright and related
-or neighboring rights to L<Test-use-ok>.
-
-This work is published from Taiwan.
-
-L<http://creativecommons.org/publicdomain/zero/1.0>
-
-=item Test::Tester
-
-This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts
-are based on other people's work.
-
-Under the same license as Perl itself
-
-See http://www.perl.com/perl/misc/Artistic.html
-
-=item Test::Builder::Tester
+=head1 NOTES
 
 
-Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
+Thanks to Richard Clamp E<lt>richardc@unixbeard.netE<gt> for letting
+me use his testing system to try this module out on.
 
 
-This program is free software; you can redistribute it
-and/or modify it under the same terms as Perl itself.
+=head1 SEE ALSO
 
 
-=back
+L<Test::Builder>, L<Test::Builder::Tester::Color>, L<Test::More>.
 
 =cut
 
 
 =cut
 
@@ -593,10 +487,8 @@ sub expect {
 sub _account_for_subtest {
     my( $self, $check ) = @_;
 
 sub _account_for_subtest {
     my( $self, $check ) = @_;
 
-    my $ctx = Test::Stream::Context::context();
-    my $depth = @{$ctx->stream->subtests};
     # Since we ship with Test::Builder, calling a private method is safe...ish.
     # Since we ship with Test::Builder, calling a private method is safe...ish.
-    return ref($check) ? $check : ($depth ? '    ' x $depth : '') . $check;
+    return ref($check) ? $check : $t->_indent . $check;
 }
 
 sub _translate_Failed_check {
 }
 
 sub _translate_Failed_check {
index 675a86a..9a89310 100644 (file)
@@ -1,15 +1,10 @@
 package Test::Builder::Tester::Color;
 
 use strict;
 package Test::Builder::Tester::Color;
 
 use strict;
-our $VERSION = '1.301001_098';
-$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
+our $VERSION = "1.290001";
 
 
-use Test::Stream 1.301001 '-internal';
 require Test::Builder::Tester;
 
 require Test::Builder::Tester;
 
-=pod
-
-=encoding UTF-8
 
 =head1 NAME
 
 
 =head1 NAME
 
@@ -54,103 +49,3 @@ L<Test::Builder::Tester>, L<Term::ANSIColor>
 =cut
 
 1;
 =cut
 
 1;
-
-__END__
-
-=head1 SOURCE
-
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
-
-=head1 MAINTAINER
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=back
-
-=head1 AUTHORS
-
-The following people have all contributed to the Test-More dist (sorted using
-VIM's sort function).
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=item Fergal Daly E<lt>fergal@esatclear.ie>E<gt>
-
-=item Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
-
-=item Michael G Schwern E<lt>schwern@pobox.comE<gt>
-
-=item 唐鳳
-
-=back
-
-=head1 COPYRIGHT
-
-There has been a lot of code migration between modules,
-here are all the original copyrights together:
-
-=over 4
-
-=item Test::Stream
-
-=item Test::Stream::Tester
-
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::Simple
-
-=item Test::More
-
-=item Test::Builder
-
-Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much
-inspiration from Joshua Pritikin's Test module and lots of help from Barrie
-Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa
-gang.
-
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
-
-Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::use::ok
-
-To the extent possible under law, 唐鳳 has waived all copyright and related
-or neighboring rights to L<Test-use-ok>.
-
-This work is published from Taiwan.
-
-L<http://creativecommons.org/publicdomain/zero/1.0>
-
-=item Test::Tester
-
-This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts
-are based on other people's work.
-
-Under the same license as Perl itself
-
-See http://www.perl.com/perl/misc/Artistic.html
-
-=item Test::Builder::Tester
-
-Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
-
-This program is free software; you can redistribute it
-and/or modify it under the same terms as Perl itself.
-
-=back
diff --git a/cpan/Test-Simple/lib/Test/CanFork.pm b/cpan/Test-Simple/lib/Test/CanFork.pm
deleted file mode 100644 (file)
index c94614c..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-package Test::CanFork;
-use strict;
-use warnings;
-
-use Config;
-
-my $Can_Fork = $Config{d_fork}
-    || (($^O eq 'MSWin32' || $^O eq 'NetWare')
-    and $Config{useithreads}
-    and $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/);
-
-sub import {
-    my $class = shift;
-
-    if (!$Can_Fork) {
-        require Test::More;
-        Test::More::plan(skip_all => "This system cannot fork");
-    }
-
-    if ($^O eq 'MSWin32' && $] == 5.010000) {
-        require Test::More;
-        Test::More::plan('skip_all' => "5.10 has fork/threading issues that break fork on win32");
-    }
-
-    for my $var (@_) {
-        next if $ENV{$var};
-
-        require Test::More;
-        Test::More::plan(skip_all => "This forking test will only run when the '$var' environment variable is set.");
-    }
-}
-
-1;
-
-__END__
-
-=head1 NAME
-
-Test::CanFork - Only run tests when forking is supported, optionally conditioned on ENV vars.
-
-=head1 DESCRIPTION
-
-Use this first thing in a test that should be skipped when forking is not
-supported. You can also specify that the test should be skipped when specific
-environment variables are not set.
-
-=head1 SYNOPSYS
-
-Skip the test if forking is unsupported:
-
-    use Test::CanFork;
-    use Test::More;
-    ...
-
-Skip the test if forking is unsupported, or any of the specified env vars are
-not set:
-
-    use Test::CanFork qw/AUTHOR_TESTING RUN_PROBLEMATIC_TESTS .../;
-    use Test::More;
-    ...
-
-=head1 SOURCE
-
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
-
-=head1 MAINTAINER
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=back
-
-=head1 AUTHORS
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=back
-
-=head1 COPYRIGHT
-
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=cut
diff --git a/cpan/Test-Simple/lib/Test/CanThread.pm b/cpan/Test-Simple/lib/Test/CanThread.pm
deleted file mode 100644 (file)
index 0e022f0..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-package Test::CanThread;
-use strict;
-use warnings;
-
-use Config;
-
-my $works = 1;
-$works &&= $] >= 5.008001;
-$works &&= $Config{'useithreads'};
-$works &&= eval { require threads; 'threads'->import; 1 };
-
-sub import {
-    my $class = shift;
-
-    unless ($works) {
-        require Test::More;
-        Test::More::plan(skip_all => "Skip no working threads");
-    }
-
-    if ($INC{'Devel/Cover.pm'}) {
-        require Test::More;
-        Test::More::plan(skip_all => "Devel::Cover does not work with threads yet");
-    }
-
-    while(my $var = shift(@_)) {
-        next if $ENV{$var};
-
-        require Test::More;
-        Test::More::plan(skip_all => "This threaded test will only run when the '$var' environment variable is set.");
-    }
-
-    if ($] == 5.010000) {
-        require File::Temp;
-        require File::Spec;
-
-        my $perl = File::Spec->rel2abs($^X);
-        my ($fh, $fn) = File::Temp::tempfile();
-        print $fh <<'        EOT';
-            BEGIN { print STDERR "# Checking for thread segfaults\n# " }
-            use threads;
-            my $t = threads->create(sub { 1 });
-            $t->join;
-            print STDERR "Threads appear to work\n";
-            exit 0;
-        EOT
-        close($fh);
-
-        my $exit = system(qq{"$perl" "$fn"});
-
-        if ($exit) {
-            require Test::More;
-            Test::More::plan(skip_all => "Threads segfault on this perl");
-        }
-    }
-
-    my $caller = caller;
-    eval "package $caller; use threads; 1" || die $@;
-}
-
-1;
-
-__END__
-
-=head1 NAME
-
-Test::CanThread - Only run tests when threading is supported, optionally conditioned on ENV vars.
-
-=head1 DESCRIPTION
-
-Use this first thing in a test that should be skipped when threading is not
-supported. You can also specify that the test should be skipped when specific
-environment variables are not set.
-
-=head1 SYNOPSYS
-
-Skip the test if threading is unsupported:
-
-    use Test::CanThread;
-    use Test::More;
-    ...
-
-Skip the test if threading is unsupported, or any of the specified env vars are
-not set:
-
-    use Test::CanThread qw/AUTHOR_TESTING RUN_PROBLEMATIC_TESTS .../;
-    use Test::More;
-    ...
-
-=head1 SOURCE
-
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
-
-=head1 MAINTAINER
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=back
-
-=head1 AUTHORS
-
-=over 4
-
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
-
-=back
-
-=head1 COPYRIGHT
-
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=cut
index 8b812ac..4bab267 100644 (file)
 package Test::More;
 
 package Test::More;
 
-use 5.008001;
+use 5.006;
 use strict;
 use warnings;
 
 use strict;
 use warnings;
 
-our $VERSION = '1.301001_098';
-$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
-
-use Test::Stream 1.301001 '-internal';
-use Test::Stream::Util qw/protect try spoof/;
-use Test::Stream::Toolset qw/is_tester init_tester context before_import/;
-use Test::Stream::Subtest qw/subtest/;
-
-use Test::Stream::Carp qw/croak carp/;
-use Scalar::Util qw/blessed/;
-
-use Test::More::Tools;
-use Test::More::DeepCheck::Strict;
-
-use Test::Builder;
-
-use Test::Stream::Exporter qw/
-    default_export default_exports export_to export_to_level
-/;
-
-our $TODO;
-default_export '$TODO' => \$TODO;
-default_exports qw{
-    plan done_testing
+#---- perlcritic exemptions. ----#
 
 
-    ok
-    is isnt
-    like unlike
-    cmp_ok
-    is_deeply
-    eq_array eq_hash eq_set
-    can_ok isa_ok new_ok
-    pass fail
-    require_ok use_ok
-    subtest
-
-    explain
-
-    diag note
-
-    skip todo_skip
-    BAIL_OUT
-};
-Test::Stream::Exporter->cleanup;
-
-{
-    no warnings 'once';
-    $Test::Builder::Level ||= 1;
-}
-
-sub import {
-    my $class = shift;
-    my $caller = caller;
-    my @args = @_;
+# We use a lot of subroutine prototypes
+## no critic (Subroutines::ProhibitSubroutinePrototypes)
 
 
-    my $stash = $class->before_import($caller, \@args) if $class->can('before_import');
-    export_to($class, $caller, @args);
-    $class->after_import($caller, $stash, @args) if $class->can('after_import');
-    $class->import_extra(@args);
+# Can't use Carp because it might cause C<use_ok()> to accidentally succeed
+# even though the module being used forgot to use Carp.  Yes, this
+# actually happened.
+sub _carp {
+    my( $file, $line ) = ( caller(1) )[ 1, 2 ];
+    return warn @_, " at $file line $line\n";
 }
 
 }
 
-sub import_extra { 1 };
-
-sub builder { Test::Builder->new }
-
-sub ok ($;$) {
-    my ($test, $name) = @_;
-    my $ctx  = context();
-    if($test) {
-        $ctx->ok(1, $name);
-        return 1;
-    }
-    else {
-        $ctx->ok(0, $name);
-        return 0;
-    }
-}
-
-sub plan {
-    return unless @_;
-    my ($directive, $arg) = @_;
-    my $ctx = context();
-
-    if ($directive eq 'tests') {
-        $ctx->plan($arg);
-    }
-    else {
-        $ctx->plan(0, $directive, $arg);
-    }
-}
-
-sub done_testing {
-    my ($num) = @_;
-    my $ctx = context();
-    $ctx->done_testing($num);
-}
-
-sub is($$;$) {
-    my ($got, $want, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = tmt->is_eq($got, $want);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub isnt ($$;$) {
-    my ($got, $forbid, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = tmt->isnt_eq($got, $forbid);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-{
-    no warnings 'once';
-    *isn't = \&isnt;
-    # ' to unconfuse syntax higlighters
-}
-
-sub like ($$;$) {
-    my ($got, $check, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = tmt->regex_check($got, $check, '=~');
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub unlike ($$;$) {
-    my ($got, $forbid, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = tmt->regex_check($got, $forbid, '!~');
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub cmp_ok($$$;$) {
-    my ($got, $type, $expect, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = tmt->cmp_check($got, $type, $expect);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub can_ok($@) {
-    my ($thing, @methods) = @_;
-    my $ctx = context();
-
-    my $class = ref $thing || $thing || '';
-    my ($ok, @diag);
-
-    if (!@methods) {
-        ($ok, @diag) = (0, "    can_ok() called with no methods");
-    }
-    elsif (!$class) {
-        ($ok, @diag) = (0, "    can_ok() called with empty class or reference");
-    }
-    else {
-        ($ok, @diag) = tmt->can_check($thing, $class, @methods);
-    }
-
-    my $name = (@methods == 1 && defined $methods[0])
-        ? "$class\->can('$methods[0]')"
-        : "$class\->can(...)";
-
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub isa_ok ($$;$) {
-    my ($thing, $class, $thing_name) = @_;
-    my $ctx = context();
-    $thing_name = "'$thing_name'" if $thing_name;
-    my ($ok, @diag) = tmt->isa_check($thing, $class, \$thing_name);
-    my $name = "$thing_name isa '$class'";
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub new_ok {
-    croak "new_ok() must be given at least a class" unless @_;
-    my ($class, $args, $object_name) = @_;
-    my $ctx = context();
-    my ($obj, $name, $ok, @diag) = tmt->new_check($class, $args, $object_name);
-    $ctx->ok($ok, $name, \@diag);
-    return $obj;
-}
-
-sub pass (;$) {
-    my $ctx = context();
-    return $ctx->ok(1, @_);
-}
-
-sub fail (;$) {
-    my $ctx = context();
-    return $ctx->ok(0, @_);
-}
-
-sub explain {
-    my $ctx = context();
-    tmt->explain(@_);
-}
-
-sub diag {
-    my $ctx = context();
-    $ctx->diag($_) for @_;
-}
-
-sub note {
-    my $ctx = context();
-    $ctx->note($_) for @_;
-}
-
-sub skip {
-    my( $why, $how_many ) = @_;
-    my $ctx = context();
-
-    _skip($why, $how_many, 'skip', 1);
-
-    no warnings 'exiting';
-    last SKIP;
-}
-
-sub _skip {
-    my( $why, $how_many, $func, $bool ) = @_;
-    my $ctx = context();
-
-    my $plan = $ctx->stream->plan;
-
-    # If there is no plan we do not need to worry about counts
-    my $need_count = $plan ? !($plan->directive && $plan->directive eq 'NO PLAN') : 0;
-
-    if ($need_count && !defined $how_many) {
-        $ctx->alert("$func() needs to know \$how_many tests are in the block");
-    }
-
-    $ctx->alert("$func() was passed a non-numeric number of tests.  Did you get the arguments backwards?")
-        if defined $how_many and $how_many =~ /\D/;
-
-    $how_many = 1 unless defined $how_many;
-    $ctx->set_skip($why);
-    for( 1 .. $how_many ) {
-        $ctx->ok($bool, '');
-    }
-}
-
-sub todo_skip {
-    my($why, $how_many) = @_;
-
-    my $ctx = context();
-    $ctx->set_in_todo(1);
-    $ctx->set_todo($why);
-    _skip($why, $how_many, 'todo_skip', 0);
-
-    no warnings 'exiting';
-    last TODO;
-}
-
-sub BAIL_OUT {
-    my ($reason) = @_;
-    my $ctx = context();
-    $ctx->bail($reason);
-}
-
-sub is_deeply {
-    my ($got, $want, $name) = @_;
-
-    my $ctx = context();
-
-    unless( @_ == 2 or @_ == 3 ) {
-        my $msg = <<'WARNING';
-is_deeply() takes two or three args, you gave %d.
-This usually means you passed an array or hash instead
-of a reference to it
-WARNING
-        chop $msg;    # clip off newline so carp() will put in line/file
-
-        $ctx->alert(sprintf $msg, scalar @_);
-
-        $ctx->ok(0, undef, ['incorrect number of args']);
-        return 0;
-    }
-
-    my ($ok, @diag) = Test::More::DeepCheck::Strict->check($got, $want);
-    $ctx->ok($ok, $name, \@diag);
-    return $ok;
-}
-
-sub eq_array {
-    my ($got, $want, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = Test::More::DeepCheck::Strict->check_array($got, $want);
-    return $ok;
-}
-
-sub eq_hash {
-    my ($got, $want, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = Test::More::DeepCheck::Strict->check_hash($got, $want);
-    return $ok;
-}
-
-sub eq_set {
-    my ($got, $want, $name) = @_;
-    my $ctx = context();
-    my ($ok, @diag) = Test::More::DeepCheck::Strict->check_set($got, $want);
-    return $ok;
-}
-
-sub require_ok($;$) {
-    my($module) = shift;
-    my $ctx = context();
-
-    # Try to determine if we've been given a module name or file.
-    # Module names must be barewords, files not.
-    $module = qq['$module'] unless _is_module_name($module);
-
-    my ($ret, $err);
-    {
-        local $SIG{__DIE__};
-        ($ret, $err) = spoof [caller] => "require $module";
-    }
-
-    my @diag;
-    unless ($ret) {
-        chomp $err;
-        push @diag => <<"        DIAG";
-    Tried to require '$module'.
-    Error:  $err
-        DIAG
-    }
-
-    $ctx->ok( $ret, "require $module;", \@diag );
-    return $ret ? 1 : 0;
-}
-
-sub _is_module_name {
-    my $module = shift;
-
-    # Module names start with a letter.
-    # End with an alphanumeric.
-    # The rest is an alphanumeric or ::
-    $module =~ s/\b::\b//g;
-
-    return $module =~ /^[a-zA-Z]\w*$/ ? 1 : 0;
-}
-
-sub use_ok($;@) {
-    my ($module, @imports) = @_;
-    @imports = () unless @imports;
-    my $ctx = context();
-
-    my($pack, $filename, $line) = caller;
-    $filename =~ y/\n\r/_/; # so it doesn't run off the "#line $line $f" line
-
-    my ($ret, $err, $newdie, @diag);
-    {
-        local $SIG{__DIE__};
-
-        if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
-            # probably a version check.  Perl needs to see the bare number
-            # for it to work with non-Exporter based modules.
-            ($ret, $err) = spoof [$pack, $filename, $line] => "use $module $imports[0]";
-        }
-        else {
-            ($ret, $err) = spoof [$pack, $filename, $line] => "use $module \@args", @imports;
-        }
-
-        $newdie = $SIG{__DIE__};
-    }
-
-    $SIG{__DIE__} = $newdie if defined $newdie;
-
-    unless ($ret) {
-        chomp $err;
-        push @diag => <<"        DIAG";
-    Tried to use '$module'.
-    Error:  $err
-        DIAG
-    }
-
-    $ctx->ok($ret, "use $module;", \@diag);
-
-    return $ret ? 1 : 0;
-}
-
-1;
-
-__END__
-
-=pod
+our $VERSION = '1.001014';
+$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)
 
 
-=encoding UTF-8
+use Test::Builder::Module 0.99;
+our @ISA    = qw(Test::Builder::Module);
+our @EXPORT = qw(ok use_ok require_ok
+  is isnt like unlike is_deeply
+  cmp_ok
+  skip todo todo_skip
+  pass fail
+  eq_array eq_hash eq_set
+  $TODO
+  plan
+  done_testing
+  can_ok isa_ok new_ok
+  diag note explain
+  subtest
+  BAIL_OUT
+);
 
 =head1 NAME
 
 
 =head1 NAME
 
-Test::More - The defacto standard in unit testing tools.
+Test::More - yet another framework for writing test scripts
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
-    # Using Test::Stream BEFORE using Test::More removes expensive legacy
-    # support. This Also provides context(), cull(), and tap_encoding()
-    use Test::Stream;
+  use Test::More tests => 23;
+  # or
+  use Test::More skip_all => $reason;
+  # or
+  use Test::More;   # see done_testing()
 
 
-    # Load after Test::Stream to get the benefits of removed legacy
-    use Test::More;
+  require_ok( 'Some::Module' );
+
+  # Various ways to say "ok"
+  ok($got eq $expected, $test_name);
 
 
-    use ok 'Some::Module';
+  is  ($got, $expected, $test_name);
+  isnt($got, $expected, $test_name);
 
 
-    can_ok($module, @methods);
-    isa_ok($object, $class);
+  # Rather than print STDERR "# here's what went wrong\n"
+  diag("here's what went wrong");
 
 
-    pass($test_name);
-    fail($test_name);
+  like  ($got, qr/expected/, $test_name);
+  unlike($got, qr/expected/, $test_name);
 
 
-    ok($got eq $expected, $test_name);
+  cmp_ok($got, '==', $expected, $test_name);
 
 
-    is  ($got, $expected, $test_name);
-    isnt($got, $expected, $test_name);
+  is_deeply($got_complex_structure, $expected_complex_structure, $test_name);
 
 
-    like  ($got, qr/expected/, $test_name);
-    unlike($got, qr/expected/, $test_name);
+  SKIP: {
+      skip $why, $how_many unless $have_some_feature;
 
 
-    cmp_ok($got, '==', $expected, $test_name);
+      ok( foo(),       $test_name );
+      is( foo(42), 23, $test_name );
+  };
 
 
-    is_deeply(
-        $got_complex_structure,
-        $expected_complex_structure,
-        $test_name
-    );
+  TODO: {
+      local $TODO = $why;
 
 
-    # Rather than print STDERR "# here's what went wrong\n"
-    diag("here's what went wrong");
+      ok( foo(),       $test_name );
+      is( foo(42), 23, $test_name );
+  };
 
 
-    SKIP: {
-        skip $why, $how_many unless $have_some_feature;
+  can_ok($module, @methods);
+  isa_ok($object, $class);
 
 
-        ok( foo(),       $test_name );
-        is( foo(42), 23, $test_name );
-    };
+  pass($test_name);
+  fail($test_name);
 
 
-    TODO: {
-        local $TODO = $why;
-
-        ok( foo(),       $test_name );
-        is( foo(42), 23, $test_name );
-    };
-
-    sub my_compare {
-        my ($got, $want, $name) = @_;
-        my $ctx = context(); # From Test::Stream
-        my $ok = $got eq $want;
-        $ctx->ok($ok, $name);
-        ...
-        return $ok;
-    };
+  BAIL_OUT($why);
 
 
-    # If this fails it will report this line instead of the line in my_compare.
-    my_compare('a', 'b');
+  # UNIMPLEMENTED!!!
+  my @status = Test::More::status;
 
 
-    done_testing;
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
@@ -477,6 +105,7 @@ facilities to skip tests, test future features and compare complicated
 data structures.  While you can do almost anything with a simple
 C<ok()> function, it doesn't provide good diagnostic output.
 
 data structures.  While you can do almost anything with a simple
 C<ok()> function, it doesn't provide good diagnostic output.
 
+
 =head2 I love it when a plan comes together
 
 Before anything else, you need a testing plan.  This basically declares
 =head2 I love it when a plan comes together
 
 Before anything else, you need a testing plan.  This basically declares
@@ -531,6 +160,40 @@ or for deciding between running the tests at all:
       plan tests => 42;
   }
 
       plan tests => 42;
   }
 
+=cut
+
+sub plan {
+    my $tb = Test::More->builder;
+
+    return $tb->plan(@_);
+}
+
+# This implements "use Test::More 'no_diag'" but the behavior is
+# deprecated.
+sub import_extra {
+    my $class = shift;
+    my $list  = shift;
+
+    my @other = ();
+    my $idx   = 0;
+    while( $idx <= $#{$list} ) {
+        my $item = $list->[$idx];
+
+        if( defined $item and $item eq 'no_diag' ) {
+            $class->builder->no_diag(1);
+        }
+        else {
+            push @other, $item;
+        }
+
+        $idx++;
+    }
+
+    @$list = @other;
+
+    return;
+}
+
 =over 4
 
 =item B<done_testing>
 =over 4
 
 =item B<done_testing>
@@ -550,114 +213,12 @@ This is safer than and replaces the "no_plan" plan.
 
 =back
 
 
 =back
 
-=head2 Test::Stream
-
-If Test::Stream is loaded before Test::More then it will prevent the insertion
-of some legacy support shims, saving you memory and improving performance.
-
-    use Test::Stream;
-    use Test::More;
-
-You can also use it to make forking work:
-
-    use Test::Stream 'enable_fork';
-
-=head2 TAP Encoding
-
-You can now control the encoding of your TAP output using Test::Stream.
-
-    use Test::Stream; # imports tap_encoding
-    use Test::More;
-
-    tap_encoding 'utf8';
-
-You can also just set 'utf8' it at import time
-
-    use Test::Stream 'utf8';
-
-or something other than utf8
-
-    use Test::Stream encoding => 'latin1';
-
-=over 4
-
-=item tap_encoding 'utf8';
-
-=item tap_encoding 'YOUR_ENCODING';
-
-=item tap_encoding 'xxx' => sub { ... };
-
-The C<tap_encoding($encoding)> function will ensure that any B<FUTURE> TAP
-output produced by I<This Package> will be output in the specified encoding.
-
-You may also provide a codeblock in which case the scope of the encoding change
-will only apply to that codeblock.
-
-B<Note>: This is effective only for the current package. Other packages can/may
-select other encodings for their TAP output. For packages where none is
-specified, the original STDOUT and STDERR settings are used, the results are
-unpredictable.
-
-B<Note>: The encoding of the TAP, it is necessary to set to match the
-locale of the encoding of the terminal.
-
-However, in tests code that are performed in a variety of environments,
-it can not be assumed in advance the encoding of the locale of the terminal,
-it is recommended how to set the encoding to your environment using the
-C<Encode::Locale> module.
-
-The following is an example of code.
-
-  use utf8;
-  use Test::Stream;
-  use Test::More;
-  use Encode::Locale;
-
-  tap_encoding('console_out');
-
-B<Note>: Filenames are a touchy subject:
-
-Different OS's and filesystems handle filenames differently. When you do not
-specify an encoding, the filename will be unmodified, you get whatever perl
-thinks it is. If you do specify an encoding, the filename will be assumed to be
-in that encoding, and an attempt will be made to unscramble it. If the
-unscrambling fails the original name will be used.
-
-This filename unscrambling is necessary for example on linux systems when you
-use utf8 encoding and a utf8 filename. Perl will read the bytes of the name,
-and treat them as bytes. if you then try to print the name to a utf8 handle it
-will treat each byte as a different character. Test::More attempts to fix this
-scrambling for you.
-
-=back
-
-=head2 Helpers
-
-Sometimes you want to write functions for things you do frequently that include
-calling ok() or other test functions. Doing this can make it hard to debug
-problems as failures will be reported in your sub, and not at the place where
-you called your sub. Now there is a solution to this, the
-L<Test::Stream::Context> object!.
-
-L<Test::Stream> exports the C<context()> function which will return a context
-object for your use. The idea is that you generate a context object at the
-lowest level (the function you call from your test file). Deeper functions that
-need context will get the object you already generated, at least until the
-object falls out of scope or is undefined.
+=cut
 
 
-    sub my_compare {
-        my ($got, $want, $name) = @_;
-        my $ctx = context();
-
-        # is() will find the context object above, instead of generating a new
-        # one. That way a failure will be reported to the correct line
-        is($got, $want);
-
-        # This time it will generate a new context object. That means a failure
-        # will report to this line.
-        $ctx = undef;
-        is($got, $want);
-    };
+sub done_testing {
+    my $tb = Test::More->builder;
+    $tb->done_testing(@_);
+}
 
 =head2 Test names
 
 
 =head2 Test names
 
@@ -724,6 +285,15 @@ Should an C<ok()> fail, it will produce some diagnostics:
 
 This is the same as L<Test::Simple>'s C<ok()> routine.
 
 
 This is the same as L<Test::Simple>'s C<ok()> routine.
 
+=cut
+
+sub ok ($;$) {
+    my( $test, $name ) = @_;
+    my $tb = Test::More->builder;
+
+    return $tb->ok( $test, $name );
+}
+
 =item B<is>
 
 =item B<isnt>
 =item B<is>
 
 =item B<isnt>
@@ -798,6 +368,23 @@ different from some other value:
 For those grammatical pedants out there, there's an C<isn't()>
 function which is an alias of C<isnt()>.
 
 For those grammatical pedants out there, there's an C<isn't()>
 function which is an alias of C<isnt()>.
 
+=cut
+
+sub is ($$;$) {
+    my $tb = Test::More->builder;
+
+    return $tb->is_eq(@_);
+}
+
+sub isnt ($$;$) {
+    my $tb = Test::More->builder;
+
+    return $tb->isnt_eq(@_);
+}
+
+*isn't = \&isnt;
+# ' to unconfuse syntax higlighters
+
 =item B<like>
 
   like( $got, qr/expected/, $test_name );
 =item B<like>
 
   like( $got, qr/expected/, $test_name );
@@ -826,6 +413,14 @@ Regex options may be placed on the end (C<'/expected/i'>).
 Its advantages over C<ok()> are similar to that of C<is()> and C<isnt()>.  Better
 diagnostics on failure.
 
 Its advantages over C<ok()> are similar to that of C<is()> and C<isnt()>.  Better
 diagnostics on failure.
 
+=cut
+
+sub like ($$;$) {
+    my $tb = Test::More->builder;
+
+    return $tb->like(@_);
+}
+
 =item B<unlike>
 
   unlike( $got, qr/expected/, $test_name );
 =item B<unlike>
 
   unlike( $got, qr/expected/, $test_name );
@@ -833,6 +428,14 @@ diagnostics on failure.
 Works exactly as C<like()>, only it checks if $got B<does not> match the
 given pattern.
 
 Works exactly as C<like()>, only it checks if $got B<does not> match the
 given pattern.
 
+=cut
+
+sub unlike ($$;$) {
+    my $tb = Test::More->builder;
+
+    return $tb->unlike(@_);
+}
+
 =item B<cmp_ok>
 
   cmp_ok( $got, $op, $expected, $test_name );
 =item B<cmp_ok>
 
   cmp_ok( $got, $op, $expected, $test_name );
@@ -865,11 +468,20 @@ C<is()>'s use of C<eq> will interfere:
 
     cmp_ok( $big_hairy_number, '==', $another_big_hairy_number );
 
 
     cmp_ok( $big_hairy_number, '==', $another_big_hairy_number );
 
-It's especially useful when comparing greater-than or smaller-than
+It's especially useful when comparing greater-than or smaller-than 
 relation between values:
 
     cmp_ok( $some_value, '<=', $upper_limit );
 
 relation between values:
 
     cmp_ok( $some_value, '<=', $upper_limit );
 
+
+=cut
+
+sub cmp_ok($$$;$) {
+    my $tb = Test::More->builder;
+
+    return $tb->cmp_ok(@_);
+}
+
 =item B<can_ok>
 
   can_ok($module, @methods);
 =item B<can_ok>
 
   can_ok($module, @methods);
@@ -882,9 +494,9 @@ Checks to make sure the $module or $object can do these @methods
 
 is almost exactly like saying:
 
 
 is almost exactly like saying:
 
-    ok( Foo->can('this') &&
-        Foo->can('that') &&
-        Foo->can('whatever')
+    ok( Foo->can('this') && 
+        Foo->can('that') && 
+        Foo->can('whatever') 
       );
 
 only without all the typing and with a better interface.  Handy for
       );
 
 only without all the typing and with a better interface.  Handy for
@@ -897,6 +509,40 @@ as one test.  If you desire otherwise, use:
         can_ok('Foo', $meth);
     }
 
         can_ok('Foo', $meth);
     }
 
+=cut
+
+sub can_ok ($@) {
+    my( $proto, @methods ) = @_;
+    my $class = ref $proto || $proto;
+    my $tb = Test::More->builder;
+
+    unless($class) {
+        my $ok = $tb->ok( 0, "->can(...)" );
+        $tb->diag('    can_ok() called with empty class or reference');
+        return $ok;
+    }
+
+    unless(@methods) {
+        my $ok = $tb->ok( 0, "$class->can(...)" );
+        $tb->diag('    can_ok() called with no methods');
+        return $ok;
+    }
+
+    my @nok = ();
+    foreach my $method (@methods) {
+        $tb->_try( sub { $proto->can($method) } ) or push @nok, $method;
+    }
+
+    my $name = (@methods == 1) ? "$class->can('$methods[0]')" :
+                                 "$class->can(...)"           ;
+
+    my $ok = $tb->ok( !@nok, $name );
+
+    $tb->diag( map "    $class->can('$_') failed\n", @nok );
+
+    return $ok;
+}
+
 =item B<isa_ok>
 
   isa_ok($object,   $class, $object_name);
 =item B<isa_ok>
 
   isa_ok($object,   $class, $object_name);
@@ -929,6 +575,88 @@ The diagnostics of this test normally just refer to 'the object'.  If
 you'd like them to be more specific, you can supply an $object_name
 (for example 'Test customer').
 
 you'd like them to be more specific, you can supply an $object_name
 (for example 'Test customer').
 
+=cut
+
+sub isa_ok ($$;$) {
+    my( $thing, $class, $thing_name ) = @_;
+    my $tb = Test::More->builder;
+
+    my $whatami;
+    if( !defined $thing ) {
+        $whatami = 'undef';
+    }
+    elsif( ref $thing ) {
+        $whatami = 'reference';
+
+        local($@,$!);
+        require Scalar::Util;
+        if( Scalar::Util::blessed($thing) ) {
+            $whatami = 'object';
+        }
+    }
+    else {
+        $whatami = 'class';
+    }
+
+    # We can't use UNIVERSAL::isa because we want to honor isa() overrides
+    my( $rslt, $error ) = $tb->_try( sub { $thing->isa($class) } );
+
+    if($error) {
+        die <<WHOA unless $error =~ /^Can't (locate|call) method "isa"/;
+WHOA! I tried to call ->isa on your $whatami and got some weird error.
+Here's the error.
+$error
+WHOA
+    }
+
+    # Special case for isa_ok( [], "ARRAY" ) and like
+    if( $whatami eq 'reference' ) {
+        $rslt = UNIVERSAL::isa($thing, $class);
+    }
+
+    my($diag, $name);
+    if( defined $thing_name ) {
+        $name = "'$thing_name' isa '$class'";
+        $diag = defined $thing ? "'$thing_name' isn't a '$class'" : "'$thing_name' isn't defined";
+    }
+    elsif( $whatami eq 'object' ) {
+        my $my_class = ref $thing;
+        $thing_name = qq[An object of class '$my_class'];
+        $name = "$thing_name isa '$class'";
+        $diag = "The object of class '$my_class' isn't a '$class'";
+    }
+    elsif( $whatami eq 'reference' ) {
+        my $type = ref $thing;
+        $thing_name = qq[A reference of type '$type'];
+        $name = "$thing_name isa '$class'";
+        $diag = "The reference of type '$type' isn't a '$class'";
+    }
+    elsif( $whatami eq 'undef' ) {
+        $thing_name = 'undef';
+        $name = "$thing_name isa '$class'";
+        $diag = "$thing_name isn't defined";
+    }
+    elsif( $whatami eq 'class' ) {
+        $thing_name = qq[The class (or class-like) '$thing'];
+        $name = "$thing_name isa '$class'";
+        $diag = "$thing_name isn't a '$class'";
+    }
+    else {
+        die;
+    }
+
+    my $ok;
+    if($rslt) {
+        $ok = $tb->ok( 1, $name );
+    }
+    else {
+        $ok = $tb->ok( 0, $name );
+        $tb->diag("    $diag\n");
+    }
+
+    return $ok;
+}
+
 =item B<new_ok>
 
   my $obj = new_ok( $class );
 =item B<new_ok>
 
   my $obj = new_ok( $class );
@@ -948,6 +676,31 @@ If @args is not given, an empty list will be used.
 This function only works on C<new()> and it assumes C<new()> will return
 just a single object which isa C<$class>.
 
 This function only works on C<new()> and it assumes C<new()> will return
 just a single object which isa C<$class>.
 
+=cut
+
+sub new_ok {
+    my $tb = Test::More->builder;
+    $tb->croak("new_ok() must be given at least a class") unless @_;
+
+    my( $class, $args, $object_name ) = @_;
+
+    $args ||= [];
+
+    my $obj;
+    my( $success, $error ) = $tb->_try( sub { $obj = $class->new(@$args); 1 } );
+    if($success) {
+        local $Test::Builder::Level = $Test::Builder::Level + 1;
+        isa_ok $obj, $class, $object_name;
+    }
+    else {
+        $class = 'undef' if !defined $class;
+        $tb->ok( 0, "$class->new() died" );
+        $tb->diag("    Error was:  $error");
+    }
+
+    return $obj;
+}
+
 =item B<subtest>
 
     subtest $name => \&code;
 =item B<subtest>
 
     subtest $name => \&code;
@@ -959,7 +712,7 @@ result of the whole subtest to determine if its ok or not ok.
 For example...
 
   use Test::More tests => 3;
 For example...
 
   use Test::More tests => 3;
-
   pass("First test");
 
   subtest 'An example subtest' => sub {
   pass("First test");
 
   subtest 'An example subtest' => sub {
@@ -1009,38 +762,14 @@ subtests are equivalent:
       done_testing();
   };
 
       done_testing();
   };
 
-B<NOTE on using skip_all in a BEGIN inside a subtest.>
-
-Sometimes you want to run a file as a subtest:
-
-    subtest foo => sub { do 'foo.pl' };
-
-where foo.pl;
-
-    use Test::More skip_all => "won't work";
-
-This will work fine, but will issue a warning. The issue is that the normal
-flow control method will now work inside a BEGIN block. The C<use Test::More>
-statement is run in a BEGIN block. As a result an exception is thrown instead
-of the normal flow control. In most cases this works fine.
+=cut
 
 
-A case like this however will have issues:
-
-    subtest foo => sub {
-        do 'foo.pl'; # Will issue a skip_all
-
-        # You would expect the subtest to stop, but the 'do' captures the
-        # exception, as a result the following statement does execute.
-
-        ok(0, "blah");
-    };
-
-You can work around this by cheking the return from C<do>, along with C<$@>, or you can alter foo.pl so that it does this:
-
-    use Test::More;
-    plan skip_all => 'broken';
+sub subtest {
+    my ($name, $subtests) = @_;
 
 
-When the plan is issues outside of the BEGIN block it works just fine.
+    my $tb = Test::More->builder;
+    return $tb->subtest(@_);
+}
 
 =item B<pass>
 
 
 =item B<pass>
 
@@ -1057,29 +786,22 @@ C<ok(1)> and C<ok(0)>.
 
 Use these very, very, very sparingly.
 
 
 Use these very, very, very sparingly.
 
-=back
-
-=head2 Debugging tests
-
-Want a stack trace when a test failure occurs? Have some other hook in mind?
-Easy!
+=cut
 
 
-    use Test::More;
-    use Carp qw/confess/;
+sub pass (;$) {
+    my $tb = Test::More->builder;
 
 
-    Test::Stream->shared->listen(sub {
-        my ($stream, $event) = @_;
+    return $tb->ok( 1, @_ );
+}
 
 
-        # Only care about 'Ok' events (this includes subtests)
-        return unless $event->isa('Test::Stream::Event::Ok');
+sub fail (;$) {
+    my $tb = Test::More->builder;
 
 
-        # Only care about failures
-        return if $event->bool;
+    return $tb->ok( 0, @_ );
+}
 
 
-        confess "Failed test! here is a stacktrace!";
-    });
+=back
 
 
-    ok(0, "This will give you a trace.");
 
 =head2 Module tests
 
 
 =head2 Module tests
 
@@ -1088,44 +810,12 @@ successfully load.  For example, you'll often want a first test which
 simply loads all the modules in the distribution to make sure they
 work before going on to do more complicated testing.
 
 simply loads all the modules in the distribution to make sure they
 work before going on to do more complicated testing.
 
-For such purposes we have C<use ok 'module'>. C<use_ok> is still around, but is
-considered discouraged in favor of C<use ok 'module'>. C<require_ok> is also
-discouraged because it tries to guess if you gave it a file name or module
-name. C<require_ok>'s guessing mechanism is broken, but fixing it can break
-things.
+For such purposes we have C<use_ok> and C<require_ok>.
 
 =over 4
 
 
 =over 4
 
-=item B<use ok 'module'>
-
-=item B<use ok 'module', @args>
-
-    use ok 'Some::Module';
-    use ok 'Another::Module', qw/import_a import_b/;
-
-This will load the specified module and pass through any extra arguments to
-that module. This will also produce a test result.
-
-B<Note - Do not do this:>
-
-    my $class = 'My::Module';
-    use ok $class;
-
-The value 'My::Module' is not assigned to the C<$class> variable until
-run-time, but the C<use ok $class> statement is run at compile time. The result
-of this is that we try to load 'undef' as a module. This will generate an
-exception: C<'use ok' called with an empty argument, did you try to use a package name from an uninitialized variable?>
-
-If you must do something like this, here is a more-correct way:
-
-    my $class;
-    BEGIN { $class = 'My::Module' }
-    use ok $class;
-
 =item B<require_ok>
 
 =item B<require_ok>
 
-B<***DISCOURAGED***> - Broken guessing
-
    require_ok($module);
    require_ok($file);
 
    require_ok($module);
    require_ok($file);
 
@@ -1141,18 +831,61 @@ No exception will be thrown if the load fails.
     # require Some::Module
     require_ok "Some::Module";
 
     # require Some::Module
     require_ok "Some::Module";
 
-    # require "Some/File.pl";
-    require_ok "Some/File.pl";
+    # require "Some/File.pl";
+    require_ok "Some/File.pl";
+
+    # stop testing if any of your modules will not load
+    for my $module (@module) {
+        require_ok $module or BAIL_OUT "Can't load $module";
+    }
+
+=cut
+
+sub require_ok ($) {
+    my($module) = shift;
+    my $tb = Test::More->builder;
+
+    my $pack = caller;
+
+    # Try to determine if we've been given a module name or file.
+    # Module names must be barewords, files not.
+    $module = qq['$module'] unless _is_module_name($module);
+
+    my $code = <<REQUIRE;
+package $pack;
+require $module;
+1;
+REQUIRE
+
+    my( $eval_result, $eval_error ) = _eval($code);
+    my $ok = $tb->ok( $eval_result, "require $module;" );
+
+    unless($ok) {
+        chomp $eval_error;
+        $tb->diag(<<DIAGNOSTIC);
+    Tried to require '$module'.
+    Error:  $eval_error
+DIAGNOSTIC
+
+    }
+
+    return $ok;
+}
+
+sub _is_module_name {
+    my $module = shift;
+
+    # Module names start with a letter.
+    # End with an alphanumeric.
+    # The rest is an alphanumeric or ::
+    $module =~ s/\b::\b//g;
+
+    return $module =~ /^[a-zA-Z]\w*$/ ? 1 : 0;
+}
 
 
-    # stop testing if any of your modules will not load
-    for my $module (@module) {
-        require_ok $module or BAIL_OUT "Can't load $module";
-    }
 
 =item B<use_ok>
 
 
 =item B<use_ok>
 
-B<***DISCOURAGED***> See C<use ok 'module'>
-
    BEGIN { use_ok($module); }
    BEGIN { use_ok($module, @imports); }
 
    BEGIN { use_ok($module); }
    BEGIN { use_ok($module, @imports); }
 
@@ -1200,8 +933,77 @@ import anything, use C<require_ok>.
 
   BEGIN { require_ok "Foo" }
 
 
   BEGIN { require_ok "Foo" }
 
+=cut
+
+sub use_ok ($;@) {
+    my( $module, @imports ) = @_;
+    @imports = () unless @imports;
+    my $tb = Test::More->builder;
+
+    my( $pack, $filename, $line ) = caller;
+    $filename =~ y/\n\r/_/; # so it doesn't run off the "#line $line $f" line
+
+    my $code;
+    if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
+        # probably a version check.  Perl needs to see the bare number
+        # for it to work with non-Exporter based modules.
+        $code = <<USE;
+package $pack;
+
+#line $line $filename
+use $module $imports[0];
+1;
+USE
+    }
+    else {
+        $code = <<USE;
+package $pack;
+
+#line $line $filename
+use $module \@{\$args[0]};
+1;
+USE
+    }
+
+    my( $eval_result, $eval_error ) = _eval( $code, \@imports );
+    my $ok = $tb->ok( $eval_result, "use $module;" );
+
+    unless($ok) {
+        chomp $eval_error;
+        $@ =~ s{^BEGIN failed--compilation aborted at .*$}
+                {BEGIN failed--compilation aborted at $filename line $line.}m;
+        $tb->diag(<<DIAGNOSTIC);
+    Tried to use '$module'.
+    Error:  $eval_error
+DIAGNOSTIC
+
+    }
+
+    return $ok;
+}
+
+sub _eval {
+    my( $code, @args ) = @_;
+
+    # Work around oddities surrounding resetting of $@ by immediately
+    # storing it.
+    my( $sigdie, $eval_result, $eval_error );
+    {
+        local( $@, $!, $SIG{__DIE__} );    # isolate eval
+        $eval_result = eval $code;              ## no critic (BuiltinFunctions::ProhibitStringyEval)
+        $eval_error  = $@;
+        $sigdie      = $SIG{__DIE__} || undef;
+    }
+    # make sure that $code got a chance to set $SIG{__DIE__}
+    $SIG{__DIE__} = $sigdie if defined $sigdie;
+
+    return( $eval_result, $eval_error );
+}
+
+
 =back
 
 =back
 
+
 =head2 Complex data structures
 
 Not everything is a simple eq check or regex.  There are times you
 =head2 Complex data structures
 
 Not everything is a simple eq check or regex.  There are times you
@@ -1232,6 +1034,112 @@ improve in the future.
 L<Test::Differences> and L<Test::Deep> provide more in-depth functionality
 along these lines.
 
 L<Test::Differences> and L<Test::Deep> provide more in-depth functionality
 along these lines.
 
+=cut
+
+our( @Data_Stack, %Refs_Seen );
+my $DNE = bless [], 'Does::Not::Exist';
+
+sub _dne {
+    return ref $_[0] eq ref $DNE;
+}
+
+## no critic (Subroutines::RequireArgUnpacking)
+sub is_deeply {
+    my $tb = Test::More->builder;
+
+    unless( @_ == 2 or @_ == 3 ) {
+        my $msg = <<'WARNING';
+is_deeply() takes two or three args, you gave %d.
+This usually means you passed an array or hash instead 
+of a reference to it
+WARNING
+        chop $msg;    # clip off newline so carp() will put in line/file
+
+        _carp sprintf $msg, scalar @_;
+
+        return $tb->ok(0);
+    }
+
+    my( $got, $expected, $name ) = @_;
+
+    $tb->_unoverload_str( \$expected, \$got );
+
+    my $ok;
+    if( !ref $got and !ref $expected ) {    # neither is a reference
+        $ok = $tb->is_eq( $got, $expected, $name );
+    }
+    elsif( !ref $got xor !ref $expected ) {    # one's a reference, one isn't
+        $ok = $tb->ok( 0, $name );
+        $tb->diag( _format_stack({ vals => [ $got, $expected ] }) );
+    }
+    else {                                     # both references
+        local @Data_Stack = ();
+        if( _deep_check( $got, $expected ) ) {
+            $ok = $tb->ok( 1, $name );
+        }
+        else {
+            $ok = $tb->ok( 0, $name );
+            $tb->diag( _format_stack(@Data_Stack) );
+        }
+    }
+
+    return $ok;
+}
+
+sub _format_stack {
+    my(@Stack) = @_;
+
+    my $var       = '$FOO';
+    my $did_arrow = 0;
+    foreach my $entry (@Stack) {
+        my $type = $entry->{type} || '';
+        my $idx = $entry->{'idx'};
+        if( $type eq 'HASH' ) {
+            $var .= "->" unless $did_arrow++;
+            $var .= "{$idx}";
+        }
+        elsif( $type eq 'ARRAY' ) {
+            $var .= "->" unless $did_arrow++;
+            $var .= "[$idx]";
+        }
+        elsif( $type eq 'REF' ) {
+            $var = "\${$var}";
+        }
+    }
+
+    my @vals = @{ $Stack[-1]{vals} }[ 0, 1 ];
+    my @vars = ();
+    ( $vars[0] = $var ) =~ s/\$FOO/     \$got/;
+    ( $vars[1] = $var ) =~ s/\$FOO/\$expected/;
+
+    my $out = "Structures begin differing at:\n";
+    foreach my $idx ( 0 .. $#vals ) {
+        my $val = $vals[$idx];
+        $vals[$idx]
+          = !defined $val ? 'undef'
+          : _dne($val)    ? "Does not exist"
+          : ref $val      ? "$val"
+          :                 "'$val'";
+    }
+
+    $out .= "$vars[0] = $vals[0]\n";
+    $out .= "$vars[1] = $vals[1]\n";
+
+    $out =~ s/^/    /msg;
+    return $out;
+}
+
+sub _type {
+    my $thing = shift;
+
+    return '' if !ref $thing;
+
+    for my $type (qw(Regexp ARRAY HASH REF SCALAR GLOB CODE)) {
+        return $type if UNIVERSAL::isa( $thing, $type );
+    }
+
+    return '';
+}
 
 =back
 
 
 =back
 
@@ -1286,6 +1194,16 @@ don't indicate a problem.
 
     note("Tempfile is $tempfile");
 
 
     note("Tempfile is $tempfile");
 
+=cut
+
+sub diag {
+    return Test::More->builder->diag(@_);
+}
+
+sub note {
+    return Test::More->builder->note(@_);
+}
+
 =item B<explain>
 
   my @dump = explain @diagnostic_message;
 =item B<explain>
 
   my @dump = explain @diagnostic_message;
@@ -1302,6 +1220,12 @@ or
     note explain \%args;
     Some::Class->method(%args);
 
     note explain \%args;
     Some::Class->method(%args);
 
+=cut
+
+sub explain {
+    return Test::More->builder->explain(@_);
+}
+
 =back
 
 
 =back
 
 
@@ -1309,7 +1233,7 @@ or
 
 Sometimes running a test under certain conditions will cause the
 test script to die.  A certain function or method isn't implemented
 
 Sometimes running a test under certain conditions will cause the
 test script to die.  A certain function or method isn't implemented
-(such as C<fork()> on MacOS), some resource isn't available (like a
+(such as C<fork()> on MacOS), some resource isn't available (like a 
 net connection) or a module isn't available.  In these cases it's
 necessary to skip tests, or declare that they are supposed to fail
 but will work in the future (a todo test).
 net connection) or a module isn't available.  In these cases it's
 necessary to skip tests, or declare that they are supposed to fail
 but will work in the future (a todo test).
@@ -1362,6 +1286,34 @@ You don't skip tests which are failing because there's a bug in your
 program, or for which you don't yet have code written.  For that you
 use TODO.  Read on.
 
 program, or for which you don't yet have code written.  For that you
 use TODO.  Read on.
 
+=cut
+
+## no critic (Subroutines::RequireFinalReturn)
+sub skip {
+    my( $why, $how_many ) = @_;
+    my $tb = Test::More->builder;
+
+    unless( defined $how_many ) {
+        # $how_many can only be avoided when no_plan is in use.
+        _carp "skip() needs to know \$how_many tests are in the block"
+          unless $tb->has_plan eq 'no_plan';
+        $how_many = 1;
+    }
+
+    if( defined $how_many and $how_many =~ /\D/ ) {
+        _carp
+          "skip() was passed a non-numeric number of tests.  Did you get the arguments backwards?";
+        $how_many = 1;
+    }
+
+    for( 1 .. $how_many ) {
+        $tb->skip($why);
+    }
+
+    no warnings 'exiting';
+    last SKIP;
+}
+
 =item B<TODO: BLOCK>
 
     TODO: {
 =item B<TODO: BLOCK>
 
     TODO: {
@@ -1418,6 +1370,26 @@ The syntax and behavior is similar to a C<SKIP: BLOCK> except the
 tests will be marked as failing but todo.  L<Test::Harness> will
 interpret them as passing.
 
 tests will be marked as failing but todo.  L<Test::Harness> will
 interpret them as passing.
 
+=cut
+
+sub todo_skip {
+    my( $why, $how_many ) = @_;
+    my $tb = Test::More->builder;
+
+    unless( defined $how_many ) {
+        # $how_many can only be avoided when no_plan is in use.
+        _carp "todo_skip() needs to know \$how_many tests are in the block"
+          unless $tb->has_plan eq 'no_plan';
+        $how_many = 1;
+    }
+
+    for( 1 .. $how_many ) {
+        $tb->todo_skip($why);
+    }
+
+    no warnings 'exiting';
+    last TODO;
+}
 
 =item When do I use SKIP vs. TODO?
 
 
 =item When do I use SKIP vs. TODO?
 
@@ -1453,8 +1425,18 @@ The test will exit with 255.
 
 For even better control look at L<Test::Most>.
 
 
 For even better control look at L<Test::Most>.
 
+=cut
+
+sub BAIL_OUT {
+    my $reason = shift;
+    my $tb     = Test::More->builder;
+
+    $tb->BAIL_OUT($reason);
+}
+
 =back
 
 =back
 
+
 =head2 Discouraged comparison functions
 
 The use of the following functions is discouraged as they are not
 =head2 Discouraged comparison functions
 
 The use of the following functions is discouraged as they are not
@@ -1467,7 +1449,7 @@ These functions are usually used inside an C<ok()>.
 
     ok( eq_array(\@got, \@expected) );
 
 
     ok( eq_array(\@got, \@expected) );
 
-C<is_deeply()> can do that better and with diagnostics.
+C<is_deeply()> can do that better and with diagnostics.  
 
     is_deeply( \@got, \@expected );
 
 
     is_deeply( \@got, \@expected );
 
@@ -1482,6 +1464,146 @@ They may be deprecated in future versions.
 Checks if two arrays are equivalent.  This is a deep check, so
 multi-level structures are handled correctly.
 
 Checks if two arrays are equivalent.  This is a deep check, so
 multi-level structures are handled correctly.
 
+=cut
+
+#'#
+sub eq_array {
+    local @Data_Stack = ();
+    _deep_check(@_);
+}
+
+sub _eq_array {
+    my( $a1, $a2 ) = @_;
+
+    if( grep _type($_) ne 'ARRAY', $a1, $a2 ) {
+        warn "eq_array passed a non-array ref";
+        return 0;
+    }
+
+    return 1 if $a1 eq $a2;
+
+    my $ok = 1;
+    my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2;
+    for( 0 .. $max ) {
+        my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_];
+        my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_];
+
+        next if _equal_nonrefs($e1, $e2);
+
+        push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [ $e1, $e2 ] };
+        $ok = _deep_check( $e1, $e2 );
+        pop @Data_Stack if $ok;
+
+        last unless $ok;
+    }
+
+    return $ok;
+}
+
+sub _equal_nonrefs {
+    my( $e1, $e2 ) = @_;
+
+    return if ref $e1 or ref $e2;
+
+    if ( defined $e1 ) {
+        return 1 if defined $e2 and $e1 eq $e2;
+    }
+    else {
+        return 1 if !defined $e2;
+    }
+
+    return;
+}
+
+sub _deep_check {
+    my( $e1, $e2 ) = @_;
+    my $tb = Test::More->builder;
+
+    my $ok = 0;
+
+    # Effectively turn %Refs_Seen into a stack.  This avoids picking up
+    # the same referenced used twice (such as [\$a, \$a]) to be considered
+    # circular.
+    local %Refs_Seen = %Refs_Seen;
+
+    {
+        $tb->_unoverload_str( \$e1, \$e2 );
+
+        # Either they're both references or both not.
+        my $same_ref = !( !ref $e1 xor !ref $e2 );
+        my $not_ref = ( !ref $e1 and !ref $e2 );
+
+        if( defined $e1 xor defined $e2 ) {
+            $ok = 0;
+        }
+        elsif( !defined $e1 and !defined $e2 ) {
+            # Shortcut if they're both undefined.
+            $ok = 1;
+        }
+        elsif( _dne($e1) xor _dne($e2) ) {
+            $ok = 0;
+        }
+        elsif( $same_ref and( $e1 eq $e2 ) ) {
+            $ok = 1;
+        }
+        elsif($not_ref) {
+            push @Data_Stack, { type => '', vals => [ $e1, $e2 ] };
+            $ok = 0;
+        }
+        else {
+            if( $Refs_Seen{$e1} ) {
+                return $Refs_Seen{$e1} eq $e2;
+            }
+            else {
+                $Refs_Seen{$e1} = "$e2";
+            }
+
+            my $type = _type($e1);
+            $type = 'DIFFERENT' unless _type($e2) eq $type;
+
+            if( $type eq 'DIFFERENT' ) {
+                push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] };
+                $ok = 0;
+            }
+            elsif( $type eq 'ARRAY' ) {
+                $ok = _eq_array( $e1, $e2 );
+            }
+            elsif( $type eq 'HASH' ) {
+                $ok = _eq_hash( $e1, $e2 );
+            }
+            elsif( $type eq 'REF' ) {
+                push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] };
+                $ok = _deep_check( $$e1, $$e2 );
+                pop @Data_Stack if $ok;
+            }
+            elsif( $type eq 'SCALAR' ) {
+                push @Data_Stack, { type => 'REF', vals => [ $e1, $e2 ] };
+                $ok = _deep_check( $$e1, $$e2 );
+                pop @Data_Stack if $ok;
+            }
+            elsif($type) {
+                push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] };
+                $ok = 0;
+            }
+            else {
+                _whoa( 1, "No type in _deep_check" );
+            }
+        }
+    }
+
+    return $ok;
+}
+
+sub _whoa {
+    my( $check, $desc ) = @_;
+    if($check) {
+        die <<"WHOA";
+WHOA!  $desc
+This should never happen!  Please contact the author immediately!
+WHOA
+    }
+}
+
 =item B<eq_hash>
 
   my $is_eq = eq_hash(\%got, \%expected);
 =item B<eq_hash>
 
   my $is_eq = eq_hash(\%got, \%expected);
@@ -1489,6 +1611,40 @@ multi-level structures are handled correctly.
 Determines if the two hashes contain the same keys and values.  This
 is a deep check.
 
 Determines if the two hashes contain the same keys and values.  This
 is a deep check.
 
+=cut
+
+sub eq_hash {
+    local @Data_Stack = ();
+    return _deep_check(@_);
+}
+
+sub _eq_hash {
+    my( $a1, $a2 ) = @_;
+
+    if( grep _type($_) ne 'HASH', $a1, $a2 ) {
+        warn "eq_hash passed a non-hash ref";
+        return 0;
+    }
+
+    return 1 if $a1 eq $a2;
+
+    my $ok = 1;
+    my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2;
+    foreach my $k ( keys %$bigger ) {
+        my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE;
+        my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE;
+
+        next if _equal_nonrefs($e1, $e2);
+
+        push @Data_Stack, { type => 'HASH', idx => $k, vals => [ $e1, $e2 ] };
+        $ok = _deep_check( $e1, $e2 );
+        pop @Data_Stack if $ok;
+
+        last unless $ok;
+    }
+
+    return $ok;
+}
 
 =item B<eq_set>
 
 
 =item B<eq_set>
 
@@ -1514,17 +1670,58 @@ level.  The following is an example of a comparison which might not work:
 
 L<Test::Deep> contains much better set comparison functions.
 
 
 L<Test::Deep> contains much better set comparison functions.
 
+=cut
+
+sub eq_set {
+    my( $a1, $a2 ) = @_;
+    return 0 unless @$a1 == @$a2;
+
+    no warnings 'uninitialized';
+
+    # It really doesn't matter how we sort them, as long as both arrays are
+    # sorted with the same algorithm.
+    #
+    # Ensure that references are not accidentally treated the same as a
+    # string containing the reference.
+    #
+    # Have to inline the sort routine due to a threading/sort bug.
+    # See [rt.cpan.org 6782]
+    #
+    # I don't know how references would be sorted so we just don't sort
+    # them.  This means eq_set doesn't really work with refs.
+    return eq_array(
+        [ grep( ref, @$a1 ), sort( grep( !ref, @$a1 ) ) ],
+        [ grep( ref, @$a2 ), sort( grep( !ref, @$a2 ) ) ],
+    );
+}
+
 =back
 
 
 =head2 Extending and Embedding Test::More
 
 Sometimes the Test::More interface isn't quite enough.  Fortunately,
 =back
 
 
 =head2 Extending and Embedding Test::More
 
 Sometimes the Test::More interface isn't quite enough.  Fortunately,
-Test::More is built on top of L<Test::Stream> which provides a single,
+Test::More is built on top of L<Test::Builder> which provides a single,
 unified backend for any test library to use.  This means two test
 unified backend for any test library to use.  This means two test
-libraries which both use <Test::Stream> B<can> be used together in the
+libraries which both use <Test::Builder> B<can> be used together in the
 same program>.
 
 same program>.
 
+If you simply want to do a little tweaking of how the tests behave,
+you can access the underlying L<Test::Builder> object like so:
+
+=over 4
+
+=item B<builder>
+
+    my $test_builder = Test::More->builder;
+
+Returns the L<Test::Builder> object underlying Test::More for you to play
+with.
+
+
+=back
+
+
 =head1 EXIT CODES
 
 If all your tests passed, L<Test::Builder> will exit with zero (which is
 =head1 EXIT CODES
 
 If all your tests passed, L<Test::Builder> will exit with zero (which is
@@ -1553,53 +1750,31 @@ Test::More works with Perls as old as 5.8.1.
 Thread support is not very reliable before 5.10.1, but that's
 because threads are not very reliable before 5.10.1.
 
 Thread support is not very reliable before 5.10.1, but that's
 because threads are not very reliable before 5.10.1.
 
-Although Test::More has been a core module in versions of Perl since 5.6.2,
-Test::More has evolved since then, and not all of the features you're used to
-will be present in the shipped version of Test::More. If you are writing a
-module, don't forget to indicate in your package metadata the minimum version
-of Test::More that you require. For instance, if you want to use
-C<done_testing()> but want your test script to run on Perl 5.10.0, you will
-need to explicitly require Test::More > 0.88.
+Although Test::More has been a core module in versions of Perl since 5.6.2, Test::More has evolved since then, and not all of the features you're used to will be present in the shipped version of Test::More. If you are writing a module, don't forget to indicate in your package metadata the minimum version of Test::More that you require. For instance, if you want to use C<done_testing()> but want your test script to run on Perl 5.10.0, you will need to explicitly require Test::More > 0.88.
 
 Key feature milestones include:
 
 =over 4
 
 
 Key feature milestones include:
 
 =over 4
 
-=item event stream
-
-=item forking support
-
-=item tap encoding
-
-Test::Builder and Test::More version 1.301001 introduce these major
-modernizations.
-
 =item subtests
 
 =item subtests
 
-Subtests were released in Test::More 0.94, which came with Perl 5.12.0.
-Subtests did not implicitly call C<done_testing()> until 0.96; the first Perl
-with that fix was Perl 5.14.0 with 0.98.
+Subtests were released in Test::More 0.94, which came with Perl 5.12.0. Subtests did not implicitly call C<done_testing()> until 0.96; the first Perl with that fix was Perl 5.14.0 with 0.98.
 
 =item C<done_testing()>
 
 
 =item C<done_testing()>
 
-This was released in Test::More 0.88 and first shipped with Perl in 5.10.1 as
-part of Test::More 0.92.
+This was released in Test::More 0.88 and first shipped with Perl in 5.10.1 as part of Test::More 0.92. 
 
 =item C<cmp_ok()>
 
 
 =item C<cmp_ok()>
 
-Although C<cmp_ok()> was introduced in 0.40, 0.86 fixed an important bug to
-make it safe for overloaded objects; the fixed first shipped with Perl in
-5.10.1 as part of Test::More 0.92.
+Although C<cmp_ok()> was introduced in 0.40, 0.86 fixed an important bug to make it safe for overloaded objects; the fixed first shipped with Perl in 5.10.1 as part of Test::More 0.92.
 
 =item C<new_ok()> C<note()> and C<explain()>
 
 
 =item C<new_ok()> C<note()> and C<explain()>
 
-These were was released in Test::More 0.82, and first shipped with Perl in
-5.10.1 as part of Test::More 0.92.
+These were was released in Test::More 0.82, and first shipped with Perl in 5.10.1 as part of Test::More 0.92. 
 
 =back
 
 
 =back
 
-There is a full version history in the Changes file, and the Test::More
-versions included as core can be found using L<Module::CoreList>:
+There is a full version history in the Changes file, and the Test::More versions included as core can be found using L<Module::CoreList>:
 
     $ corelist -a Test::More
 
 
     $ corelist -a Test::More
 
@@ -1611,33 +1786,22 @@ versions included as core can be found using L<Module::CoreList>:
 =item utf8 / "Wide character in print"
 
 If you use utf8 or other non-ASCII characters with Test::More you
 =item utf8 / "Wide character in print"
 
 If you use utf8 or other non-ASCII characters with Test::More you
-might get a "Wide character in print" warning.
-Using C<< binmode STDOUT, ":utf8" >> will not fix it.
+might get a "Wide character in print" warning.  Using
+C<< binmode STDOUT, ":utf8" >> will not fix it.
+L<Test::Builder> (which powers
+Test::More) duplicates STDOUT and STDERR.  So any changes to them,
+including changing their output disciplines, will not be seem by
+Test::More.
 
 
-Use the C<tap_encoding> function to configure the TAP stream encoding.
+One work around is to apply encodings to STDOUT and STDERR as early
+as possible and before Test::More (or any other Test module) loads.
 
 
-    use utf8;
-    use Test::Stream; # imports tap_encoding
-    use Test::More;
-    tap_encoding 'utf8';
-
-L<Test::Builder> (which powers Test::More) duplicates STDOUT and STDERR.
-So any changes to them, including changing their output disciplines,
-will not be seen by Test::More.
-
-B<Note>:deprecated ways to use utf8 or other non-ASCII characters.
-
-In the past it was necessary to alter the filehandle encoding prior to loading
-Test::More. This is no longer necessary thanks to C<tap_encoding()>.
-
-    # *** DEPRECATED WAY ***
     use open ':std', ':encoding(utf8)';
     use Test::More;
 
 A more direct work around is to change the filehandles used by
 L<Test::Builder>.
 
     use open ':std', ':encoding(utf8)';
     use Test::More;
 
 A more direct work around is to change the filehandles used by
 L<Test::Builder>.
 
-    # *** EVEN MORE DEPRECATED WAY ***
     my $builder = Test::More->builder;
     binmode $builder->output,         ":encoding(utf8)";
     binmode $builder->failure_output, ":encoding(utf8)";
     my $builder = Test::More->builder;
     binmode $builder->output,         ":encoding(utf8)";
     binmode $builder->failure_output, ":encoding(utf8)";
@@ -1661,11 +1825,6 @@ complex data structures.
 
 =item Threads
 
 
 =item Threads
 
-B<NOTE:> The underlying mechanism to support threads has changed as of version
-1.301001. Instead of sharing several variables and locking them, threads now
-use the same mechanism as forking support. The new system writes events to temp
-files which are culled by the main process.
-
 Test::More will only be aware of threads if C<use threads> has been done
 I<before> Test::More is loaded.  This is ok:
 
 Test::More will only be aware of threads if C<use threads> has been done
 I<before> Test::More is loaded.  This is ok:
 
@@ -1699,6 +1858,8 @@ magic side-effects are kept to a minimum.  WYSIWYG.
 
 =head1 SEE ALSO
 
 
 =head1 SEE ALSO
 
+=head2
+
 =head2 ALTERNATIVES
 
 L<Test::Simple> if all this confuses you and you just want to write
 =head2 ALTERNATIVES
 
 L<Test::Simple> if all this confuses you and you just want to write
@@ -1746,12 +1907,14 @@ L<Bundle::Test> installs a whole bunch of useful test modules.
 
 L<Test::Most> Most commonly needed test functions and features.
 
 
 L<Test::Most> Most commonly needed test functions and features.
 
-=head1 SOURCE
+=head1 AUTHORS
 
 
-The source code repository for Test::More can be found at
-F<http://github.com/Test-More/test-more/>.
+Michael G Schwern E<lt>schwern@pobox.comE<gt> with much inspiration
+from Joshua Pritikin's Test module and lots of help from Barrie
+Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and
+the perl-qa gang.
 
 
-=head1 MAINTAINER
+=head1 MAINTAINERS
 
 =over 4
 
 
 =over 4
 
@@ -1759,57 +1922,20 @@ F<http://github.com/Test-More/test-more/>.
 
 =back
 
 
 =back
 
-=head1 AUTHORS
-
-The following people have all contributed to the Test-More dist (sorted using
-VIM's sort function).
-
-=over 4
 
 
-=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+=head1 BUGS
 
 
-=item Fergal Daly E<lt>fergal@esatclear.ie>E<gt>
+See F<http://rt.cpan.org> to report and view bugs.
 
 
-=item Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
 
 
-=item Michael G Schwern E<lt>schwern@pobox.comE<gt>
+=head1 SOURCE
 
 
-=item 唐鳳
+The source code repository for Test::More can be found at
+F<http://github.com/Test-More/test-more/>.
 
 
-=back
 
 =head1 COPYRIGHT
 
 
 =head1 COPYRIGHT
 
-There has been a lot of code migration between modules,
-here are all the original copyrights together:
-
-=over 4
-
-=item Test::Stream
-
-=item Test::Stream::Tester
-
-Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=item Test::Simple
-
-=item Test::More
-
-=item Test::Builder
-
-Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much
-inspiration from Joshua Pritikin's Test module and lots of help from Barrie
-Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa
-gang.
-
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
-
 Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
 
 This program is free software; you can redistribute it and/or
 Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
 
 This program is free software; you can redistribute it and/or
@@ -1817,29 +1943,6 @@ modify it under the same terms as Perl itself.
 
 See F<http://www.perl.com/perl/misc/Artistic.html>
 
 
 See F<http://www.perl.com/perl/misc/Artistic.html>
 
-=item Test::use::ok
-
-To the extent possible under law, 唐鳳 has waived all copyright and related
-or neighboring rights to L<Test-use-ok>.
-
-This work is published from Taiwan.
-
-L<http://creativecommons.org/publicdomain/zero/1.0>
-
-=item Test::Tester
+=cut
 
 
-This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts
-are based on other people's work.
-
-Under the same license as Perl itself
-
-See http://www.perl.com/perl/misc/Artistic.html
-
-=item Test::Builder::Tester
-
-Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
-
-This program is free software; you can redistribute it
-and/or modify it under the same terms as Perl itself.
-
-=back
+1;
diff --git a/cpan/Test-Simple/lib/Test/More/DeepCheck.pm b/cpan/Test-Simple/lib/Test/More/DeepCheck.pm
deleted file mode 100644 (file)
index 0f9ae9a..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-package Test::More::DeepCheck;
-use strict;
-use warnings;
-
-use Test::Stream::ArrayBase(
-    accessors => [qw/seen/],
-);
-
-sub init {
-    $_[0]->[SEEN] ||= [{}];
-}
-
-my %PAIRS = ( '{' => '}', '[' => ']' );
-my $DNE = bless [], 'Does::Not::Exist';
-
-sub is_dne { ref $_[-1] eq ref $DNE }
-sub dne { $DNE };
-
-sub preface { "" };
-
-sub format_stack {
-    my $self = shift;
-    my $start = $self->STACK_START;
-    my $end   = @$self - 1;
-
-    my @Stack = @{$self}[$start .. $end];
-
-    my @parts1 = ('     $got');
-    my @parts2 = ('$expected');
-
-    my $did_arrow = 0;
-    for my $entry (@St