Escribir en atributos de solo lectura dentro de una clase Perl Moose

Usando Perl yMoose, se puede acceder a los datos del objeto de 2 maneras.

$self->{attribute} o$self->attribute()

Aquí hay un ejemplo simple que demuestra ambos:

# Person.pm
package Person;

use strict;
use warnings;
use Moose;

has 'name' => (is => 'rw', isa => 'Str');
has 'age'  => (is => 'ro', isa => 'Int');

sub HAPPY_BIRTHDAY {
    my $self = shift;
    $self->{age}++;   # Age is accessed through method 1
}

sub HAPPY_BIRTHDAY2 {
    my $self = shift;
    my $age = $self->age();
    $self->age($age + 1);   # Age is accessed through method 2 (this will fail)
}

1;
# test.pl
#!/usr/bin/perl

use strict;
use warnings;
use Person;

my $person = Person->new(
    name => 'Joe',
    age  => 23,
);

print $person->age()."\n";

$person->HAPPY_BIRTHDAY();
print $person->age()."\n";

$person->HAPPY_BIRTHDAY2();
print $person->age()."\n";

Sé que cuando estás fuera delPerson.pm archivo es mejor usar el$person->age() versión ya que le impide cometer errores tontos y le impedirá sobrescribir un valor de solo lectura, pero mi pregunta es ...

Dentro dePerson.pm es mejor usar$self->{age} o$self->age()? ¿Se considera una mala práctica sobrescribir un atributo de solo lectura?dentro el módulo en sí?

Si este atributo se cambia a un atributo de lectura / escritura si alguna vez se espera que cambie su valor, o si se considera aceptable anular el aspecto de solo lectura del atributo utilizando$self->{age} dentro deHAPPY_BIRTHDAY ¿función?