قم بإيقاف تشغيل المنشآت المضمنة مع Moosex :: Denare

StackOverflow https://stackoverflow.com/questions/1060470

  •  21-08-2019
  •  | 
  •  

سؤال

تحيات،

كمتابعة إلى بلدي السؤال السابق حول موس ، لقد واجهت الآن مشكلة جديدة. لدي فئة موس التي تستخدم وصفة 12 من أجل توسيع فئة الوالدين غير المتوهمين. ها هو:

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

هذا يعمل بشكل رائع. لدي أيضًا فئة فرعية من هذه الفئة التي تستخدم MooseX::Declare. ومع ذلك ، لأنني الآن أتجاوز مُنشئ موس الافتراضي ، ينبعث فئتي الفرعية هذا التحذير:

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

حيث MooseX::Declare المكالمات make_immutable تلقائيًا وراء الكواليس ، لم أتمكن من معرفة كيفية تشغيله inline_constructor => 0 معامل.

هل كانت مفيدة؟

المحلول

بفضل بعض الناس على IRC ، تمكنت من كسر هذا واحد. إعلان الفصل mutable كان كافيا لإيقاف تشغيل auto_make_immutable العلم في MooseX::Declare, ، لذلك يمكنني بعد ذلك القيام بذلك يدويًا. (بالطبع هذا يعمل أيضًا مع فئة غير MX :: DECLARE.)

طبعة منقحة:

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 );
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top