2009-11-05 11 views
10

आप जानते हैं कि कैसे मूस स्वचालित रूप से आयात के दौरान strict और warnings चालू करता है? मैं अपने मूस वर्गों में autodie और use feature ':5.10' को चालू करके उस व्यवहार को विस्तारित करना चाहता हूं।मैं मूस के स्वचालित प्रगा निर्यात कैसे बढ़ा सकता हूं?

मैं नीचे ट्रैक करने के बाद जहां मूस इस करता है, Moose::Exporter, जो मूस कि strict->import और warnings->import बुला वर्ग के लिए कहता है के लिए एक कस्टम import उप असेंबल में।

हालांकि, मैं इस आयात विधि को मूस-आश रास्ते में विस्तारित करने का कोई तरीका नहीं समझ सकता।

मुझे इसे कैसे संभालना चाहिए?

http://www.friedo.com/bullwinkle.gif

उत्तर

2

चूंकि मॉड्यूल अपने कार्यों को use-नामस्थान में निर्यात कर सकता है, इसलिए आपको प्रत्येक वांछित लाइब्रेरी को लागू करने के लिए कुछ कोड खुदाई करने की आवश्यकता हो सकती है। जो आप पूछ रहे हैं वह मूस के लिए विशिष्ट नहीं है, इसलिए आप अपनी या अपनी कंपनी के अपने सर्वोत्तम अभ्यास मॉड्यूल लिख सकते हैं जो आपके साथ काम करने के लिए मानकों का एक समूह स्थापित करेगा, उदाहरण के लिए

use OurCompany::BestPractices::V1; 
साथ

package OurCompany::BestPractices::V1; 

use strict; 
use warnings; 
use feature (':5.10'); 
require Fatal; 
require Moose; 

# Required for straight implementation of autodie code 
our @ISA; 
push @ISA, qw(
    Fatal 
); 

sub import { 
    my $caller = caller; 
    strict->import; 
    warnings->import; 
    feature->import(':5.10'); 
    Moose->import ({into => $caller}); 

    #autodie implementation copied from autodie source 
    splice(@_,1,0,Fatal::LEXICAL_TAG); 
    goto &Fatal::import; 
} 

1; 

Autodie

बातें कुछ और जटिल है, क्योंकि यह() फोन करने वाले से उपयोग-एर के पैकेज की खोज पर निर्भर करता है और गोटो का उपयोग करता है, लेकिन आप एक बेहतर खोजने के लिए सक्षम हो सकता है अधिक परीक्षण के साथ रास्ता। जितना अधिक आप कार्यान्वित करेंगे, उतना ही जटिल यह पुस्तकालय हो सकता है, लेकिन यह आपके लिए एक या अधिक समाधान होने के लिए पर्याप्त मूल्य हो सकता है जिसका उपयोग आप या आपके कंपनी के कोड में कर सकते हैं।

+0

महान उदाहरण, धन्यवाद – friedo

+0

मैं इस विचार की एक भिन्नता का उपयोग कर समाप्त हुआ। – friedo

1

आप एक उप अपने पैकेज में आयात बुलाया परिभाषित है, और वहाँ सभी अन्य सामान आयात करने के लिए किया है।

आधुनिक :: पर्ल (एक और नीति मॉड्यूल अपने आप को देखो सकता है) से एक उदाहरण:

use 5.010_000; 

use strict; 
use warnings; 

use mro (); 
use feature(); 

sub import { 
    warnings->import(); 
    strict->import(); 
    feature->import(':5.10'); 
    mro::set_mro(scalar caller(), 'c3'); 
} 

अद्यतन: क्षमा करें, सवाल ध्यान से काफी पढ़ा नहीं था।

मौजूदा आयात विधि का विस्तार करने का एक अच्छा तरीका है अपने आप को एक नए पैकेज में लिखना, और वहां से मूस की आयात विधि को कॉल करना। आप इसे सबक्लासिंग करके कर सकते हैं, शायद आप इसके लिए मूस का भी उपयोग कर सकते हैं ;-)

5

मेरा दृष्टिकोण पीछे की समस्या को हल करता है।

ToolSet का उपयोग use कथनों का समूह बनाने के लिए क्यों करें जिसमें Moose, आपके अतिरिक्त pragmas के साथ?

# MagicMoose.pm 
package MagicMoose; 

use base 'ToolSet'; 

ToolSet->use_pragma(qw/feature :5.10/); # perl 5.10 
ToolSet->use_pragma(qw/autodie/); 

# define exports from other modules 
ToolSet->export(
    'Moose'   => undef,  # get the defaults 
); 

1; # modules must return true 

मैं इस परीक्षण नहीं किया:

कोड कुछ तरह दिखना चाहिए। वाकई, मुझे कुछ दिन पहले ToolSet मिला, और अभी तक इसे आजमाने का मौका नहीं मिला है। एफडब्ल्यूआईडब्ल्यू, समीक्षा सकारात्मक हैं।

+0

धन्यवाद किया जा सकता है। मैंने टूलसेट के बारे में नहीं सुना था; मैं अब इसकी जांच कर रहा हूं। – friedo

2

Moose::Exporter आपको एक चीनी कक्षा के लिए कस्टम import विधि परिभाषित करने की अनुमति देगा। MooseX::POE ने वर्षों के लिए इसका एक संस्करण उपयोग किया, लेकिन ऐसा लगता है कि मैं "हैकिश" फैशन पर विचार करता हूं।प्रलेखन Moose::Exporter के लिए निम्नलिखित मोटे तौर पर होना चाहिए आप के लिए

package Modern::Moose; 
use Moose(); 
use Moose::Exporter; 

my ($import) = Moose::Exporter->build_import_methods(
    also => 'Moose', 
    install => [qw(unimport init_meta)], 
); 

sub import { # borrowing from mortiz's answer for feature/mro 
    feature->import(':5.10'); 
    mro::set_mro(scalar caller(), 'c3');   
    goto &$import; 
} 

यह जो चाह रहे हैं को देखते हुए तो जैसे सुझाव के लिए इतना

package MyApp; 
use Modern::Moose; 

has greeting => (is => 'ro', default => 'Hello'); 
sub run { say $_[0]->greeting } # 5.10 is enabled 
+0

धन्यवाद! मैं इसे बाद में एक शॉट दूंगा और देख सकता हूं कि मैं इसका एहसास कर सकता हूं या नहीं। – friedo

संबंधित मुद्दे