12 has 'thing' => ( is => 'rw' );
20 use MooseX::StrictConstructor;
22 has 'thing' => ( is => 'rw' );
30 use MooseX::StrictConstructor;
34 has 'size' => ( is => 'rw' );
42 use MooseX::StrictConstructor;
44 has 'thing' => ( is => 'rw' );
50 delete $params->{spy};
59 use MooseX::StrictConstructor;
61 has 'thing' => ( is => 'rw', 'init_arg' => 'other' );
62 has 'size' => ( is => 'rw', 'init_arg' => undef );
67 package ImmutableInitArg;
70 use MooseX::StrictConstructor;
72 has 'thing' => ( is => 'rw', 'init_arg' => 'other' );
73 has 'size' => ( is => 'rw', 'init_arg' => undef );
76 __PACKAGE__->meta()->make_immutable();
84 use MooseX::StrictConstructor;
86 has 'thing' => ( is => 'rw' );
89 __PACKAGE__->meta()->make_immutable();
94 package ImmutableTricky;
97 use MooseX::StrictConstructor;
99 has 'thing' => ( is => 'rw' );
105 delete $params->{spy};
109 __PACKAGE__->meta()->make_immutable();
112 eval { Standard->new( thing => 1, bad => 99 ) };
113 is( $@, '', 'standard Moose class ignores unknown params' );
115 eval { Stricter->new( thing => 1, bad => 99 ) };
116 like( $@, qr/unknown attribute.+: bad/,
117 'strict constructor blows up on unknown params' );
119 eval { Subclass->new( thing => 1, size => 'large' ) };
120 is( $@, '', 'subclass constructor handles known attributes correctly' );
122 eval { Tricky->new( thing => 1, spy => 99 ) };
124 'can work around strict constructor by deleting params in BUILD()' );
126 eval { Tricky->new( thing => 1, agent => 99 ) };
127 like( $@, qr/unknown attribute.+: agent/,
128 'Tricky still blows up on unknown params other than spy' );
130 eval { Subclass->new( thing => 1, bad => 99 ) };
131 like( $@, qr/unknown attribute.+: bad/,
132 'subclass constructor blows up on unknown params' );
134 eval { InitArg->new( thing => 1 ) };
136 $@, qr/unknown attribute.+: thing/,
137 'InitArg blows up with attribute name'
140 eval { InitArg->new( size => 1 ) };
142 $@, qr/unknown attribute.+: size/,
143 'InitArg blows up when given attribute with undef init_arg'
146 eval { InitArg->new( other => 1 ) };
149 'InitArg works when given proper init_arg'
152 eval { ImmutableInitArg->new( thing => 1 ) };
154 $@, qr/unknown attribute.+: thing/,
155 'ImmutableInitArg blows up with attribute name'
158 eval { ImmutableInitArg->new( size => 1 ) };
160 $@, qr/unknown attribute.+: size/,
161 'ImmutableInitArg blows up when given attribute with undef init_arg'
164 eval { ImmutableInitArg->new( other => 1 ) };
167 'ImmutableInitArg works when given proper init_arg'
170 eval { Immutable->new( thing => 1, bad => 99 ) };
172 $@, qr/unknown attribute.+: bad/,
173 'strict constructor in immutable class blows up on unknown params'
176 eval { ImmutableTricky->new( thing => 1, spy => 99 ) };
179 'immutable class can work around strict constructor by deleting params in BUILD()'
182 eval { ImmutableTricky->new( thing => 1, agent => 99 ) };
184 $@, qr/unknown attribute.+: agent/,
185 'ImmutableTricky still blows up on unknown params other than spy'