Disattivazione costruttori in linea con MooseX :: Dichiarare
Domanda
Saluti,
Come un follow-up alla mia domanda precedente in merito a Moose, ho già ora incorrere in un nuovo problema. Ho una classe di Moose che utilizza ricetta 12 al fine di estendere una classe genitore non Moose. Eccolo:
package MyApp::CGI;
### TODO: make this work with MooseX::Declare?
use Moose;
extends 'CGI::Application';
sub new {
my $class = shift;
my $obj = $class->SUPER::new( @_ );
return $class->meta->new_object( __INSTANCE__ => $obj, @_ );
}
sub setup {
my $self = shift;
$self->start_mode( 'main' );
my @methods = map { $_->name } $self->meta->get_all_methods;
$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}
Questa grande opera. Ho anche una sottoclasse di questa classe che usa MooseX::Declare
. Tuttavia, perché ora sto sovrascrivendo il costruttore di default Moose, il mio sottoclasse emette questo avvertimento:
Not inlining 'new' for MyApp::CGI::Login since it is not inheriting the default Moose::Object::new
If you are certain you don't need to inline your constructor, specify inline_constructor => 0 in your call to MyApp::CGI::Login->meta->make_immutable
Dal make_immutable
chiama inline_constructor => 0
automaticamente dietro le quinte, non sono stato in grado di capire come farlo per accendere il <=> parametro.
Soluzione
Grazie ad alcune persone su IRC sono stato in grado di rompere questo. Dichiarare la classe mutable
era sufficiente per spegnere il auto_make_immutable
bandiera MooseX::Declare
, così ho potuto poi farlo manualmente. (Naturalmente questo funziona anche con un non-MX :: Dichiarare di classe.)
Versione rivista:
use MooseX::Declare;
class MyApp::CGI extends CGI::Application is mutable {
around new {
my $obj = $self->SUPER::new( @_ );
return $self->meta->new_object( __INSTANCE__ => $obj, @_ );
}
method setup {
$self->start_mode( 'main' );
my @methods = map { $_->name } $self->meta->get_all_methods;
$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}
__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
}