2010-09-05 19 views
4

J'ai fait un module « bundle » qui fait un tas de choses: les importations Moose, les importations true, namespace::autoclean, fait immuable (prise de MooseX::AutoImmute) la classe de l'appelant. La seule chose que je n'ai pas réussi à comprendre est comment inclure MooseX::Method::Signatures.d'importation MooseX Méthode :: Signatures dans le champ de l'appelant

Voici ce que j'ai jusqu'à présent:

package My::OO; 

use Moose::Exporter; 
use Hook::AfterRuntime; 

use Moose(); 
use true(); 
use namespace::autoclean(); 

my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods(
also => ['Moose'], 
); 
sub import { 
true->import(); 

my $caller = scalar caller; 
after_runtime { $caller->meta->make_immutable }; 

namespace::autoclean->import(-cleanee => $caller); 

goto &$import; 
} 
sub unimport { 
goto &$unimport; 
} 

1; 

L'idée est que dans mon code, je peux maintenant faire des choses comme ceci:

package My::Class; { 
    use My::OO; 
    extends 'My::Parent'; 
    method foo() { ... } 
} 

mais maintenant je dois encore inclure un use MooseX::Method::Signatures; supplémentaire. Comment puis-je l'inclure dans mon module OO?

Répondre

12

Tout d'abord, s'il vous plaît noter que la mise en œuvre de Hook::AfterRuntime est assez fragile. Bien qu'il fonctionne pour beaucoup de choses simples, il est extrêmement facile de se retrouver avec très difficile de déboguer les erreurs. Je vous recommande d'écrire le ->meta->make_immutable ou d'utiliser d'autres approches pour l'écrire, par exemple MooseX::Declare.

Pour répondre à votre question réelle:

MooseX::Method::Signatures->setup_for($your_caller); 
+0

+1 pour MooseX :: Déclare! Sérieusement Moose est cool, mais si l'on veut que Perl OO soit facile, il faut aller jusqu'au bout. Par exemple, je travaille sur un clone onopoly basé sur Perl, appelé ['Opoly'] (https://github.com/jberger/Opoly) et une partie de ma raison d'essayer était de faire un projet complet dans MooseX :: Declare et c'est génial –