Moose: загрузка объекта из файла в методе BUILD - PullRequest
2 голосов
/ 20 апреля 2010

Мне нужно прочитать файл в методе BUILD, и я хочу использовать метод загрузки пакета MooseX :: Storage.
Но этот метод загрузки создает новый объект, и поэтому, когда я устанавливаю объект, это не объект, считанный из файла. В приведенном ниже коде я создаю объект $ m1 с состоянием 2 для записи файла, я создаю $ m2 без параметра для чтения файла, но $ m2 не содержит правильного значения. Пакет:

package mia;
use Moose;
use MooseX::Storage;

with Storage(format => 'JSON', io => 'File');

has 'nome'  => ( is     => 'rw', isa    => 'Str', default =>'',);
has 'stato' => ( is     => 'rw', isa    => 'Int', default =>1,);

sub BUILD{ 
my $self=shift;
    if ($self->stato==1){
      $self=mia->load("mia.dat");
    }
    if ($self->stato==2){
    $self->stato(0);
    $self->nome("prova");
    $self->store("mia.dat");    
 } 
sub stampa(){
my $self=shift;
print $self->nome." ".$self->stato;
}

основная программа

use mia;
my $m;

$m1=mia->new(stato=>2); 
$m2=mia->new();
print "\nm1 \n";
$m1->stampa();
print "\nm2 \n";
$m2->stampa();

1 Ответ

5 голосов
/ 20 апреля 2010

Ваш код, кажется, действует так, как если бы 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();
...