Clarify how roles do and do not participate in inheritance.
[gitmo/Moose.git] / lib / Moose / Manual / Attributes.pod
CommitLineData
8d38e631 1=pod
2
3=head1 NAME
4
6c384d50 5Moose::Manual::Attributes - Object attributes with Moose
8d38e631 6
7=head1 INTRODUCTION
8
0c38f882 9Moose attributes have many properties, and attributes are probably the
10single most powerful and flexible part of Moose. You can create a
11powerful class simply by declaring attributes. In fact, it's possible
12to have classes that consist solely of attribute declarations.
8d38e631 13
0c38f882 14An attribute is a property that every member of a class has. For
c5934de1 15example, we might say that "every C<Person> object has a first name and
16last name". Attributes can be optional, so that we can say "some C<Person>
8d38e631 17objects have a social security number (and some don't)".
18
d4b96efa 19At its simplest, an attribute can be thought of as a named value (as
20in a hash) that can be read and set. However, attributes can also have
21defaults, type constraints, delegation and much more.
8d38e631 22
0c38f882 23In other languages, attributes are also referred to as slots or
24properties.
25
0b9488c8 26=head1 ATTRIBUTE OPTIONS
8d38e631 27
28Use the C<has> function to declare an attribute:
29
30 package Person;
31
32 use Moose;
33
34 has 'first_name' => ( is => 'rw' );
35
c5934de1 36This says that all C<Person> objects have an optional read-write
d4b96efa 37"first_name" attribute.
8d38e631 38
d67ce58f 39=head2 Read-write Vs read-only
8d38e631 40
0c38f882 41The options passed to C<has> define the properties of the
42attribute. There are a many options, but in the simplest form you just
43need to set C<is>, which can be either C<rw> (read-write) or C<ro>
44(read-only).
8d38e631 45
0c38f882 46(In fact, you could even omit C<is>, but that gives you an attribute
47that has no accessors, which is pointless unless you're doing some
48deep, dark magic).
8d38e631 49
d67ce58f 50=head2 Accessor methods
8d38e631 51
52Each attribute has one or more accessor methods. An accessor lets you
d4b96efa 53read and write the value of that attribute for an object.
8d38e631 54
55By default, the accessor method has the same name as the attribute. If
56you declared your attribute as C<ro> then your accessor will be
57read-only. If you declared it read-write, you get a read-write
58accessor. Simple.
59
c5934de1 60Given our C<Person> example above, we now have a single C<first_name>
61accessor that can read or write a C<Person> object's C<first_name>
62attribute's value.
8d38e631 63
64If you want, you can also explicitly specify the method names to be
0b9488c8 65used for reading and writing an attribute's value. This is
636f25f3 66particularly handy when you'd like an attribute to be publicly
8d38e631 67readable, but only privately settable. For example:
68
d983b81e 69 has 'weight' => (
70 is => 'rw',
71 writer => '_set_weight',
72 );
8d38e631 73
74This might be useful if weight is calculated based on other methods,
75for example every time the C<eat> method is called, we might adjust
76weight. This lets us hide the implementation details of weight
77changes, but still provide the weight value to users of the class.
78
0b9488c8 79Some people might prefer to have distinct methods for reading and
d4b96efa 80writing. In I<Perl Best Practices>, Damian Conway recommends that
81reader methods start with "get_" and writer methods start with "set_".
8d38e631 82
83We can do exactly that by providing names for both the C<reader> and
84C<writer> methods:
85
d983b81e 86 has 'weight' => (
87 is => 'rw',
88 reader => 'get_weight',
89 writer => 'set_weight',
90 );
8d38e631 91
92If you're thinking that doing this over and over would be insanely
93tedious, you're right! Fortunately, Moose provides a powerful
0c38f882 94extension system that lets override the default naming
95conventions. See L<Moose::Manual::MooseX> for more details.
8d38e631 96
d67ce58f 97=head2 Predicate and clearer methods
8d38e631 98
d4b96efa 99Moose allows you to explicitly distinguish between a false or
0c38f882 100undefined attribute value and an attribute which has not been set. If
101you want to access this information, you must define clearer and
d4b96efa 102predicate methods for an attribute.
8d38e631 103
d4b96efa 104A predicate method tells you whether or not a given attribute is
c5934de1 105currently set. Note an attribute can be explicitly set to C<undef> or
0c38f882 106some other false value, but the predicate will return true.
8d38e631 107
108The clearer method unsets the attribute. This is I<not> the
109same as setting the value to C<undef>, but you can only distinguish
110between them if you define a predicate method!
111
112Here's some code to illustrate the relationship between an accessor,
113predicate, and clearer method.
114
115 package Person;
116
117 use Moose;
118
d983b81e 119 has 'ssn' => (
120 is => 'rw',
121 clearer => 'clear_ssn',
122 predicate => 'has_ssn',
123 );
8d38e631 124
125 ...
126
127 my $person = Person->new();
128 $person->has_ssn; # false
129
130 $person->ssn(undef);
131 $person->ssn; # returns undef
132 $person->has_ssn; # true
133
134 $person->clear_ssn;
135 $person->ssn; # returns undef
136 $person->has_ssn; # false
137
138 $person->ssn('123-45-6789');
139 $person->ssn; # returns '123-45-6789'
140 $person->has_ssn; # true
141
142 my $person2 = Person->new( ssn => '111-22-3333');
143 $person2->has_ssn; # true
144
d4b96efa 145By default, Moose does not make a predicate or clearer for you. You
0c38f882 146must explicitly provide names for them.
8d38e631 147
d67ce58f 148=head2 Required or not?
8d38e631 149
d4b96efa 150By default, all attributes are optional, and do not need to be
151provided at object construction time. If you want to make an attribute
152required, simply set the C<required> option to true:
8d38e631 153
d983b81e 154 has 'name' => (
155 is => 'rw',
156 required => 1,
157 );
8d38e631 158
159There are a couple caveats worth mentioning in regards to what
c5934de1 160"required" actually means.
8d38e631 161
c5934de1 162Basically, all it says is that this attribute (C<name>) must be provided
d4b96efa 163to the constructor. It does not say anything about its value, so it
164could be C<undef>.
8d38e631 165
166If you define a clearer method on a required attribute, the clearer
d4b96efa 167I<will> work, so even a required attribute can be unset after object
168construction.
8d38e631 169
d4b96efa 170This means that if you do make an attribute required, providing a
171clearer doesn't make much sense. In some cases, it might be handy to
172have a I<private> C<clearer> and C<predicate> for a required
173attribute.
8d38e631 174
d67ce58f 175=head2 Default and builder methods
8d38e631 176
d4b96efa 177Attributes can have default values, and Moose provides two ways to
178specify that default.
8d38e631 179
180In the simplest form, you simply provide a non-reference scalar value
0b9488c8 181for the C<default> option:
8d38e631 182
d983b81e 183 has 'size' => (
184 is => 'rw',
185 default => 'medium',
186 predicate => 'has_size',
187 );
8d38e631 188
189If the size attribute is not provided to the constructor, then it ends
c5934de1 190up being set to C<medium>:
8d38e631 191
192 my $person = Person->new();
193 $person->size; # medium
194 $person->has_size; # true
195
0b9488c8 196You can also provide a subroutine reference for C<default>. This
0c38f882 197reference will be called as a method on the object.
8d38e631 198
d983b81e 199 has 'size' => (
200 is => 'rw',
201 default =>
202 sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] },
203 predicate => 'has_size',
204 );
8d38e631 205
206This is dumb example, but it illustrates the point that the subroutine
207will be called for every new object created.
208
9e8cb6f7 209When you provide a C<default> subroutine reference, it is called as a
210method on the object, with no additional parameters:
211
212 has 'size' => (
213 is => 'rw',
214 default => sub {
215 my $self = shift;
216
217 return $self->height > 200 ? 'big' : 'average';
218 },
219 );
220
221When the C<default> is called during object construction, it may be
222called before other attributes have been set. If your default is
223dependent on other parts of the object's state, you can make the
224attribute C<lazy>. Laziness is covered in the next section.
8d38e631 225
226If you want to use a reference of any sort as the default value, you
227must return it from a subroutine. This is necessary because otherwise
228Perl would instantiate the reference exactly once, and it would be
229shared by all objects:
230
d983b81e 231 has 'mapping' => (
232 is => 'rw',
233 default => {}, # wrong!
234 );
8d38e631 235
d4b96efa 236Moose will throw an error if you pass a bare non-subroutine reference
237as the default.
238
8d38e631 239If Moose allowed this then the default mapping attribute could easily
240end up shared across many objects. Instead, wrap it in a subroutine
241reference:
242
d983b81e 243 has 'mapping' => (
244 is => 'rw',
245 default => sub { {} }, # right!
246 );
8d38e631 247
248This is a bit awkward, but it's just the way Perl works.
249
250As an alternative to using a subroutine reference, you can instead
0b9488c8 251supply a C<builder> method for your attribute:
8d38e631 252
d983b81e 253 has 'size' => (
254 is => 'rw',
255 builder => '_build_size',
256 predicate => 'has_size',
257 );
8d38e631 258
259 sub _build_size {
d983b81e 260 return ( 'small', 'medium', 'large' )[ int( rand 3 ) ];
8d38e631 261 }
262
263This has several advantages. First, it moves a chunk of code to its
264own named method, which improves readability and code
ba5d9201 265organization.
8d38e631 266
0b9488c8 267We strongly recommend that you use a C<builder> instead of a
268C<default> for anything beyond the most trivial default.
8d38e631 269
9e8cb6f7 270A C<builder>, just like a C<default>, is called as a method on the
271object with no additional parameters.
272
ba5d9201 273=head3 Builders allow subclassing
274
275Because the C<builder> is called I<by name>, it goes through Perl's
276method resolution. This means that builder methods are both
277inheritable and overridable.
278
279If we subclass our C<Person> class, we can override C<_build_size>:
280
281 package Lilliputian;
282
283 use Moose;
284 extends 'Person';
285
286 sub _build_size { return 'small' }
287
288=head3 Builders can be composed from roles
289
290Because builders are called by name, they work well with roles. For
291example, a role could provide an attribute but require that the
292consuming class provide the C<builder>:
293
294 package HasSize;
295 use Moose::Role;
296
297 requires '_build_size';
298
299 has 'size' => (
300 is => 'ro',
301 lazy => 1,
302 builder => '_build_animal',
303 );
304
305 package Lilliputian;
306 use Moose;
307
308 with 'HasSize';
309
310 sub _build_size { return 'small' }
311
312Roles are covered in L<Moose::Manual::Roles>.
313
d67ce58f 314=head2 Laziness and C<lazy_build>
8d38e631 315
0b9488c8 316Moose lets you defer attribute population by making an attribute
317C<lazy>:
8d38e631 318
d983b81e 319 has 'size' => (
320 is => 'rw',
321 lazy => 1,
322 builder => '_build_size',
323 );
8d38e631 324
0c38f882 325When C<lazy> is true, the default is not generated until the reader
d4b96efa 326method is called, rather than at object construction time. There are
327several reasons you might choose to do this.
8d38e631 328
329First, if the default value for this attribute depends on some other
0b9488c8 330attributes, then the attribute I<must> be C<lazy>. During object
d4b96efa 331construction, defaults are not generated in a predictable order, so
0c38f882 332you cannot count on some other attribute being populated when
333generating a default.
8d38e631 334
d4b96efa 335Second, there's often no reason to calculate a default before it's
336needed. Making an attribute C<lazy> lets you defer the cost until the
337attribute is needed. If the attribute is I<never> needed, you save
338some CPU time.
8d38e631 339
340We recommend that you make any attribute with a builder or non-trivial
0b9488c8 341default C<lazy> as a matter of course.
8d38e631 342
343To facilitate this, you can simply specify the C<lazy_build> attribute
344option. This bundles up a number of options together:
345
d983b81e 346 has 'size' => (
347 is => 'rw',
348 lazy_build => 1,
349 );
8d38e631 350
351This is the same as specifying all of these options:
352
d983b81e 353 has 'size' => (
354 is => 'rw',
355 lazy => 1,
356 builder => '_build_size',
357 clearer => 'clear_size',
358 predicate => 'has_size',
359 );
8d38e631 360
0c39debe 361If your attribute name starts with an underscore (C<_>), then the clearer
8d38e631 362and predicate will as well:
363
d983b81e 364 has '_size' => (
365 is => 'rw',
366 lazy_build => 1,
367 );
8d38e631 368
0b9488c8 369becomes:
8d38e631 370
d983b81e 371 has '_size' => (
372 is => 'rw',
373 lazy => 1,
374 builder => '_build__size',
375 clearer => '_clear_size',
376 predicate => '_has_size',
377 );
8d38e631 378
0b9488c8 379Note the doubled underscore in the builder name. Internally, Moose
380simply prepends the attribute name with "_build_" to come up with the
381builder name.
8d38e631 382
0b9488c8 383If you don't like the names that C<lazy_build> generates, you can
384always provide your own:
385
d983b81e 386 has 'size' => (
387 is => 'rw',
388 lazy_build => 1,
389 clearer => '_clear_size',
390 );
0b9488c8 391
392Options that you explicitly provide are always used in favor of
393Moose's internal defaults.
394
d67ce58f 395=head2 Constructor parameters (C<init_arg>)
d4b96efa 396
397By default, each attribute can be passed by name to the class's
636f25f3 398constructor. On occasion, you may want to use a different name for
d4b96efa 399the constructor parameter. You may also want to make an attribute
0c38f882 400unsettable via the constructor.
d4b96efa 401
0c38f882 402Both of these goals can be accomplished with the C<init_arg> option:
d4b96efa 403
d983b81e 404 has 'bigness' => (
405 is => 'rw',
406 init_arg => 'size',
407 );
d4b96efa 408
0c39debe 409Now we have an attribute named "bigness", but we pass C<size> to the
0c38f882 410constructor.
d4b96efa 411
0c38f882 412Even more useful is the ability to disable setting an attribute via
413the constructor. This is particularly handy for private attributes:
d4b96efa 414
d983b81e 415 has '_genetic_code' => (
0c38f882 416 is => 'rw',
417 lazy_build => 1,
418 init_arg => undef,
d983b81e 419 );
d4b96efa 420
421By setting the C<init_arg> to C<undef>, we make it impossible to set
422this attribute when creating a new object.
423
d67ce58f 424=head2 Weak references
0b9488c8 425
426Moose has built-in support for weak references. If you set the
d4b96efa 427C<weak_ref> option to a true value, then it will call
0b9488c8 428C<Scalar::Util::weaken> whenever the attribute is set:
429
d983b81e 430 has 'parent' => (
431 is => 'rw',
432 weak_ref => 1,
433 );
0b9488c8 434
435 $node->parent($parent_node);
436
437This is very useful when you're building objects that may contain
438circular references.
439
440=head2 Triggers
441
d4b96efa 442A C<trigger> is a subroutine that is called whenever the attribute is
443set:
0b9488c8 444
d983b81e 445 has 'size' => (
446 is => 'rw',
447 trigger => \&_size_set,
448 );
0b9488c8 449
450 sub _size_set {
451 my ( $self, $size, $meta_attr ) = @_;
452
d4b96efa 453 warn $self->name, " size is now $size\n";
0b9488c8 454 }
455
456The trigger is called as a method, and receives the new value as well
d4b96efa 457as the L<Moose::Meta::Attribute> object for the attribute. The trigger
458is called I<after> the value is set.
0b9488c8 459
9c9484bf 460This differs from an after method modifier in two ways. First, a
461trigger is only called when the attribute is set, as opposed to
462whenever the accessor is called. Second, it is also called if the
463attribute is set via a lazy default or builder.
464
d67ce58f 465=head2 Attribute types
0b9488c8 466
d4b96efa 467Attributes can be restricted to only accept certain types:
0b9488c8 468
d983b81e 469 has 'first_name' => (
470 is => 'rw',
471 isa => 'Str',
472 );
0b9488c8 473
0c39debe 474This says that the C<first_name> attribute must be a string.
0b9488c8 475
476Moose also provides a shortcut for specifying that an attribute only
477accepts objects that do a certain role:
478
d983b81e 479 has 'weapon' => (
480 is => 'rw',
481 does => 'MyApp::Weapon',
482 );
0b9488c8 483
484See the L<Moose::Manual::Types> documentation for a complete
485discussion of Moose's type system.
486
487=head2 Delegation
488
0c39debe 489Attributes can define methods which simply delegate to their values:
0b9488c8 490
d983b81e 491 has 'hair_color' => (
492 is => 'rw',
493 isa => 'Graphics::Color::RGB',
494 handles => { hair_color_hex => 'as_hex_string' },
495 );
0b9488c8 496
d4b96efa 497This adds a new method, C<hair_color_hex>. When someone calls
498C<hair_color_hex>, internally, the object just calls C<<
499$self->hair_color->as_hex_string >>.
0b9488c8 500
0c38f882 501See L<Moose::Manual::Delegation> for documentation on how to set up
0b9488c8 502delegation methods.
503
504=head2 Metaclass and traits
505
506One of Moose's best features is that it can be extended in all sorts
d4b96efa 507of ways through the use of custom metaclasses and metaclass traits.
0b9488c8 508
509When declaring an attribute, you can declare a metaclass or a set of
510traits for the attribute:
511
512 use MooseX::AttributeHelpers;
513
d983b81e 514 has 'mapping' => (
515 metaclass => 'Collection::Hash',
516 is => 'ro',
517 default => sub { {} },
518 );
0b9488c8 519
520In this case, the metaclass C<Collection::Hash> really refers to
0c39debe 521L<MooseX::AttributeHelpers::Collection::Hash>.
0b9488c8 522
523You can also apply one or more traits to an attribute:
524
0b9488c8 525 use MooseX::MetaDescription;
526
d983b81e 527 has 'size' => (
528 is => 'rw',
529 traits => ['MooseX::MetaDescription::Meta::Trait'],
530 description => {
531 html_widget => 'text_input',
532 serialize_as => 'element',
533 },
534 );
0b9488c8 535
536The advantage of traits is that you can mix more than one of them
537together easily (in fact, a trait is just a role under the hood).
538
539There are a number of MooseX modules on CPAN which provide useful
540attribute metaclasses and traits. See L<Moose::Manual::MooseX> for
541some examples. You can also write your own metaclasses and traits. See
542the "Meta" and "Extending" recipes in L<Moose::Cookbook> for examples.
543
7261aa9d 544=head1 ATTRIBUTE INHERITANCE
0b9488c8 545
546By default, a child inherits all of its parent class(es)' attributes
d4b96efa 547as-is. However, you can explicitly change some aspects of the
548inherited attribute in the child class.
0b9488c8 549
550The options that can be overridden in a subclass are:
551
552=over 4
553
554=item * default
555
556=item * coerce
557
558=item * required
559
560=item * documentation
561
562=item * lazy
563
564=item * isa
565
566=item * handles
567
568=item * builder
569
570=item * metaclass
571
572=item * traits
573
574=back
575
576To override an attribute, you simply prepend its name with a plus sign
0c39debe 577(C<+>):
0b9488c8 578
579 package LazyPerson;
580
581 use Moose;
582
583 extends 'Person';
584
d983b81e 585 has '+first_name' => (
586 lazy => 1,
587 default => 'Bill',
588 );
0b9488c8 589
590Now the C<first_name> attribute in C<LazyPerson> is lazy, and defaults
591to C<'Bill'>.
592
593We recommend that you exercise caution when changing the type (C<isa>)
0c38f882 594of an inherited attribute.
0b9488c8 595
7261aa9d 596=head1 MORE ON ATTRIBUTES
597
598Moose attributes are a big topic, and this document glosses over a few
599aspects of their aspects. We recommend that you read the
600L<Moose::Manual::Delegation> and L<Moose::Manual::Types> documents to
601get a more complete understanding of attribute features.
602
603=head1 A FEW MORE OPTIONS
604
605Moose has lots of attribute options. The ones listed below are
636f25f3 606superseded by some more modern features, but are covered for the sake
7261aa9d 607of completeness.
608
0b9488c8 609=head2 The C<documentation> option
610
611You can provide a piece of documentation as a string for an attribute:
612
d983b81e 613 has 'first_name' => (
614 is => 'rw',
615 documentation => q{The person's first (personal) name},
616 );
0b9488c8 617
618Moose does absolutely nothing with this information other than store
619it.
620
d67ce58f 621=head2 The C<auto_deref> option
0b9488c8 622
623If your attribute is an array reference or hash reference, the
636f25f3 624C<auto_deref> option will make Moose dereference the value when it is
0b9488c8 625returned from the reader method:
626
627 my %map = $object->mapping;
628
629This option only works if your attribute is explicitly typed as an
0c39debe 630C<ArrayRef> or C<HashRef>.
0b9488c8 631
0c39debe 632However, we recommend that you use L<MooseX::AttributeHelpers> for
0b9488c8 633these types of attributes, which gives you much more control over how
634they are accessed and manipulated.
635
636=head2 Initializer
637
638Moose provides an attribute option called C<initializer>. This is
639similar to C<builder>, except that it is I<only> called during object
640construction.
641
0c39debe 642This option is inherited from L<Class::MOP>, but we recommend that you
0b9488c8 643use a C<builder> (which is Moose-only) instead.
644
d4b96efa 645=head1 AUTHOR
646
647Dave Rolsky E<lt>autarch@urth.orgE<gt>
648
649=head1 COPYRIGHT AND LICENSE
650
2840a3b2 651Copyright 2009 by Infinity Interactive, Inc.
d4b96efa 652
653L<http://www.iinteractive.com>
654
655This library is free software; you can redistribute it and/or modify
656it under the same terms as Perl itself.
657
658=cut