An attribute is a property that every member of a class has. They can be thought of as a named value (as in a hash) that can be read and set. However, attributes can also have defaults, type constraints, delegation and much more. In other languages, they are often known as slots or properties.
\!h # Firstly, to declare use the 'has' function:
package Person;
use Moose;
# all 'Person' objects will now have an optinal read-write 'first_name' attribute:
has 'first_name' => (is => 'rw'); # can also be 'ro' for read-only
\!h # Accessor methods:
# Lets you read and write the value of that attribute for an object.
# By default, the accessor method has the same name as the attribute.
# So, we now have a first_name accessor that can read or write a 'Person' object's first_name attribute's value.
# To explicitly specify the method names to be used for reading and writing an attribute's value:
has 'weight' => (
is => 'ro',
writer => '_set_weight',
);
# handy when you want an attribute publicly readable but only privately settable.
# Following best practises, provide names for both reader and writer methods:
has 'weight' => (
is => 'rw',
reader => 'get_weight',
writer => 'set_weight',
);