1Moose::Manual::AttributUesse(r3)Contributed Perl DocumenMtoaotsieo:n:Manual::Attributes(3)
2
3
4

NAME

6       Moose::Manual::Attributes - Object attributes with Moose
7

VERSION

9       version 2.2203
10

INTRODUCTION

12       Moose attributes have many properties, and attributes are probably the
13       single most powerful and flexible part of Moose. You can create a
14       powerful class simply by declaring attributes. In fact, it's possible
15       to have classes that consist solely of attribute declarations.
16
17       An attribute is a property that every member of a class has. For
18       example, we might say that "every "Person" object has a first name and
19       last name". Attributes can be optional, so that we can say "some
20       "Person" objects have a social security number (and some don't)".
21
22       At its simplest, an attribute can be thought of as a named value (as in
23       a hash) that can be read and set. However, attributes can also have
24       defaults, type constraints, delegation and much more.
25
26       In other languages, attributes are also referred to as slots or
27       properties.
28

ATTRIBUTE OPTIONS

30       Use the "has" function to declare an attribute:
31
32         package Person;
33
34         use Moose;
35
36         has 'first_name' => ( is => 'rw' );
37
38       This says that all "Person" objects have an optional read-write
39       "first_name" attribute.
40
41   Read-write vs. read-only
42       The options passed to "has" define the properties of the attribute.
43       There are many options, but in the simplest form you just need to set
44       "is", which can be either "ro" (read-only) or "rw" (read-write). When
45       an attribute is "rw", you can change it by passing a value to its
46       accessor. When an attribute is "ro", you may only read the current
47       value of the attribute through its accessor. You can, however, set the
48       attribute when creating the object by passing it to the constructor.
49
50       In fact, you could even omit "is", but that gives you an attribute that
51       has no accessor. This can be useful with other attribute options, such
52       as "handles". However, if your attribute generates no accessors, Moose
53       will issue a warning, because that usually means the programmer forgot
54       to say the attribute is read-only or read-write. If you really mean to
55       have no accessors, you can silence this warning by setting "is" to
56       "bare".
57
58   Accessor methods
59       Each attribute has one or more accessor methods. An accessor lets you
60       read and write the value of that attribute for an object.
61
62       By default, the accessor method has the same name as the attribute. If
63       you declared your attribute as "ro" then your accessor will be read-
64       only. If you declared it as "rw", you get a read-write accessor.
65       Simple.
66
67       Given our "Person" example above, we now have a single "first_name"
68       accessor that can read or write a "Person" object's "first_name"
69       attribute's value.
70
71       If you want, you can also explicitly specify the method names to be
72       used for reading and writing an attribute's value. This is particularly
73       handy when you'd like an attribute to be publicly readable, but only
74       privately settable. For example:
75
76         has 'weight' => (
77             is     => 'ro',
78             writer => '_set_weight',
79         );
80
81       This might be useful if weight is calculated based on other methods.
82       For example, every time the "eat" method is called, we might adjust
83       weight. This lets us hide the implementation details of weight changes,
84       but still provide the weight value to users of the class.
85
86       Some people might prefer to have distinct methods for reading and
87       writing. In Perl Best Practices, Damian Conway recommends that reader
88       methods start with "get_" and writer methods start with "set_".
89
90       We can do exactly that by providing names for both the "reader" and
91       "writer" methods:
92
93         has 'weight' => (
94             is     => 'rw',
95             reader => 'get_weight',
96             writer => 'set_weight',
97         );
98
99       If you're thinking that doing this over and over would be insanely
100       tedious, you're right! Fortunately, Moose provides a powerful extension
101       system that lets you override the default naming conventions. See
102       Moose::Manual::MooseX for more details.
103
104   Predicate and clearer methods
105       Moose allows you to explicitly distinguish between a false or undefined
106       attribute value and an attribute which has not been set. If you want to
107       access this information, you must define clearer and predicate methods
108       for an attribute.
109
110       A predicate method tells you whether or not a given attribute is
111       currently set. Note that an attribute can be explicitly set to "undef"
112       or some other false value, but the predicate will return true.
113
114       The clearer method unsets the attribute. This is not the same as
115       setting the value to "undef", but you can only distinguish between them
116       if you define a predicate method!
117
118       Here's some code to illustrate the relationship between an accessor,
119       predicate, and clearer method.
120
121         package Person;
122
123         use Moose;
124
125         has 'ssn' => (
126             is        => 'rw',
127             clearer   => 'clear_ssn',
128             predicate => 'has_ssn',
129         );
130
131         ...
132
133         my $person = Person->new();
134         $person->has_ssn; # false
135
136         $person->ssn(undef);
137         $person->ssn; # returns undef
138         $person->has_ssn; # true
139
140         $person->clear_ssn;
141         $person->ssn; # returns undef
142         $person->has_ssn; # false
143
144         $person->ssn('123-45-6789');
145         $person->ssn; # returns '123-45-6789'
146         $person->has_ssn; # true
147
148         my $person2 = Person->new( ssn => '111-22-3333');
149         $person2->has_ssn; # true
150
151       By default, Moose does not make a predicate or clearer for you. You
152       must explicitly provide names for them, and then Moose will create the
153       methods for you.
154
155   Required or not?
156       By default, all attributes are optional, and do not need to be provided
157       at object construction time. If you want to make an attribute required,
158       simply set the "required" option to true:
159
160         has 'name' => (
161             is       => 'ro',
162             required => 1,
163         );
164
165       There are a couple caveats worth mentioning in regards to what
166       "required" actually means.
167
168       Basically, all it says is that this attribute ("name") must be provided
169       to the constructor or it must have either a default or a builder. It
170       does not say anything about its value, so it could be "undef".
171
172       If you define a clearer method on a required attribute, the clearer
173       will work, so even a required attribute can be unset after object
174       construction.
175
176       This means that if you do make an attribute required, providing a
177       clearer doesn't make much sense. In some cases, it might be handy to
178       have a private "clearer" and "predicate" for a required attribute.
179
180   Default and builder methods
181       Attributes can have default values, and Moose provides two ways to
182       specify that default.
183
184       In the simplest form, you simply provide a non-reference scalar value
185       for the "default" option:
186
187         has 'size' => (
188             is        => 'ro',
189             default   => 'medium',
190             predicate => 'has_size',
191         );
192
193       If the size attribute is not provided to the constructor, then it ends
194       up being set to "medium":
195
196         my $person = Person->new();
197         $person->size; # medium
198         $person->has_size; # true
199
200       You can also provide a subroutine reference for "default". This
201       reference will be called as a method on the object.
202
203         has 'size' => (
204             is => 'ro',
205             default =>
206                 sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] },
207             predicate => 'has_size',
208         );
209
210       This is a trivial example, but it illustrates the point that the
211       subroutine will be called for every new object created.
212
213       When you provide a "default" subroutine reference, it is called as a
214       method on the object, with no additional parameters:
215
216         has 'size' => (
217             is      => 'ro',
218             default => sub {
219                 my $self = shift;
220
221                 return $self->height > 200 ? 'large' : 'average';
222             },
223         );
224
225       When the "default" is called during object construction, it may be
226       called before other attributes have been set. If your default is
227       dependent on other parts of the object's state, you can make the
228       attribute "lazy". Laziness is covered in the next section.
229
230       If you want to use a reference of any sort as the default value, you
231       must return it from a subroutine.
232
233         has 'mapping' => (
234             is      => 'ro',
235             default => sub { {} },
236         );
237
238       This is necessary because otherwise Perl would instantiate the
239       reference exactly once, and it would be shared by all objects:
240
241         has 'mapping' => (
242             is      => 'ro',
243             default => {}, # wrong!
244         );
245
246       Moose will throw an error if you pass a bare non-subroutine reference
247       as the default.
248
249       If Moose allowed this then the default mapping attribute could easily
250       end up shared across many objects. Instead, wrap it in a subroutine
251       reference as we saw above.
252
253       This is a bit awkward, but it's just the way Perl works.
254
255       As an alternative to using a subroutine reference, you can supply a
256       "builder" method for your attribute:
257
258         has 'size' => (
259             is        => 'ro',
260             builder   => '_build_size',
261             predicate => 'has_size',
262         );
263
264         sub _build_size {
265             return ( 'small', 'medium', 'large' )[ int( rand 3 ) ];
266         }
267
268       This has several advantages. First, it moves a chunk of code to its own
269       named method, which improves readability and code organization. Second,
270       because this is a named method, it can be subclassed or provided by a
271       role.
272
273       We strongly recommend that you use a "builder" instead of a "default"
274       for anything beyond the most trivial default.
275
276       A "builder", just like a "default", is called as a method on the object
277       with no additional parameters.
278
279       Builders allow subclassing
280
281       Because the "builder" is called by name, it goes through Perl's method
282       resolution. This means that builder methods are both inheritable and
283       overridable.
284
285       If we subclass our "Person" class, we can override "_build_size":
286
287         package Lilliputian;
288
289         use Moose;
290         extends 'Person';
291
292         sub _build_size { return 'small' }
293
294       Builders work well with roles
295
296       Because builders are called by name, they work well with roles. For
297       example, a role could provide an attribute but require that the
298       consuming class provide the "builder":
299
300         package HasSize;
301         use Moose::Role;
302
303         requires '_build_size';
304
305         has 'size' => (
306             is      => 'ro',
307             lazy    => 1,
308             builder => '_build_size',
309         );
310
311         package Lilliputian;
312         use Moose;
313
314         with 'HasSize';
315
316         sub _build_size { return 'small' }
317
318       Roles are covered in Moose::Manual::Roles.
319
320   Laziness
321       Moose lets you defer attribute population by making an attribute
322       "lazy":
323
324         has 'size' => (
325             is      => 'ro',
326             lazy    => 1,
327             builder => '_build_size',
328         );
329
330       When "lazy" is true, the default is not generated until the reader
331       method is called, rather than at object construction time. There are
332       several reasons you might choose to do this.
333
334       First, if the default value for this attribute depends on some other
335       attributes, then the attribute must be "lazy". During object
336       construction, defaults are not generated in a predictable order, so you
337       cannot count on some other attribute being populated when generating a
338       default.
339
340       Second, there's often no reason to calculate a default before it's
341       needed. Making an attribute "lazy" lets you defer the cost until the
342       attribute is needed. If the attribute is never needed, you save some
343       CPU time.
344
345       We recommend that you make any attribute with a builder or non-trivial
346       default "lazy" as a matter of course.
347
348       Lazy defaults and $_
349
350       Please note that a lazy default or builder can be called anywhere, even
351       inside a "map" or "grep". This means that if your default sub or
352       builder changes $_, something weird could happen. You can prevent this
353       by adding local $_ inside your default or builder.
354
355   Constructor parameters ("init_arg")
356       By default, each attribute can be passed by name to the class's
357       constructor. On occasion, you may want to use a different name for the
358       constructor parameter. You may also want to make an attribute
359       unsettable via the constructor.
360
361       You can do either of these things with the "init_arg" option:
362
363         has 'bigness' => (
364             is       => 'ro',
365             init_arg => 'size',
366         );
367
368       Now we have an attribute named "bigness", but we pass "size" to the
369       constructor.
370
371       Even more useful is the ability to disable setting an attribute via the
372       constructor. This is particularly handy for private attributes:
373
374         has '_genetic_code' => (
375             is       => 'ro',
376             lazy     => 1,
377             builder  => '_build_genetic_code',
378             init_arg => undef,
379         );
380
381       By setting the "init_arg" to "undef", we make it impossible to set this
382       attribute when creating a new object.
383
384   Weak references
385       Moose has built-in support for weak references. If you set the
386       "weak_ref" option to a true value, then it will call
387       "Scalar::Util::weaken" whenever the attribute is set:
388
389         has 'parent' => (
390             is       => 'rw',
391             weak_ref => 1,
392         );
393
394         $node->parent($parent_node);
395
396       This is very useful when you're building objects that may contain
397       circular references.
398
399       When the object in a weak reference goes out of scope, the attribute's
400       value will become "undef" "behind the scenes". This is done by the Perl
401       interpreter directly, so Moose does not see this change. This means
402       that triggers don't fire, coercions aren't applied, etc.
403
404       The attribute is not cleared, so a predicate method for that attribute
405       will still return true. Similarly, when the attribute is next accessed,
406       a default value will not be generated.
407
408   Triggers
409       A "trigger" is a subroutine that is called whenever the attribute is
410       set:
411
412         has 'size' => (
413             is      => 'rw',
414             trigger => \&_size_set,
415         );
416
417         sub _size_set {
418             my ( $self, $size, $old_size ) = @_;
419
420             my $msg = $self->name;
421
422             if ( @_ > 2 ) {
423                 $msg .= " - old size was $old_size";
424             }
425
426             $msg .= " - size is now $size";
427             warn $msg;
428         }
429
430       The trigger is called after an attribute's value is set. It is called
431       as a method on the object, and receives the new and old values as its
432       arguments. If the attribute had not previously been set at all, then
433       only the new value is passed. This lets you distinguish between the
434       case where the attribute had no value versus when the old value was
435       "undef".
436
437       This differs from an "after" method modifier in two ways. First, a
438       trigger is only called when the attribute is set, as opposed to
439       whenever the accessor method is called (for reading or writing).
440       Second, it is also called when an attribute's value is passed to the
441       constructor.
442
443       However, triggers are not called when an attribute is populated from a
444       "default" or "builder".
445
446   Attribute types
447       Attributes can be restricted to only accept certain types:
448
449         has 'first_name' => (
450             is  => 'ro',
451             isa => 'Str',
452         );
453
454       This says that the "first_name" attribute must be a string.
455
456       Moose also provides a shortcut for specifying that an attribute only
457       accepts objects that do a certain role:
458
459         has 'weapon' => (
460             is   => 'rw',
461             does => 'MyApp::Weapon',
462         );
463
464       See the Moose::Manual::Types documentation for a complete discussion of
465       Moose's type system.
466
467   Delegation
468       An attribute can define methods which simply delegate to its value:
469
470         has 'hair_color' => (
471             is      => 'ro',
472             isa     => 'Graphics::Color::RGB',
473             handles => { hair_color_hex => 'as_hex_string' },
474         );
475
476       This adds a new method, "hair_color_hex". When someone calls
477       "hair_color_hex", internally, the object just calls
478       "$self->hair_color->as_hex_string".
479
480       See Moose::Manual::Delegation for documentation on how to set up
481       delegation methods.
482
483   Attribute traits and metaclasses
484       One of Moose's best features is that it can be extended in all sorts of
485       ways through the use of metaclass traits and custom metaclasses.
486
487       You can apply one or more traits to an attribute:
488
489         use MooseX::MetaDescription;
490
491         has 'size' => (
492             is          => 'ro',
493             traits      => ['MooseX::MetaDescription::Meta::Trait'],
494             description => {
495                 html_widget  => 'text_input',
496                 serialize_as => 'element',
497             },
498         );
499
500       The advantage of traits is that you can mix more than one of them
501       together easily (in fact, a trait is just a role under the hood).
502
503       There are a number of MooseX modules on CPAN which provide useful
504       attribute metaclasses and traits. See Moose::Manual::MooseX for some
505       examples. You can also write your own metaclasses and traits. See the
506       "Meta" and "Extending" recipes in Moose::Cookbook for examples.
507
508   Native Delegations
509       Native delegations allow you to delegate to standard Perl data
510       structures as if they were objects.
511
512       For example, we can pretend that an array reference has methods like
513       push(), shift(), map(), count(), and more.
514
515         has 'options' => (
516             traits  => ['Array'],
517             is      => 'ro',
518             isa     => 'ArrayRef[Str]',
519             default => sub { [] },
520             handles => {
521                 all_options    => 'elements',
522                 add_option     => 'push',
523                 map_options    => 'map',
524                 option_count   => 'count',
525                 sorted_options => 'sort',
526             },
527         );
528
529       See Moose::Manual::Delegation for more details.
530

