2009-06-29 11 views
5

Grüße,Inline-Konstrukteure mit MooseX Ausschalten :: Declare

Als Followup meiner previous question über Moose, ich habe jetzt in ein neues Problem laufen. Ich habe eine Moose-Klasse, die Recipe 12 verwendet, um eine Nicht-Moose-Elternklasse 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 super. Ich habe auch eine Unterklasse dieser Klasse, die MooseX::Declare verwendet. Aber weil ich jetzt das Standard-Elch-Konstruktor überschreiben bin, gibt 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 

Da MooseX::Declare Anrufe make_immutable automatisch hinter den Kulissen, habe ich nicht in der Lage, herauszufinden, wie um es zu aktivieren der inline_constructor => 0 Parameter.

Antwort

11

Dank ein paar Leute im IRC konnte ich diesen knacken. Die Klasse mutable zu deklarieren war ausreichend, um das auto_make_immutable Flag in MooseX::Declare zu deaktivieren, also könnte ich es dann manuell tun. (Natürlich funktioniert das auch mit einem nicht-MX :: Klasse deklarieren.)

Ü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); 
}