Saluti,Trattare con i costruttori più-ereditato a Moose
sto imparando Moose e sto cercando di scrivere una sottoclasse CGI::Application con Moose, che è resa difficile dal fatto che CGI-App non si basa su Moose.
Nelle altre sottoclassi CGI-App, mi piace avere una classe genitore con un metodo setup
che esamina la tabella dei simboli della classe figlia e imposta automaticamente i runmodes. Immagino di poter utilizzare le strutture di metameralità di Moose per ottenere la stessa cosa in un modo più pulito. Così qui è quello che ho nella mia classe genitore:
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
);
}
}
... e nella mia classe figlio:
use MooseX::Declare;
class MyApp::CGI::Login
extends MyApp::CGI {
method rm_main {
return "it works";
}
}
mi sono reso conto che la ragione le mie runmodes non erano sempre impostato correttamente perché setup
è chiamato dal costruttore CGI-App e Moose::Object
sta attaccando il proprio costruttore nella mia classe. Ho cercato di risolvere questo con un metodo modificatore:
around new {
$self = $orig->(@_);
$self->CGI::Application::new(@_);
}
Questo mi dà
Can't call method "BUILDARGS" on unblessed reference at ...Moose/Object.pm line 21.
Ho la sensazione, però, che ho intenzione di questo in tutto il modo sbagliato, e Moose ha una struttura molto migliore per ottenere ciò che voglio, che non ho ancora scoperto.
Grazie. Non ero in grado di far funzionare correttamente MooseX :: NonMoose, ma ero in grado di far ereditare correttamente la mia classe base da CGI-App con la ricetta del ricettario. – friedo
@friedo Grazie per aver accettato la mia risposta. Sto pensando che ci debba essere un modo per far sì che 'MooseX :: Declare' giochi con' MooseX :: NonMoose' ma questo non riuscivo a capirlo. –