summaryrefslogtreecommitdiff
path: root/t/cmop/before_after_dollar_under.t
diff options
context:
space:
mode:
Diffstat (limited to 't/cmop/before_after_dollar_under.t')
-rw-r--r--t/cmop/before_after_dollar_under.t70
1 files changed, 70 insertions, 0 deletions
diff --git a/t/cmop/before_after_dollar_under.t b/t/cmop/before_after_dollar_under.t
new file mode 100644
index 0000000..65f9774
--- /dev/null
+++ b/t/cmop/before_after_dollar_under.t
@@ -0,0 +1,70 @@
+use strict;
+use warnings;
+
+use Class::MOP;
+use Class::MOP::Class;
+use Test::More;
+use Test::Fatal;
+
+my %results;
+
+{
+
+ package Base;
+ use metaclass;
+ sub hey { $results{base}++ }
+}
+
+for my $wrap (qw(before after)) {
+ my $meta = Class::MOP::Class->create_anon_class(
+ superclasses => [ 'Base', 'Class::MOP::Object' ] );
+ my $alter = "add_${wrap}_method_modifier";
+ $meta->$alter(
+ 'hey' => sub {
+ $results{wrapped}++;
+ $_ = 'barf'; # 'barf' would replace the cached wrapper subref
+ }
+ );
+
+ %results = ();
+ my $o = $meta->get_meta_instance->create_instance;
+ isa_ok( $o, 'Base' );
+ is( exception {
+ $o->hey;
+ $o->hey
+ ; # this would die with 'Can't use string ("barf") as a subroutine ref while "strict refs" in use'
+ }, undef, 'wrapped doesn\'t die when $_ gets changed' );
+ is_deeply(
+ \%results, { base => 2, wrapped => 2 },
+ 'saw expected calls to wrappers'
+ );
+}
+
+{
+ my $meta = Class::MOP::Class->create_anon_class(
+ superclasses => [ 'Base', 'Class::MOP::Object' ] );
+ for my $wrap (qw(before after)) {
+ my $alter = "add_${wrap}_method_modifier";
+ $meta->$alter(
+ 'hey' => sub {
+ $results{wrapped}++;
+ $_ = 'barf'; # 'barf' would replace the cached wrapper subref
+ }
+ );
+ }
+
+ %results = ();
+ my $o = $meta->get_meta_instance->create_instance;
+ isa_ok( $o, 'Base' );
+ is( exception {
+ $o->hey;
+ $o->hey
+ ; # this would die with 'Can't use string ("barf") as a subroutine ref while "strict refs" in use'
+ }, undef, 'double-wrapped doesn\'t die when $_ gets changed' );
+ is_deeply(
+ \%results, { base => 2, wrapped => 4 },
+ 'saw expected calls to wrappers'
+ );
+}
+
+done_testing;