ATTRIBUTE INHERITANCE

532       By default, a child inherits all of its parent class(es)' attributes
533       as-is. However, you can change most aspects of the inherited attribute
534       in the child class. You cannot change any of its associated method
535       names (reader, writer, predicate, etc).
536
537       To change some aspects of an attribute, you simply prepend a plus sign
538       ("+") to its name:
539
540         package LazyPerson;
541
542         use Moose;
543
544         extends 'Person';
545
546         has '+first_name' => (
547             lazy    => 1,
548             default => 'Bill',
549         );
550
551       Now the "first_name" attribute in "LazyPerson" is lazy, and defaults to
552       'Bill'.
553
554       We recommend that you exercise caution when changing the type ("isa")
555       of an inherited attribute.
556
557   Attribute Inheritance and Method Modifiers
558       When an inherited attribute is defined, that creates an entirely new
559       set of accessors for the attribute (reader, writer, predicate, etc.).
560       This is necessary because these may be what was changed when inheriting
561       the attribute.
562
563       As a consequence, any method modifiers defined on the attribute's
564       accessors in an ancestor class will effectively be ignored, because the
565       new accessors live in the child class and do not see the modifiers from
566       the parent class.
567

MULTIPLE ATTRIBUTE SHORTCUTS

569       If you have a number of attributes that differ only by name, you can
570       declare them all at once:
571
572         package Point;
573
574         use Moose;
575
576         has [ 'x', 'y' ] => ( is => 'ro', isa => 'Int' );
577
578       Also, because "has" is just a function call, you can call it in a loop:
579
580         for my $name ( qw( x y ) ) {
581             my $builder = '_build_' . $name;
582             has $name => ( is => 'ro', isa => 'Int', builder => $builder );
583         }
584

