Ausschalten von Inline -Konstruktoren mit Moosex :: Deklare
Frage
Grüße,
Als Follow -up zu meinem Vorherige Frage Über Moose, ich bin jetzt auf ein neues Problem gestoßen. Ich habe eine Elchklasse, die verwendet Rezept 12 um eine nicht moose übergeordnete Klasse zu erweitern. Hier ist es:
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
);
}
Das funktioniert großartig. Ich habe auch eine Unterklasse dieser Klasse, die verwendet MooseX::Declare
. Da ich jetzt den Standard -Elchkonstruktor überschreibe, emittiert meine Unterklasse diese Warnung:
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
Seit MooseX::Declare
Anrufe make_immutable
Automatisch hinter den Kulissen konnte ich nicht herausfinden, wie ich es einschalten kann inline_constructor => 0
Parameter.
Lösung
Dank einiger Leute auf IRC konnte ich diesen knacken. Die Klasse deklarieren mutable
war ausreichend, um die auszuschalten auto_make_immutable
Flagge ein MooseX::Declare
, Also konnte ich es dann manuell tun. (Natürlich funktioniert dies auch mit einer Nicht-MX :: Deklar-Klasse.)
Überarbeitete Version:
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 );
}