Привет,
Я изучаю Moose и пытаюсь написать подкласс CGI :: Application с Moose, что затрудняется тем, что CGI-App не основано на лося.
В других моих подклассах CGI-App мне нравится иметь родительский класс с методом setup
, который просматривает таблицу символов дочернего класса и автоматически устанавливает режимы выполнения. Я полагаю, что могу использовать средства метакласса Moose, чтобы добиться того же самого более чистым способом. Итак, вот что я имею в своем родительском классе:
use MooseX::Declare;
class MyApp::CGI
extends Moose::Object
extends CGI::Application {
method setup {
$self->start_mode( 'main' );
my @methods = map { $_->name } $self->meta->get_all_methods;
$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}
}
... и в моем детском классе:
use MooseX::Declare;
class MyApp::CGI::Login
extends MyApp::CGI {
method rm_main {
return "it works";
}
}
Я понял, что причина, по которой мои режимы выполнения не были настроены должным образом, заключается в том, что setup
вызывается конструктором CGI-App, а Moose::Object
вставляет свой собственный конструктор в мой класс. Я попытался решить эту проблему с помощью модификатора метода:
around new {
$self = $orig->( @_ );
$self->CGI::Application::new( @_ );
}
Это дает мне
Can't call method "BUILDARGS" on unblessed reference at ...Moose/Object.pm line 21.
Однако у меня есть ощущение, что я поступаю об этом совершенно неверным образом, и у Муз есть гораздо лучшие возможности для достижения того, чего я хочу, чего я еще не обнаружил.