2009-03-07 6 views
6

J'ai mis en place un peu le cas de test pour démontrer mon problème:Pourquoi MooseX :: Storage ne semble-t-il pas suivre les caractéristiques d'attributs de certains objets?

package P1; 
use Moose; 
use MooseX::Storage; 
with Storage; 

has 'blah' => (
    is => 'rw', 
); 

package P2; 
use Moose; 
use MooseX::Storage; 
with Storage; 

has 'lol' => (
    is => 'rw', 
    traits => ['DoNotSerialize'] 
); 

package P3; 
use Moose; 
extends 'P2'; 

has 'magic' => (
    is => 'rw', 
); 

package Test; 
my $obj = P3->new(
    magic => 'This ok!', 
    lol => sub { 'weee' } 
); 

my $stored = P1->new(blah => $obj); 

use Data::Dumper; print Dumper ($stored->pack); 

je me attends à ce pour imprimer l'objet, mais pas l'attribut « lol » dans le paquet P2 - cependant, je peux encore le voir dans le résultat de $stored->pack

$VAR1 = { 
      '__CLASS__' => 'P1', 
      'blah' => bless({ 
          'magic' => 'This ok!', 
          'lol' => sub { "DUMMY" } 
          }, 'P3') 
     }; 

Suis-je utiliser MooseX :: Stockage mal, ou ce que ça ressemble le comportement bogué?

+2

Je sais que c'est vieux, mais en fait cela ne semble pas être un bug. Comme le fait remarquer 'draegtun', il vous manque les informations de type pour que l'attribut 'blah' ne soit pas réellement sérialisé par MooseX :: Storage. Si elle était sérialisée, vous ne verriez pas le 'bless', mais plutôt la touche '__CLASS__'. MooseX :: Storage fait la plupart du temps s'effondrer en fonction de la contrainte de type fournie dans l'attribut, sans qu'il ne soit laissé de deviner. –

Répondre

1

Vous pouvez faire 'blah' un isa de P3 ....

has 'blah' => (
    is => 'rw', 
    isa => 'P3', 
); 

et maintenant Dumper (pack $ à accumulation>) montre cela ....

$VAR1 = { 
     '__CLASS__' => 'P1', 
     'blah' => { 
        '__CLASS__' => 'P3', 
        'magic' => 'This ok!' 
       } 
}; 

qui ressemble à la sérialisation correcte pour cet objet Moose?

8

Yup qui ressemble à un bug. Pouvez-vous transformer cela en un test qui utilise Test :: More et le soumettre à la file d'attente RT et quelqu'un (probablement moi) va corriger cela. Notez que si vous videz $ obj-> store, vous voyez que le trait est correctement appliqué à l'attribut direct, mais il semble qu'il soit perdu pendant le processus d'héritage.

Vous pouvez rapporter des bogues contre MooseX :: Stockage dans RT

+0

S'il vous plaît fournir un lien vers l'endroit pour soumettre ceci? Merci! – Ether

Questions connexes