2009-06-29 11 views
5

Saludos,Desactivación de constructores en línea con MooseX :: Declarar

Como seguimiento a mi previous question sobre Moose, ahora he encontrado con un nuevo problema. Tengo una clase Moose que usa Recipe 12 para extender una clase primaria que no sea de Moose. Aquí 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 
        );   
} 

Esto funciona genial. También tengo una subclase de esta clase que usa MooseX::Declare. Sin embargo, debido a que ahora estoy anulando los alces constructor por defecto, mi subclase emite esta advertencia:

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 

Desde MooseX::Declare llamadas make_immutable automáticamente detrás de las escenas, no he podido encontrar la manera de conseguir que se encienda el parámetro inline_constructor => 0.

Respuesta

11

Gracias a algunas personas en el IRC he podido descifrar este. Declarar que la clase mutable fue suficiente para apagar la bandera auto_make_immutable en MooseX::Declare, entonces pude hacerlo manualmente. (Por supuesto, esto también funciona con un no-MX :: Declarar clase.)

Versión revisada:

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