4 use Test::More tests => 15;
12 has 'thing' => ( is => 'rw' );
18 use MooseX::StrictConstructor;
20 has 'thing' => ( is => 'rw' );
26 use MooseX::StrictConstructor;
30 has 'size' => ( is => 'rw' );
36 use MooseX::StrictConstructor;
38 has 'thing' => ( is => 'rw' );
45 delete $params->{spy};
52 use MooseX::StrictConstructor;
54 has 'thing' => ( is => 'rw', 'init_arg' => 'other' );
55 has 'size' => ( is => 'rw', 'init_arg' => undef );
59 package ImmutableInitArg;
61 use MooseX::StrictConstructor;
63 has 'thing' => ( is => 'rw', 'init_arg' => 'other' );
64 has 'size' => ( is => 'rw', 'init_arg' => undef );
67 __PACKAGE__->meta()->make_immutable();
73 use MooseX::StrictConstructor;
75 has 'thing' => ( is => 'rw' );
78 __PACKAGE__->meta()->make_immutable();
82 package ImmutableTricky;
84 use MooseX::StrictConstructor;
86 has 'thing' => ( is => 'rw' );
93 delete $params->{spy};
97 __PACKAGE__->meta()->make_immutable();
101 eval { Standard->new( thing => 1, bad => 99 ) };
102 is( $@, '', 'standard Moose class ignores unknown params' );
104 eval { Stricter->new( thing => 1, bad => 99 ) };
105 like( $@, qr/unknown attribute.+: bad/, 'strict constructor blows up on unknown params' );
107 eval { Subclass->new( thing => 1, size => 'large' ) };
108 is( $@, '', 'subclass constructor handles known attributes correctly' );
110 eval { Tricky->new( thing => 1, spy => 99 ) };
111 is( $@, '', 'can work around strict constructor by deleting params in BUILD()' );
113 eval { Tricky->new( thing => 1, agent => 99 ) };
114 like( $@, qr/unknown attribute.+: agent/, 'Tricky still blows up on unknown params other than spy' );
116 eval { Subclass->new( thing => 1, bad => 99 ) };
117 like( $@, qr/unknown attribute.+: bad/, 'subclass constructor blows up on unknown params' );
119 eval { InitArg->new( thing => 1 ) };
120 like( $@, qr/unknown attribute.+: thing/,
121 'InitArg blows up with attribute name' );
123 eval { InitArg->new( size => 1 ) };
124 like( $@, qr/unknown attribute.+: size/,
125 'InitArg blows up when given attribute with undef init_arg' );
127 eval { InitArg->new( other => 1 ) };
129 'InitArg works when given proper init_arg' );
131 eval { ImmutableInitArg->new( thing => 1 ) };
132 like( $@, qr/unknown attribute.+: thing/,
133 'ImmutableInitArg blows up with attribute name' );
135 eval { ImmutableInitArg->new( size => 1 ) };
136 like( $@, qr/unknown attribute.+: size/,
137 'ImmutableInitArg blows up when given attribute with undef init_arg' );
139 eval { ImmutableInitArg->new( other => 1 ) };
141 'ImmutableInitArg works when given proper init_arg' );
143 eval { Immutable->new( thing => 1, bad => 99 ) };
144 like( $@, qr/unknown attribute.+: bad/,
145 'strict constructor in immutable class blows up on unknown params' );
147 eval { ImmutableTricky->new( thing => 1, spy => 99 ) };
149 'immutable class can work around strict constructor by deleting params in BUILD()' );
151 eval { ImmutableTricky->new( thing => 1, agent => 99 ) };
152 like( $@, qr/unknown attribute.+: agent/,
153 'ImmutableTricky still blows up on unknown params other than spy' );