supported RegExp method name for before/after/around method modifier.
[gitmo/Moose.git] / t / 500_test_moose / 005_method_modifier_with_regexp.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 13;
7
8 BEGIN {
9     use_ok('Moose');
10 }
11
12 {
13
14     package Dog;
15     use Moose;
16
17     sub bark_once {
18         my $self = shift;
19         return 'bark';
20     }
21
22     sub bark_twice {
23         return 'barkbark';
24     }
25
26     around qr/bark.*/ => sub {
27         'Dog::around';
28     };
29
30 }
31
32 my $dog = Dog->new;
33 is( $dog->bark_once,  'Dog::around', 'around modifier is called' );
34 is( $dog->bark_twice, 'Dog::around', 'around modifier is called' );
35
36 {
37
38     package Cat;
39     use Moose;
40     our $BEFORE_BARK_COUNTER = 0;
41     our $AFTER_BARK_COUNTER  = 0;
42
43     sub bark_once {
44         my $self = shift;
45         return 'bark';
46     }
47
48     sub bark_twice {
49         return 'barkbark';
50     }
51
52     before qr/bark.*/ => sub {
53         $BEFORE_BARK_COUNTER++;
54     };
55
56     after qr/bark.*/ => sub {
57         $AFTER_BARK_COUNTER++;
58     };
59
60 }
61
62 my $cat = Cat->new;
63 $cat->bark_once;
64 is( $Cat::BEFORE_BARK_COUNTER, 1, 'before modifier is called once' );
65 is( $Cat::AFTER_BARK_COUNTER,  1, 'after modifier is called once' );
66 $cat->bark_twice;
67 is( $Cat::BEFORE_BARK_COUNTER, 2, 'before modifier is called twice' );
68 is( $Cat::AFTER_BARK_COUNTER,  2, 'after modifier is called twice' );
69
70 {
71
72     package Animal;
73     use Moose;
74     our $BEFORE_BARK_COUNTER = 0;
75     our $AFTER_BARK_COUNTER  = 0;
76
77     sub bark_once {
78         my $self = shift;
79         return 'bark';
80     }
81
82     sub bark_twice {
83         return 'barkbark';
84     }
85
86     before qr/bark.*/ => sub {
87         $BEFORE_BARK_COUNTER++;
88     };
89
90     after qr/bark.*/ => sub {
91         $AFTER_BARK_COUNTER++;
92     };
93 }
94
95 {
96
97     package Cow;
98     use Moose;
99     extends 'Animal';
100
101     override 'bark_once' => sub {
102         my $self = shift;
103         return 'cow';
104     };
105
106     override 'bark_twice' => sub {
107         return 'cowcow';
108     };
109 }
110
111 TODO: {
112     local $TODO = "method modifier isn't called if method id overridden";
113     my $cow = Cow->new;
114     $cow->bark_once;
115     is( $Animal::BEFORE_BARK_COUNTER, 1,
116         'before modifier is called if method is overridden' );
117     is( $Animal::AFTER_BARK_COUNTER, 1,
118         'after modifier is called if method is overridden' );
119 }
120
121 {
122
123     package Penguin;
124     use Moose;
125     extends 'Animal';
126     our $AUGMENT_CALLED = 0;
127
128     augment 'bark_once' => sub {
129         my $self = shift;
130         $self->dummy;
131         inner();
132         $self->dummy;
133     };
134
135     sub dummy {
136         $AUGMENT_CALLED++;
137     }
138 }
139 $Animal::BEFORE_BARK_COUNTER = 0;
140 $Animal::AFTER_BARK_COUNTER  = 0;
141 my $penguin = Penguin->new;
142 warn $penguin->bark_once;
143 is( $Animal::BEFORE_BARK_COUNTER, 1,
144     'before modifier is called if augment is used' );
145 is( $Animal::AFTER_BARK_COUNTER, 1,
146     'after modifier is called if augment is used' );
147 TODO: {
148     local $TODO = "The method modifier isn't called if the augment specified it";
149     is( $Penguin::AUGMENT_CALLED, 2, 'augment is called' );
150 }
151
152 {
153
154     package MyDog;
155     use Moose;
156     our $BEFORE_BARK_COUNTER=0;
157     sub bark {
158         my $self = shift;
159         return 'bark';
160     }
161     
162     sub bark_twice {
163         my $self = shift;
164         return 'barkbark';
165     }
166
167     before qw/bark bark_twice/ => sub {
168         $BEFORE_BARK_COUNTER++;
169     };
170
171 }
172
173 my $my_dog = MyDog->new;
174 $my_dog->bark;
175 $my_dog->bark_twice;
176 is($MyDog::BEFORE_BARK_COUNTER, 2, "before method modifier is called twice");
177