2010-08-19 27 views
0

Tout d'abord, je ne suis pas sûr de la quantité d'informations à inclure, car j'ai vraiment du mal à déterminer l'origine de ce problème.Impossible de définir les attributs de la classe dans le rôle

J'ai un rôle Moose avec un sous-programme qui (avec quelques autres) essaie de définir les attributs d'une classe comme ceci:

$genre = Movie::Genre->new({ 
    genreName => 'Drama', 
    genreID => '1' 
       }); 

Le problème est, il ne fonctionne pas. La décharge de $genre immédiatement après, indique qu'il est encore vide:

$genre: bless({}, 'Movie::Genre')

étrange encore, quand j'exécuter la même ligne EXACT dans mon fichier de test, il fonctionne comme prévu avec cette décharge:

$genre: bless({ 
      genreID => '1', 
      genreName => 'Drama' 
      }, 'Movie::Genre') 

J'ai du mal à trouver ce qui différencie ces deux lignes de code, ce qui fait que l'une fonctionne et l'autre échoue.

Des idées sur les conditions qui pourraient entraîner l'échec du premier exemple et permettre à la seconde de réussir? Je serais heureux de fournir plus de contexte si nécessaire. Merci!

Répondre

2

Cette ligne transmet simplement ces paramètres au constructeur Movie :: Genre. C'est à ce constructeur de décider quoi faire avec eux.

Il semble que cet appel (dans le rôle) soit exécuté avant que la classe Movie :: Genre ait acquis les attributs nommés genreName et genreID. Par défaut, les constructeurs Moose ignorent tous les paramètres qu'ils ne reconnaissent pas, donc cela ne génère pas d'avertissement.

Votre fichier de test doit effectuer cet appel après que les attributs ont été ajoutés à Movie :: Genre.

Nous devrions voir plus de code pour comprendre exactement pourquoi cela se produit.

+0

Merci - vous avez eu raison. J'ai eu une longue chaîne de rôles et après un examen de qui appelle qui d'abord et certains remaniement, le problème a été résolu. – Ryan

+0

La méthode recommandée pour composer plusieurs rôles (une longue chaîne) est avec un seul appel 'avec qw (Role1 Role2 Role3);'. De cette façon, la composition n'est pas ordonnée ne devrait pas vous affecter. Cependant, en réalité, cela peut ne pas fonctionner à chaque fois et ainsi (en raison d'une bizarrerie de l'implémentation) plusieurs appels à 'with()' peuvent créer une composition ordonnée. – perigrin