2017-07-25 5 views
2

à Moose nous pouvons imposer des restrictions sur les attributs d'instance ou ajouter des getters/setters comme ceci:générer Dynamiquement écrivain/lecteur de noms d'attributs à Moose

has 'color' => (
    is => 'rw', 
    isa => 'Str', 
    writer => '_set_color', 
); 

Ma question est, est-il un moyen de le faire dynamiquement pour un tableau d'éléments? Il est possible de faire quelque chose comme ceci:

has ['color', 'temperature', 'size'] => (
    is => 'rw', 
    isa => 'Str', 
); 

Mais est-il un moyen de créer pour chacun de ces éléments son auteur (ou lecteur), par exemple _set_color, _set_temperature, _set_size? J'ai essayé de voir si ce qui suit a donné une idée, mais il a retourné une erreur

mauvais accesseur/lecteur/auteur/prédicats/format plus clair, doit être un HASH ref

has ['color', 'temperature', 'size'] => (
    is => 'rw', 
    isa => 'Str', 
    writer => sub { 
    print Dumper(\@_); 
    return; 
); 

Qu'est-ce que J'espère obtenir quelque chose comme (ce qui ne fonctionne pas):

has ['color', 'temperature', 'size'] => (
    is => 'rw', 
    isa => 'Str', 
    writer => "_set_$_"; 
); 

J'ai besoin écrivains personnalisés, si juste pour aller ceux fournis par Moose ne fonctionne pas fo R moi.

Répondre

4

has n'est pas magique. C'est juste un appel de sous-programme. Donc quelque chose comme ça devrait fonctionner (non testé):

for (qw[colour temperature size]) { 
    has $_ => (
    is  => 'rw', 
    isa => 'Str', 
    writer => "_set_$_", 
); 
}