Question

Bonjour,

En tant que suivi à mon question précédente sur Moose, je ai maintenant courir dans un nouveau problème. J'ai une classe Moose qui utilise recette 12 afin d'étendre une classe parent non orignal. Ici, il est:

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

Cela fonctionne très bien. J'ai aussi une sous-classe de cette classe, qui utilise MooseX::Declare. Cependant, parce que je suis PRÉPONDÉRANTS maintenant par défaut constructeur Moose, ma sous-classe émet cet avertissement:

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

Depuis les appels make_immutable automatiquement derrière les inline_constructor => 0 scènes, je ne l'ai pas été en mesure de comprendre comment l'obtenir pour activer le paramètre <=>.

Était-ce utile?

La solution

Merci à des gens sur IRC, j'ai pu casser celui-ci. Déclarant la classe était suffisante pour mutable éteindre le drapeau dans auto_make_immutable MooseX::Declare, donc je pourrais alors le faire manuellement. (Bien sûr, cela fonctionne aussi avec un non-MX :: Déclarez classe.)

Version révisée:

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 );
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top