2009-06-29 10 views
6

अभिवादन में कई विरासत में मिला कंस्ट्रक्टर्स के साथ काम,मूस

मैं Moose सीख रहा हूँ और मैं मूस के साथ एक CGI::Application उपवर्ग है, जो तथ्य यह है कि सीजीआई-ऐप पर आधारित नहीं है द्वारा कठिन बना दिया है लिखने के लिए कोशिश कर रहा हूँ मूस।

मेरे अन्य सीजीआई-ऐप उप-वर्गों में, मुझे setup विधि वाला अभिभावक वर्ग होना पसंद है जो कि बाल वर्ग की प्रतीक तालिका को देखता है और स्वचालित रूप से रनमोड सेट करता है। मुझे लगता है कि मैं एक ही चीज़ को क्लीनर तरीके से प्राप्त करने के लिए मूस की मेटाक्लास सुविधाओं का उपयोग कर सकता हूं।

use MooseX::Declare; 

class MyApp::CGI 
extends Moose::Object 
extends CGI::Application { 

    method setup { 
     $self->start_mode('main'); 

     my @methods = map { $_->name } $self->meta->get_all_methods; 

     $self->run_modes(map { /^rm_(.+)$/ => $_ } 
          grep { /^rm_/ } 
          @methods 
         ); 
    } 

} 

... और मेरे बच्चे कक्षा में:

use MooseX::Declare; 

class MyApp::CGI::Login 
extends MyApp::CGI { 
    method rm_main { 
     return "it works"; 
    } 
} 

मैंने महसूस किया कि कारण मेरी runmodes ठीक से सेट नहीं मिल रहे थे क्योंकि setup है तो यहाँ क्या मैं अपने माता पिता के वर्ग में है सीजीआई-ऐप कन्स्ट्रक्टर द्वारा बुलाया गया, और Moose::Object मेरी कक्षा में अपना स्वयं का कन्स्ट्रक्टर चिपका रहा है। मैं एक विधि संशोधक के साथ इस का समाधान करने की कोशिश की:

around new { 
    $self = $orig->(@_); 
    $self->CGI::Application::new(@_); 
} 

यह मैं

Can't call method "BUILDARGS" on unblessed reference at ...Moose/Object.pm line 21. 

मुझे लगता है देता है, तथापि, कि मैं पूरी तरह से गलत तरीके से इस बारे में जा रहा हूँ, और मूस है जो मैं चाहता हूं उसे प्राप्त करने के लिए एक बेहतर सुविधा है, जिसे मैंने अभी तक नहीं खोजा है।

उत्तर

9

क्या आपने पहले से ही Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent और MooseX::NonMoose देखा है?

अद्यतन: मैं मूस और मिश्रित तकनीकों से बहुत परिचित नहीं हूं। मैं MooseX::Declare और MooseX::NonMoose का उपयोग करके संकलन करने के लिए मॉड्यूल प्राप्त करने में सक्षम नहीं था।

आवेदन बेस कक्षा

package My::App; 

use Moose; 
use MooseX::NonMoose; 
extends 'CGI::Application'; 

sub setup { 
    my $self = shift; 
    $self->start_mode('main'); 

    $self->run_modes(
     map { $_ = $_->name; 
       /^rm_ (?<rm>.+) $/x ? ($+{rm} => $_) :() 
     } $self->meta->get_all_methods 
    ); 
} 

"My::App" 

व्युत्पन्न वर्ग

package My::Login; 
use Moose; 
extends 'My::App'; 

sub rm_main { 'it works!' } 

"My::Login" 

स्क्रिप्ट

#!/usr/bin/perl 

use strict; 
use warnings; 

# For testing on the command line 
use FindBin qw($Bin); 
use lib $Bin; 

use My::Login; 

my $app = My::Login->new; 

$app->run; 
: हालांकि, यहां कुछ काम करने के लिए लगता है कि है

आउटपुट

C:\Temp\f> t 
Content-Type: text/html; charset=ISO-8859-1 

it works! 
+2

धन्यवाद। मैं MooseX :: NonMoose को ठीक से काम करने में सक्षम नहीं था, लेकिन मैं अपनी बेस क्लास को कुकबुक से नुस्खा के साथ सीजीआई-ऐप से ठीक से प्राप्त करने में सक्षम था। – friedo

+1

@friedo मेरा जवाब स्वीकार करने के लिए धन्यवाद। मैं सोच रहा हूं कि 'MooseX :: Declare' को' MooseX :: NonMoose 'के साथ अच्छा खेलने के लिए एक तरीका होना चाहिए, लेकिन यह मैं इसे समझ नहीं पाया। –