Make sure to local-ize $@ and $SIG{__DIE__} for each eval, and rethrow
Dave Rolsky [Sun, 21 Jun 2009 15:57:49 +0000 (10:57 -0500)]
$@ as needed.

lib/Class/MOP/Class.pm
lib/Class/MOP/Module.pm

index 964e73e..ecfe5b2 100644 (file)
@@ -855,7 +855,12 @@ sub add_attribute {
     $self->get_attribute_map->{$attribute->name} = $attribute;
 
     # invalidate package flag here
-    my $e = do { local $@; eval { $attribute->install_accessors() }; $@ };
+    my $e = do {
+        local $@;
+        local $SIG{__DIE__};
+        eval { $attribute->install_accessors() };
+        $@;
+    };
     if ( $e ) {
         $self->remove_attribute($attribute->name);
         die $e;
index ffd6721..6d0f785 100644 (file)
@@ -50,8 +50,13 @@ sub _instantiate_module {
     $code .= "\$$package_name\:\:AUTHORITY = '" . $authority . "';"
         if defined $authority;
 
-    eval $code;
-    confess "creation of $package_name failed : $@" if $@;
+    my $e = do {
+        local $@;
+        local $SIG{__DIE__};
+        eval $code;
+        $@;
+    };
+    confess "creation of $package_name failed : $e" if $e;
 }
 
 1;