These allow you to explicitly distinguish between a false or undefined attribute value and a value which has not been set.
\!h # Predicate - tells you whether or not a given attribute is currently set.
# If the attribute is explicitly set to 'undef' or some other false value, this will still return true because they are set after all.
\!h # Clearer - unsets an attribute
# Not the same as setting the value to 'undef'- but you can only distinguish between the two using predicate.
\!h # Code to illustrate relationship between an accessor, predicate and clearer method.
package Person;
use Moose;
has 'ssn' => ( # create attribute
is => 'rw', # make it read-write
clearer => 'clear_ssn', # provide name for clearer
predicate => 'has_ssn', # provide name for predicate
# ^ By default, Moose doesn't make them for you
)
...
my $person = Person->new(); # create object instance in Person class
$person->has_ssn; # false, no value is set
$person->ssn(undef); # sets a value of 'undef'
$person->ssn; # returns the value
$person->has_ssn; # returns true now because $person has a value
$person->clear_ssn; # unset current value
$person->ssn; # also returns undef, this time it isn't explicitly set though
$person->has_ssn; # false because undef is there by default, from a lack of value
$person->ssn('123-45-6789'); # set new value
$person->ssn; # returns new value; '123-45-6789'
$person->has_ssn; # true
my $person2 = Person->new(ssn => '111-22-3333'); # make new variable under the Person class, with the attributes of 'ssn' and the value '111-22-3333'.
$person->has_ssn; # true