Ваш код, кажется, действует так, как если бы BUILD был конструктором, а это не так - это больше похоже на ловушку после построения, где вы можете выполнять другие вещи, такие как чтение значений из БД. Вместо этого вы должны либо:
- сохранить результат
mia->load
в атрибуте и при необходимости использовать делегированные методы для доступа к нему, или
- использовать результат
mia->load
в качестве объекта вместо создания отдельного.
Вот пример первого случая, отделяющего объект MooseX :: Storage от объекта, который его контролирует:
package miaController;
use Moose;
use mia;
has 'nome' => ( is => 'rw', isa => 'Str', default =>'',);
has 'stato' => ( is => 'rw', isa => 'Int', default =>1,);
has 'mia' => ( is => 'rw', isa => 'mia', lazy => 1);
sub BUILD
{
my $self = shift;
if ($self->stato == 1)
{
$self->mia(mia->load("mia.dat"));
}
elsif ($self->stato == 2)
{
$self->stato(0);
$self->nome("prova");
$self->mia->store("mia.dat");
}
}
sub stampa
{
my $self = shift;
print $self->nome." ".$self->stato;
}
package mia;
use Moose;
use MooseX::Storage;
with Storage(format => 'JSON', io => 'File');
package main:
use miaController;
my $m1=miaController->new(stato=>2);
my $m2=miaController->new();
print "\nm1 \n";
$m1->stampa();
print "\nm2 \n";
$m2->stampa();