12 package Test::Attribute::Inline::Documentation;
17 The 'foo' attribute is my favorite
18 attribute in the whole wide world.
24 my $foo_attr = Test::Attribute::Inline::Documentation->meta->get_attribute('foo');
26 ok($foo_attr->has_documentation, '... the foo has docs');
27 is($foo_attr->documentation,
29 The 'foo' attribute is my favorite
30 attribute in the whole wide world.
32 '... got the foo docs');
37 package Test::For::Lazy::TypeConstraint;
39 use Moose::Util::TypeConstraints;
41 has 'bad_lazy_attr' => (
45 default => sub { "test" },
48 has 'good_lazy_attr' => (
52 default => sub { [] },
57 my $test = Test::For::Lazy::TypeConstraint->new;
58 isa_ok($test, 'Test::For::Lazy::TypeConstraint');
62 } '... this does not work';
65 $test->good_lazy_attr;
66 } '... this does not work';
71 package Test::Arrayref::Attributes;
74 has [qw(foo bar baz)] => (
80 my $test = Test::Arrayref::Attributes->new;
81 isa_ok($test, 'Test::Arrayref::Attributes');
82 can_ok($test, qw(foo bar baz));
88 package Test::Arrayref::RoleAttributes::Role;
91 has [qw(foo bar baz)] => (
97 package Test::Arrayref::RoleAttributes;
99 with 'Test::Arrayref::RoleAttributes::Role';
102 my $test = Test::Arrayref::RoleAttributes->new;
103 isa_ok($test, 'Test::Arrayref::RoleAttributes');
104 can_ok($test, qw(foo bar baz));
110 package Test::UndefDefault::Attributes;
116 default => sub { return }
122 Test::UndefDefault::Attributes->new;
123 } '... default must return a value which passes the type constraint';
129 package OverloadedStr;
131 use overload '""' => sub { 'this is *not* a string' };
133 has 'a_str' => ( isa => 'Str' , is => 'rw' );
136 my $moose_obj = OverloadedStr->new;
138 is($moose_obj->a_str( 'foobar' ), 'foobar', 'setter took string');
139 ok($moose_obj, 'this is a *not* a string');
142 $moose_obj->a_str( $moose_obj )
143 } qr/Attribute \(a_str\) does not pass the type constraint because\: Validation failed for 'Str' failed with value OverloadedStr=HASH\(0x.+?\)/,
144 '... dies without overloading the string';
150 package OverloadBreaker;
153 has 'a_num' => ( isa => 'Int' , is => 'rw', default => 7.5 );
157 OverloadBreaker->new;
158 } qr/Attribute \(a_num\) does not pass the type constraint because\: Validation failed for 'Int' failed with value 7\.5/,
159 '... this doesnt trip overload to break anymore ';
162 OverloadBreaker->new(a_num => 5);
163 } '... this works fine though';
169 package Test::Builder::Attribute;
172 has 'foo' => ( required => 1, builder => 'build_foo', is => 'ro');
173 sub build_foo { return "works" };
176 my $meta = Test::Builder::Attribute->meta;
177 my $foo_attr = $meta->get_attribute("foo");
179 ok($foo_attr->is_required, "foo is required");
180 ok($foo_attr->has_builder, "foo has builder");
181 is($foo_attr->builder, "build_foo", ".. and it's named build_foo");
183 my $instance = Test::Builder::Attribute->new;
184 is($instance->foo, 'works', "foo builder works");
189 package Test::Builder::Attribute::Broken;
192 has 'foo' => ( required => 1, builder => 'build_foo', is => 'ro');
196 Test::Builder::Attribute::Broken->new;
197 } '... no builder, wtf';
203 package Test::LazyBuild::Attribute;
206 has 'foo' => ( lazy_build => 1, is => 'ro');
207 has '_foo' => ( lazy_build => 1, is => 'ro');
208 has 'fool' => ( lazy_build => 1, is => 'ro');
209 sub _build_foo { return "works" };
210 sub _build__foo { return "works too" };
213 my $meta = Test::LazyBuild::Attribute->meta;
214 my $foo_attr = $meta->get_attribute("foo");
215 my $_foo_attr = $meta->get_attribute("_foo");
217 ok($foo_attr->is_lazy, "foo is lazy");
218 ok($foo_attr->is_lazy_build, "foo is lazy_build");
220 ok($foo_attr->has_clearer, "foo has clearer");
221 is($foo_attr->clearer, "clear_foo", ".. and it's named clear_foo");
223 ok($foo_attr->has_builder, "foo has builder");
224 is($foo_attr->builder, "_build_foo", ".. and it's named build_foo");
226 ok($foo_attr->has_predicate, "foo has predicate");
227 is($foo_attr->predicate, "has_foo", ".. and it's named has_foo");
229 ok($_foo_attr->is_lazy, "_foo is lazy");
230 ok(!$_foo_attr->is_required, "lazy_build attributes are no longer automatically required");
231 ok($_foo_attr->is_lazy_build, "_foo is lazy_build");
233 ok($_foo_attr->has_clearer, "_foo has clearer");
234 is($_foo_attr->clearer, "_clear_foo", ".. and it's named _clear_foo");
236 ok($_foo_attr->has_builder, "_foo has builder");
237 is($_foo_attr->builder, "_build__foo", ".. and it's named _build_foo");
239 ok($_foo_attr->has_predicate, "_foo has predicate");
240 is($_foo_attr->predicate, "_has_foo", ".. and it's named _has_foo");
242 my $instance = Test::LazyBuild::Attribute->new;
243 ok(!$instance->has_foo, "noo foo value yet");
244 ok(!$instance->_has_foo, "noo _foo value yet");
245 is($instance->foo, 'works', "foo builder works");
246 is($instance->_foo, 'works too', "foo builder works too");
247 throws_ok { $instance->fool }
248 qr/Test::LazyBuild::Attribute does not support builder method \'_build_fool\' for attribute \'fool\'/,
249 "Correct error when a builder method is not present";
254 package OutOfClassTest;
259 lives_ok { OutOfClassTest::has('foo', is => 'bare'); } 'create attr via direct sub call';
260 lives_ok { OutOfClassTest->can('has')->('bar', is => 'bare'); } 'create attr via can';
262 ok(OutOfClassTest->meta->get_attribute('foo'), 'attr created from sub call');
263 ok(OutOfClassTest->meta->get_attribute('bar'), 'attr created from can');
271 ::throws_ok { has 'foo' => ( 'ro', isa => 'Str' ) }
272 qr/^Usage/, 'has throws error with odd number of attribute options';