2010-10-13 5 views
0

Donc j'essaie simplement de faire une chose très simple: définir un accesseur de lecteur personnalisé pour un attribut d'orignal. J'essaie donc ceci:Perl Moose accessor Moose - ne peut pas définir uniquement un lecteur ou lecteur accesseur!

has 'compiled_regex' => ( 
    isa => 'RegexpRef', 
    is => 'rw', 
    reader => 'get_compiled', 
); 

mais get_compiled ne sera jamais appelé, sans doute parce que compiled_regex est en lecture/écriture. Ok, pas de problème. J'essaie ensuite ceci:

has 'compiled_regex' => ( 
    isa => 'RegexpRef', 
    writer => '_compile', 
    reader => 'get_compiled', 
); 

et qui produit l'erreur suivante:

Can't locate object method "compiled_regex" via package "PrettyRegex" at ../lib/Pretty/Regexs.pm line 39.

qui fait référence à cette ligne qui est dans le _ compile méthode:

$self->compiled_regex(qr/$self->regex/); 

Maintenant, je n » J'ai beaucoup dormi au cours des 3 derniers jours alors peut-être que je suis confus, mais il semble que même si cela a fonctionné, cela créerait une régression infinie depuis que j'ai défini l'écrivain comme _compile ... A suis-je manquant ici?

essayé réponse Sinan, mais encore obtenir:

Can't locate object method "compiled_regex" via package "PrettyRegex" at ../lib/Pretty/Regexs.pm line 41. 
+1

Je ne connais pas assez Moose pour connaître le problème, mais quelqu'un peut changer le titre du message en question. –

+0

J'ai fait le nom du lecteur 'get_compiled_regex' lors de la modification du script pour une raison quelconque. C'est pourquoi vous recevez ce message. –

Répondre

2

Je suis pas clair sur ce que vous essayez de faire. reader et writer sont des méthodes que Moose crée pour vous, pas des méthodes que vous écrivez et qu'il appelle.

Je pense que vous devez reformuler votre question pour expliquer le problème de niveau supérieur que vous essayez de résoudre. Je m'attends à ce qu'il y ait une meilleure façon de le faire que vous ne le pensez, mais nous ne pouvons pas être sûrs de ce que vous essayez vraiment de faire.

Si vous essayez d'appeler votre méthode personnalisée lorsque l'attribut est lu, nommez simplement le lecteur autre chose (comme _get_compiled_regex) et nommez votre méthode compiled_regex. Ou utilisez un modificateur de méthode sur la méthode du lecteur. (C'est probablement mieux, car alors vous n'oublierez pas die si quelqu'un passe un paramètre à votre méthode de lecture, en essayant de définir l'attribut.)

Vous pouvez également avoir un déclencheur sur un autre attribut qui efface cette un.

+0

Voici le problème fondamentalement ... J'ai défini un écrivain personnalisé, disons 'write_attr' sur l'attribut, disons $ self-> my_attr. Maintenant, la dernière ligne de write_attr est $ self-> my_attr ($ some_var).Cela ne fonctionne pas pour les raisons décrites dans la question, mais même si cela ne le ferait pas créer une régression infinie puisque la dernière ligne de write_attr appelle effectivement write_attr? – ennuikiller

+1

@ennui: "la dernière ligne de write_attr ..." indique le problème: ce n'est pas un sous-marin que vous devriez définir vous-même. Il est généré automatiquement avec la directive 'writer'. – Ether

+1

ok, alors comment puis-je créer un écrivain personnalisé? – ennuikiller

0

Je garde deviner ce que la question réelle est, mais je sens le lui correspond suivantes:

package My::M; 

use Moose; 
use namespace::autoclean; 

has 'compiled_regex' => (
    isa => 'RegexpRef', 
    is => 'ro', 
    writer => '_set_compiled_regex', 
); 

sub compile { 
    my $self = shift; 
    my ($pat) = @_; 
    $self->_set_compiled_regex(qr/$pat/); 
    return; 
} 

__PACKAGE__->meta->make_immutable; 

package main; 
use strict; use warnings; 

my $m = My::M->new; 
$m->compile('^\W+\z'); 

if ('@#$%%$' =~ $m->compiled_regex) { 
    print "Hmph!\n"; 
} 
+0

@Ether désolé, le commentaire se réfère à Sinan première réponse, pas à celle ci-dessus. – ennuikiller

+0

s'il vous plaît voir ma réponse éditée. – ennuikiller

0

Er? Si votre lecteur s'appelle get_compiled et que votre script est appelé _compile, vous n'avez pas de méthode nommée compiled_regex, et il devrait être évident qu'un appel de cette méthode inexistante échouerait. Vous devez prendre plusieurs pas en arrière et expliquer ce que vous essayez de faire, au lieu de ce qui ne va pas avec la façon dont vous avez essayé de le faire.

+1

vous voyez c'est pourquoi perl oo avec l'orignal est, euh, bizarre. compiled_regex devrait être un attribut, pas une méthode ..... comment cet attribut est défini devrait être, euh, non pertinent. - – ennuikiller

Questions connexes