Gravando em atributos somente leitura dentro de uma classe Perl Moose

Usando Perl eMoose, os dados do objeto podem ser acessados de duas maneiras.

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

Aqui está um exemplo simples que demonstra os dois:

# 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";

Eu sei que quando você está fora doPerson.pm arquivo é melhor usar o$person->age() versão, pois evita que você cometa erros estúpidos e impede que você substitua um valor somente leitura, mas minha pergunta é ...

Dentro doPerson.pm é melhor usar$self->{age} ou$self->age()? É uma prática recomendada substituir um atributo somente leituradentro o próprio módulo?

Este atributo deve ser alterado para um atributo de leitura / gravação, se é esperado que seu valor mude, ou é considerado aceitável substituir o aspecto somente leitura do atributo usando$self->{age} dentro doHAPPY_BIRTHDAY função?

questionAnswers(3)

yourAnswerToTheQuestion