6
votes

À Moose Subroutines, comment est-ce que $ meta est dans @_?

Blog récent de Chromatic Je me suis curieux du sous-programme Moose 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.

Edit: Voici le code source d'origine pour le code> SUBROUTINE: P>

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;
}


0 commentaires

3 Réponses :


12
votes

La magie particulière que vous recherchez est dans Moose :: Exportateur . Vous obtenez la méthode via moose.pm à partir de ce code: xxx

notez l'option "with_metta" pour setup_import_mesthods - 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.

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 .


2 commentaires

+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 (ou plus précisément, la référence que $ Meta se réfère ultérieurement) est dans @_ , 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 Intérieur Moose :: Exportateur . La valeur de retour de ceci est ce qui est installé comme a par Moose je crois.



6
votes

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: xxx

code1 est la fermeture elle-même; ci-dessus sont les variables référencées dedans.


3 commentaires

Je l'ai changé en Perl -we'package x; Utiliser des données :: Dump :: Streamer; utiliser l'orignal; Dump (\ & a) ' pour le faire fonctionner sur ma machine de Debian Lenny.


+1 merci. Je ne sais pas comment le sous-programme est converti en cette fermeture, mais cela montre définitivement la nature au curry du importé a .


Pour toute personne qui veut voir la sortie est un peu moins désordonnée, essayez de remplacer Dump (\ & a) dans la doublure avec Dump (\ & Après) .



2
votes

Molécules Commentaire dans YSTH Réponse :

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

Voici (j'espère!) Un exemple simple de la manière dont cela pourrait être atteint (Cependant, je soupçonne Moose fait-il d'une manière beaucoup plus complexe et meilleure!)

meta.pm xxx

importer.pm xxx

meta_has.pl xxx

maintenant si vous exécutez meta_has.pl vous obtiendrez: xxx

espère que cela aide.

/ i3aze /


0 commentaires