MORE ON ATTRIBUTES

586       Moose attributes are a big topic, and this document glosses over a few
587       aspects. We recommend that you read the Moose::Manual::Delegation and
588       Moose::Manual::Types documents to get a more complete understanding of
589       attribute features.
590

A FEW MORE OPTIONS

592       Moose has lots of attribute options. The ones listed below are
593       superseded by some more modern features, but are covered for the sake
594       of completeness.
595
596   The "documentation" option
597       You can provide a piece of documentation as a string for an attribute:
598
599         has 'first_name' => (
600             is            => 'rw',
601             documentation => q{The person's first (personal) name},
602         );
603
604       Moose does absolutely nothing with this information other than store
605       it.
606
607   The "auto_deref" option
608       If your attribute is an array reference or hash reference, the
609       "auto_deref" option will make Moose dereference the value when it is
610       returned from the reader method in list context:
611
612         my %map = $object->mapping;
613
614       This option only works if your attribute is explicitly typed as an
615       "ArrayRef" or "HashRef".  When the reader is called in scalar context,
616       the reference itself is returned.
617
618       However, we recommend that you use Moose::Meta::Attribute::Native
619       traits for these types of attributes, which gives you much more control
620       over how they are accessed and manipulated. See also
621       Moose::Manual::BestPractices#Use_Moose::Meta::Attribute::Native_traits_instead_of_auto_deref.
622
623   Initializer
624       Moose provides an attribute option called "initializer". This is called
625       when the attribute's value is being set in the constructor, and lets
626       you change the value before it is set.
627

AUTHORS

629       •   Stevan Little <stevan@cpan.org>
630
631       •   Dave Rolsky <autarch@urth.org>
632
633       •   Jesse Luehrs <doy@cpan.org>
634
635       •   Shawn M Moore <sartak@cpan.org>
636
637       •   יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
638
639       •   Karen Etheridge <ether@cpan.org>
640
641       •   Florian Ragwitz <rafl@debian.org>
642
643       •   Hans Dieter Pearcey <hdp@cpan.org>
644
645       •   Chris Prather <chris@prather.org>
646
647       •   Matt S Trout <mstrout@cpan.org>
648
650       This software is copyright (c) 2006 by Infinity Interactive, Inc.
651
652       This is free software; you can redistribute it and/or modify it under
653       the same terms as the Perl 5 programming language system itself.
654
655
656
657perl v5.36.0                      2023-02-06      Moose::Manual::Attributes(3)
Impressum