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.

War es hilfreich?

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 );
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top