stop compiling stuff in the Eval::Closure package directly
Jesse Luehrs [Tue, 2 Aug 2011 04:43:45 +0000 (23:43 -0500)]
lib/Eval/Closure.pm
t/compiling-package.t [new file with mode: 0644]

index 787754c..45c36b6 100644 (file)
@@ -202,7 +202,11 @@ sub _clean_eval_closure {
         unless (exists $compiler_cache{$source}) {
             local $@;
             local $SIG{__DIE__};
-            my $compiler = eval $source;
+            my $compiler = do {
+                package # hide from PAUSE
+                    Eval::Closure::Sandbox;
+                eval $source;
+            };
             my $e = $@;
             $compiler_cache{$source} = [ $compiler, $e ];
         }
diff --git a/t/compiling-package.t b/t/compiling-package.t
new file mode 100644 (file)
index 0000000..5c3764f
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+
+use Eval::Closure;
+
+my $code = eval_closure(
+    source => 'no strict "refs"; sub { keys %{__PACKAGE__ . "::"} }',
+);
+
+# defining the sub { } creates __ANON__, calling 'no strict' creates BEGIN
+my @stash_keys = grep { $_ ne '__ANON__' && $_ ne 'BEGIN' } $code->();
+
+is_deeply([@stash_keys], [], "compiled in an empty package");
+
+done_testing;