2010-03-10 4 views

Répondre

3

La méta-classe est la classe, bien sûr. Si vous voulez une instance de cette classe, il suffit de faire:

my $instance = $meta->name->new 

Vous pourriez aussi avoir besoin pour vous assurer que $ meta ne soit pas recueilli trop tôt. En règle générale, vous faites ceci:

$meta->add_method(meta => sub { $meta }); 

qui gardera la métaclasse autour, mais vous allez fuir la classe si vous ne faites pas attention. Si vous ne le faites qu'une seule fois, cela n'aura pas d'importance; Si vous le faites des milliers de fois, vous pourriez avoir des ennuis. Il vaut mieux utiliser quelque chose de plus haut niveau comme Moose::Meta::Class::create_anon_class ou MooseX::Traits.

+0

ah oui merci jrockway :) Je ne savais même pas ce que $ meta-> nom était censé faire, c'est * FORT *, je le répète, * FORTEMENT * non intuitif pour un nom de méthode ... eh bien ... le monde du logiciel – xxxxxxx

+3

@xxxxxxxx - euh, 'name' renvoie juste le nom du paquet/de la classe. Comment est-ce non intuitif? Voir http://search.cpan.org/dist/Class-MOP/lib/Class/MOP/Package.pm – daotoad

+0

Vous pouvez également utiliser 'new_object' sur la métaclasse. http://search.cpan.org/~flora/Class-MOP-1.12/lib/Class/MOP/Class.pm#Object_instance_construction_and_cloning – ocharles

3

Je ne sais pas que cela répond à ceci ou à votre autre question SO How do I build a Moose class at runtime, add a method to it, apply a role to it and instantiate it once? How would you approach this? à Building a Moose class at runtime and tuning it, mais un coup d'oeil à:

Il peut faire ce que vous voulez. Ou vous pouvez trouver utile de regarder dans notre travail.

La documentation fournit des liens vers les articles de blogue que j'ai rédigés pendant que je construisais ce module afin que vous puissiez les trouver également utiles.

Voici un bref exemple de code de MooseX :: SingletonMethod:

{ 
    package Foo; 
    use MooseX::SingletonMethod; 
    sub bar { say 'bar' } 
} 

my $baz = Foo->new; 
my $bar = Foo->new; 

$baz->add_singleton_method(baz => sub { say 'baz' }); 

$baz->bar; # => bar 
$bar->bar; # => bar 

$baz->baz; # => baz 
$bar->baz; # Throws can't find baz error 

/I3az/

+0

merci draegtun :) – xxxxxxx

Questions connexes