Après avoir créé une métaclasse en utilisant Moose::Meta::Class->create
, comment instancier une véritable classe Moose avec cette classe en tant que métaclasse? (je dois créer le métaclasse aussi parce que je veux aussi appliquer des rôles à lui.)Comment créer une nouvelle classe Moose et instancier un objet de cette classe lors de l'exécution?
Comment créer une nouvelle classe Moose et instancier un objet de cette classe lors de l'exécution?
Répondre
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
.
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/
merci draegtun :) – xxxxxxx
- 1. Instancier une classe à partir d'un objet de classe
- 2. ruby on rails Classe de contrôleur instancier une classe ruby?
- 3. Comment créer un objet dans une classe?
- 4. Puis-je instancier un objet sous-classe de la superclasse
- 5. Instancier une classe à tester
- 6. instancier une nouvelle classe à la valeur d'une chaîne
- 7. Instancier une classe dynamiquement via une variable
- 8. Comment instancier une classe Socket en Java?
- 9. Créer un nouvel objet de classe
- 10. Créer dynamiquement un objet DOM et donner une classe
- 11. Comment GWT instancier une classe d'interface Java
- 12. Comment remplacer une méthode d'un objet Moose lors de l'exécution?
- 13. créer un objet de classe abstraite et l'interface
- 14. Comment créer une nouvelle instance de la même classe que l'autre objet?
- 15. Comment créer un constructeur d'une classe qui retourne une collection d'instances de cette classe?
- 16. Instancier une classe arbitraire dans Objective C
- 17. Comment compiler et instancier par programme une classe Java?
- 18. comment appeler un objet d'une classe à une autre classe
- 19. Extraction de classe lors de TDD. Comment tester la nouvelle classe extraite?
- 20. Comment instancier un objet dans UserControl.Resources?
- 21. C# .NET: Comment créer une nouvelle instance d'une classe basée uniquement sur un objet "Type"?
- 22. Comment instancier une classe qui a un constructeur nécessitant un objet d'interface
- 23. Comment puis-je créer une nouvelle instance d'une classe?
- 24. classe Java instancier
- 25. référençant d'autres méthodes de classe sans créer une nouvelle instance
- 26. asp.net datasource instancier la classe
- 27. Comment créer une instance de classe dans cette méthode de classe?
- 28. Comment créer une nouvelle instance ViewModel dans la classe ViewModel?
- 29. Comment créer un objet de classe java dans excel vba
- 30. IntelliJ IDEA 9 CE Boîte de dialogue "Créer une nouvelle classe" élément de l'interface utilisateur objet
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
@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
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