Commit | Line | Data |
cdf3cae6 |
1 | use strict; |
2 | use warnings; |
3 | |
7a9e42d0 |
4 | use Moose (); |
a28e50e4 |
5 | use Test::More; |
7a9e42d0 |
6 | use Test::Exception; |
7 | use Test::Moose; |
cdf3cae6 |
8 | |
9 | { |
7a9e42d0 |
10 | my $name = 'Foo1'; |
11 | |
12 | sub build_class { |
13 | my ( $attr1, $attr2, $attr3 ) = @_; |
14 | |
15 | my $class = Moose::Meta::Class->create( |
16 | $name++, |
17 | superclasses => ['Moose::Object'], |
18 | ); |
19 | |
20 | $class->add_attribute( |
21 | callback => ( |
22 | traits => ['Code'], |
23 | isa => 'CodeRef', |
24 | required => 1, |
25 | handles => { 'invoke_callback' => 'execute' }, |
26 | %{ $attr1 || {} }, |
27 | ) |
28 | ); |
29 | |
30 | $class->add_attribute( |
31 | callback_method => ( |
32 | traits => ['Code'], |
33 | isa => 'CodeRef', |
34 | required => 1, |
35 | handles => { 'invoke_method_callback' => 'execute_method' }, |
36 | %{ $attr2 || {} }, |
37 | ) |
38 | ); |
39 | |
40 | $class->add_attribute( |
41 | multiplier => ( |
42 | traits => ['Code'], |
43 | isa => 'CodeRef', |
44 | required => 1, |
45 | handles => { 'multiply' => 'execute' }, |
46 | %{ $attr3 || {} }, |
47 | ) |
48 | ); |
49 | |
50 | return $class->name; |
51 | } |
52 | } |
53 | |
54 | { |
55 | my $i; |
d9299060 |
56 | |
7a9e42d0 |
57 | my %subs = ( |
58 | callback => sub { ++$i }, |
59 | callback_method => sub { shift->multiply(@_) }, |
60 | multiplier => sub { $_[0] * 2 }, |
cdf3cae6 |
61 | ); |
63723115 |
62 | |
7a9e42d0 |
63 | run_tests( build_class, \$i, \%subs ); |
64 | |
65 | run_tests( |
66 | build_class( |
67 | { |
68 | lazy => 1, default => sub { $subs{callback} } |
69 | }, { |
70 | lazy => 1, default => sub { $subs{callback_method} } |
71 | }, { |
72 | lazy => 1, default => sub { $subs{multiplier} } |
73 | }, |
74 | ), |
75 | \$i, |
63723115 |
76 | ); |
cdf3cae6 |
77 | } |
78 | |
7a9e42d0 |
79 | sub run_tests { |
80 | my ( $class, $iref, @args ) = @_; |
81 | |
82 | ok( |
83 | !$class->can($_), |
84 | "Code trait didn't create reader method for $_" |
85 | ) for qw(callback callback_method multiplier); |
86 | |
87 | with_immutable { |
88 | ${$iref} = 0; |
89 | my $obj = $class->new(@args); |
90 | |
91 | $obj->invoke_callback; |
92 | |
93 | is( ${$iref}, 1, '$i is 1 after invoke_callback' ); |
94 | |
95 | is( |
96 | $obj->invoke_method_callback(3), 6, |
97 | 'invoke_method_callback calls multiply with @_' |
98 | ); |
99 | |
100 | is( $obj->multiply(3), 6, 'multiple double value' ); |
101 | } |
102 | $class; |
103 | } |
12885414 |
104 | |
a28e50e4 |
105 | done_testing; |