2010-09-05 2 views
4

Я сделал модуль «пучок», который делает кучу вещей: импорт Moose, импорт true, namespace::autoclean, делает класс абонента неизменяемым (взято из MooseX::AutoImmute). Единственное, что мне не удалось выяснить, это включить MooseX::Method::Signatures.Импорт MooseX :: Method :: Подписи в область видимости вызывающего

Вот что у меня до сих пор:

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; 

Идея заключается в том, что в моем коде, я могу сделать что-то вроде этого:

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

но сейчас я до сих пор включают дополнительные use MooseX::Method::Signatures;. Как включить это в мой модуль OO?

ответ

12

Прежде всего, обратите внимание, что реализация Hook::AfterRuntime довольно хрупкая. Хотя это работает для многих простых вещей, очень легко в конечном итоге очень сложно отлаживать ошибки. Я бы порекомендовал просто написать ->meta->make_immutable самостоятельно или использовать другие подходы, чтобы обойти его, например, MooseX::Declare.

Чтобы ответить на актуальный вопрос:

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

+1 для MooseX :: Объявить! Серьезно Лось классный, но если кто-то сделает Perl OO легким, возьмите его полностью. Например, я работаю над клоном onopoly, основанным на Perl, под названием ['Opoly'] (https://github.com/jberger/Opoly), и часть моей причины пыталась сделать полный проект в MooseX :: Declare , и –