+
+{
+ local *foo = sub { 'a' };
+ {
+ {
+ localize *foo, sub { 'b' } => UP;
+ is foo(), 'a', 'localize *foo, sub { "b" } => UP [not yet 1]';
+ {
+ no warnings 'redefine';
+ local *foo = sub { 'c' };
+ is foo(), 'c', 'localize *foo, sub { "b" } => UP [localized 1]';
+ }
+ is foo(), 'a', 'localize *foo, sub { "b" } => UP [not yet 2]';
+ }
+ is foo(), 'b', 'localize *foo, sub { "b" } => UP [ok 1]';
+ {
+ no warnings 'redefine';
+ local *foo = sub { 'd' };
+ is foo(), 'd', 'localize *foo, sub { "b" } => UP [localized 2]';
+ }
+ is foo(), 'b', 'localize *foo, sub { "b" } => UP [ok 2]';
+ }
+ is foo(), 'a', 'localize *foo, sub { "b" } => UP [end]';
+}
+
+{
+ local *foo = sub { 'x' };
+ {
+ {
+ localize *foo, sub { 'y' } => UP;
+ is foo(), 'x', 'localize *foo, sub { "y" } => UP [not yet]';
+ }
+ is foo(), 'y', 'localize *foo, sub { "y" } => UP [ok]';
+ no warnings 'redefine';
+ *foo = sub { 'z' };
+ is foo(), 'z', 'localize *foo, sub { "y" } => UP [replaced]';
+ }
+ is foo(), 'x', 'localize *foo, sub { "y" } => UP [end]';
+}
+
+# Invalid
+
+sub invalid_ref { qr/^Invalid \Q$_[0]\E reference as the localization target/ }
+
+{
+ eval { localize \1, 0 => HERE };
+ like $@, invalid_ref('SCALAR'), 'invalid localize \1, 0 => HERE';
+}
+
+{
+ eval { localize [ ], 0 => HERE };
+ like $@, invalid_ref('ARRAY'), 'invalid localize [ ], 0 => HERE';
+}
+
+{
+ eval { localize { }, 0 => HERE };
+ like $@, invalid_ref('HASH'), 'invalid localize { }, 0 => HERE';
+}
+
+{
+ eval { localize sub { }, 0 => HERE };
+ like $@, invalid_ref('CODE'), 'invalid localize sub { }, 0 => HERE';
+}