Pregunta

Saludos,

Como seguimiento a mi pregunta anterior sobre Moose, me ahora han topado con un nuevo problema. Tengo una clase que utiliza Moose receta 12 con el fin de extender una clase padre que no alces. 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 muy bien. También tengo una subclase de esta clase que utiliza 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 make_immutable llama inline_constructor => 0 automáticamente detrás de las escenas, no he sido capaz de encontrar la manera de conseguir que se encienda el <=> parámetro.

¿Fue útil?

Solución

Gracias a algunas personas en el IRC que fue capaz de romper éste. La declaración de la clase mutable era suficiente para apagar el indicador en auto_make_immutable MooseX::Declare, por lo que entonces podía 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 );
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top