2010-10-31 16 views
5

मेरे पास Moose::Role है कि कक्षा में कुछ भूमिका निभाने पर कक्षा में कुछ अतिरिक्त सबस्क कॉल करना चाहूंगा।मूस :: भूमिका - भूमिका के आवेदन को बढ़ाने का आसान तरीका?

क्या Moose::Meta::Role टाइपिंग कोडिंग में बहुत अधिक खोदने के बिना, भूमिका लागू होने पर क्या होता है, इसे संशोधित करने का कोई आसान तरीका है? आदर्श रूप से, मैं अतिरिक्त सामान जोड़ने के लिए बस after 'apply' => ... करना चाहता हूं।

संपादित करें:

मैं विशेष रूप से एक घटक है कि यह भी निर्माता को संशोधित करता है की तरह कुछ बनाने के लिए एक DBIx::Class::Core परिणाम परिभाषा के साथ इस का उपयोग कर रहा हूँ। अगर मैं परिणाम के लिए BUILDARGS और BUILD सबस्क पर प्राप्त कर सकता हूं, तो मैं इसे एक घटक के रूप में लिखूंगा, लेकिन ऐसा नहीं लगता है। तो, load_component करने के बजाय, मैं with 'role' कर रहा हूं, लेकिन घटक के कुछ प्रभाव कक्षा में belongs_to संबंध जोड़ना है। इसलिए, मैं कक्षा में भूमिका के आवेदन के दौरान ऐसा करने का सबसे अच्छा तरीका सोच रहा था।

+1

आप में थोड़ा और अधिक स्पष्ट कर सकते हैं आप क्या करना चाहते हैं? आप अपने hypothetical 'बाद' लागू 'उप में क्या डाल देंगे? एमओपी के साथ इस तरह के झुकाव सामान्य रूप से नहीं किया जाता है, इसलिए आप जो करना चाहते हैं उसे पूरा करने का लगभग एक आसान तरीका है। – Ether

+0

@ अन्य: निश्चित रूप से, थोड़ा और स्पष्टीकरण में संपादित किया गया। – Carl

+0

क्या आपने अपनी भूमिका में 'BUILD => उप {...} 'के बाद प्रयास किया है? – Ether

उत्तर

0

मैं क्या पाया गया कि, काम करता है कॉम्पैक्ट है, और मेरी विशेष भूमिका के द्वारा प्रयोग किया मेटा भूमिका संशोधित करने के लिए एक विशेषता का उपयोग करने के डॉक्स में इरादे के साथ ध्यान में रखते हुए लगता है:

package DBIx::Class::Meta::Role::MyRole; 
use Moose; 
BEGIN { extends 'Moose::Meta::Role'; } 
after 'apply' => sub { 
## ..my mods to add extra relationships to DBIx::Class::Core result 
}; 
no Moose; 

package DBIx::Class::MyRole; 
use Moose::Role -metaclass => 'DBIx::Class::Meta::Role::MyRole'; 
1

आप parameterized role का उपयोग कर सकते हैं। tutorial में उपभोग करने वाले वर्ग तक पहुंचने के तरीके पर एक उदाहरण दिया गया है। ऐसा कहा जा रहा है कि, मैं आपको इस संबंध में सर्वोत्तम प्रथाओं की तलाश करने के लिए मूस और डीबीआईएक्स-क्लास आईआरसी चैनलों या मेलिंग सूचियों में शामिल होने की सलाह दूंगा।

4

संक्षेप में रहने वाली टिप्पणी में मैंने आपको this question पर संदर्भित किया, जिसमें चर्चा की जाती है कि कक्षा के मेटाक्लास को कैसे उपयोग किया जा रहा है, इस पर भूमिका निभाई जा रही है (उदाहरण के लिए आप सशर्त रूप से कक्षा में निर्माण कर सकते हैं)। हालांकि, यह मूसएक्स का एक वास्तव में बदबूदार उपयोग है :: भूमिका :: पैरामीटरेटेड आपको वह जानकारी प्रदान करता है, और यह भी काम नहीं करेगा अगर भूमिका किसी अन्य भूमिका पर लागू की जा रही है, न कि कक्षा में।

एक विकल्प के रूप में, आप एक चीनी समारोह जो मेटा जानकारी प्राप्त करता है लिख सकता है, और है कि रास्ते में वर्ग पर निर्माण:

sub foo 
{ 
    my ($meta, %options) = @_; 

    # based on what is present in %options, add additional attributes... 
    $meta->add_attribute(...); 
} 

चीनी कार्यों लेखन का एक उदाहरण के लिए Moose::Cookbook::Extending::Recipe4 देखें।

+0

मूस :: मेटा :: रोल को संशोधित करने के लिए लक्षणों का उपयोग करने के बारे में आप क्या सोचते हैं? यह मेटा भूमिका में सरल संशोधन करने के तरीके के रूप में दस्तावेज़ों में वर्णित है। – Carl

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