Blog récent de Chromatic Je me suis curieux du sous-programme Moose Edit: Voici le code source d'origine pour le code> SUBROUTINE: P> a code>. Je cherchais le code source Moose et remarquais que l'intérieur du sous-programme code> a code>, il existe une variable
$ méta code> non décalable à partir de
@_ code>. Où est-ce que
META code> vient? J'ai commencé à échapper à travers les différents modules Moose et Classe: Mop. Dans de nombreux sous-sections, il semble que
Meta code> est communément trouvé comme premier argument dans
@_ code>, même s'il n'est pas transmis spécifiquement comme un argument.
sub has {
my $meta = shift;
my $name = shift;
Moose->throw_error('Usage: has \'name\' => ( key => value, ... )')
if @_ % 2 == 1;
my %options = ( definition_context => Moose::Util::_caller_info(), @_ );
my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
$meta->add_attribute( $_, %options ) for @$attrs;
}
3 Réponses :
La magie particulière que vous recherchez est dans Moose :: Exportateur . Vous obtenez la méthode notez l'option "with_metta" pour Les différents modules Moosex qui prolongent Moose utilisent Moose :: Exportateur pour importer de nouveaux symboles dans l'espace de noms de l'appelant. Vous pouvez en savoir plus sur ce processus dans le livre de recettes, à partir de Moose: : Cookbook :: extension :: recette1 . P> p> code> via moose.pm à partir de ce code:
setup_import_mesthods code> - il importe Ces méthodes dans l'espace de noms de l'appelant de manière à garantir que le premier argument passé sera l'objet métaclass. p>
+1 merci. Je vois que j'ai besoin de passer un peu de temps à étudier l'orignal :: exportateur avant que je puisse vraiment le comprendre. Il n'est toujours pas clair pour moi comment META code> (ou plus précisément, la référence que
$ Meta code> se réfère ultérieurement) est dans
@_ code>, mais Vous m'avez définitivement signalé dans la bonne direction.
Vous pouvez spécifiquement vouloir regarder la méthode privée _make_wrapped_sub_with_meta code> Intérieur
Moose :: Exportateur Code>. La valeur de retour de ceci est ce qui est installé comme
a code> par Moose je crois.
Qu'est-ce qui est réellement importé dans votre colis, ce n'est pas le nommé Subroutin, mais une fermeture qui insère l'objet Meta. Vous pouvez voir exactement comment cela se produit avec: code1 code> est la fermeture elle-même; ci-dessus sont les variables référencées dedans. p> p>
Je l'ai changé en Perl -we'package x; Utiliser des données :: Dump :: Streamer; utiliser l'orignal; Dump (\ & a) ' code> pour le faire fonctionner sur ma machine de Debian Lenny.
+1 merci. Je ne sais pas comment le sous-programme code> est converti en cette fermeture, mais cela montre définitivement la nature au curry du importé a code>.
Pour toute personne qui veut voir la sortie est un peu moins désordonnée, essayez de remplacer Dump (\ & a) code> dans la doublure avec
Dump (\ & Après) code>.
Je ne sais pas comment le sous-programme est converti à cette fermeture, mais cela montre définitivement la nature curry de l'importée a p>
BlockQuote> Voici (j'espère!) Un exemple simple de la manière dont cela pourrait être atteint (Cependant, je soupçonne importer.pm strong> p> meta_has.pl strong> p> maintenant si vous exécutez espère que cela aide. p> / i3aze / p> p> Molécules Code> Commentaire dans YSTH Réponse :
Moose code>
fait-il d'une manière beaucoup plus complexe et meilleure!) P> meta_has.pl code> vous obtiendrez: p>