2012-05-24 15 views
5

अलोहा काम नहीं कर रही है!एक मूस वर्ग में भूमिका निभाने की भूमिका

मेरी एक भूमिका है कि मैं एक मूस क्लास में परिभाषित व्यस्त हूं जिसे एथेबल कहा जाता है जिसे अनिवार्य रूप से किसी भी वर्ग में बनाया गया है जिसे संभावित रूप से भविष्य में कुछ प्रमाणीकरण की आवश्यकता हो सकती है; ,,

package Trello::API::Roles::Authable; 

use Moose::Role; 

#authentication information 
has key => (
    is => "rw", 
    isa => "Str", 
); 

has token => (
    is => "rw", 
    isa => "Str", 
); 

1; 

जो भी कारण जब मैं कई अलग अलग बयानों का उपयोग कर एक वर्ग में यह रचना के लिए प्रयास करते हैं, यानी "Trello :: एपीआई :: भूमिकाओं के साथ :: लेखन-योग्य: यह एक नहीं बल्कि साधारण भूमिका है, यहाँ संपूर्णता "; या "भूमिकाएं :: लेखक" के साथ;

मैं लगातार यह एक ही त्रुटि संदेश मिलता है: You can only consume roles, Roles::Authable is not a Moose role.

किसी भी विचार क्यों यह हो रहा जा सकता है?

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

बस एक ओर ध्यान दें, मैं मूस :: भूमिका के लिए वास्तविक स्रोत की जाँच की है, और इस बिट देखा:

unless ($meta && $meta->isa('Moose::Meta::Role')) { 
     require Moose; 
     Moose->throw_error("You can only consume roles, " 
       . $role->[0] 
       . " is not a Moose role"); 
    } 

यह जहां त्रुटि उत्पन्न कर रहा है हो रहा है, तो यह लगभग लगता है कि किसी कारण से , जिस भूमिका को मैं कार्यान्वित कर रहा हूं वह यह नहीं बता रहा है कि यह मेटाक्लास में एक भूमिका है। हालांकि मैं गलत हो सकता था! किसी भी सहायता की सराहना की जाएगी।

एक और सुविधाजनक संपादन!

बोनस: कोड संदर्भ जिसमें नियमित रूप से कॉल किया जाता है।

package Trello::API::Resource; 

use Moose; 
use URI::Escape; 
use LWP::UserAgent; 


with 'Roles::Authable'; 

जो जब मैं यह कर, यह समझदारी से कोशिश करते हैं और भूमिकाओं का उपभोग करने के जानता है/Authable.pm लेकिन जो भी कारण के लिए, यह सिर्फ कार्य करने के लिए विफल रहता है!

+1

"एकाधिक अलग-अलग बयान" से आपका क्या मतलब है? क्या आप 'ट्रेलो :: एपीआई :: भूमिकाएं :: लेखक' या 'भूमिकाओं के साथ' कर रहे हैं :: लेखक '; '? क्योंकि आप बाद के नाम के साथ कोई भूमिका नहीं दिखते हैं। – friedo

+0

[क्या आप 'मूस' या 'कोई :: मूस' का उपयोग कर रहे हैं?] (Http://blogs.perl.org/users/sawyer_x/2012/05/priorities-when-using-anymoose-and-what-mouse- लोग-चाहिए-do.html) –

+0

मेरा मतलब है कि मैंने कई अलग-अलग बदलावों की कोशिश की है; इस बिंदु पर, भूमिका का उपभोग करने की कोशिश करने वाली फ़ाइल ट्रेलो :: एपीआई :: संसाधन है, इसलिए यह भूमिकाओं को पहचानने लगता है :: ट्रेलो :: एपीआई :: भूमिकाएं :: लेखक के रूप में योग्य, और उस मॉड्यूल का उपभोग करने का प्रयास। इस बिंदु पर, यह पहचानने वाला नहीं है कि मॉड्यूल कहां हैं क्योंकि मैंने उन्हें वास्तविक मॉड्यूल निर्देशिका strucutre में नहीं रखा है; मैं हमेशा @INC को संशोधित कर सकता हूं लेकिन इस बिंदु पर मैं सिर्फ उत्सुक हूं कि इस तरह की भूमिका का उपभोग क्यों नहीं किया जा सकता है। – ozzmotik

उत्तर

1

सबसे पहले, मुझे पियर्स के साथ सहमत होना है कि तकनीकी रूप से, आपको वास्तव में इसे with 'Trello::API::Roles::Authable' के रूप में कॉल करना चाहिए।

तो, आप कुछ ऐसा मांग रहे हैं जो मुझे मूल मूस में लागू नहीं किया जा रहा है। मैंने पहले जेनेरिक नेमस्पेस पूल के विचारों का उपयोग किया है। वे सार्वभौमिक नामस्थानों के प्रकार हैं जिनके लिए आप अपने अर्ध-अज्ञात सेवाओं की पेशकश कर सकते हैं - एक निश्चित नामस्थान के लॉक-इन के बिना। मैंने मूस के साथ नामस्थान पूल के अपने मूल विचार को परिष्कृत किया (वास्तव में MOP) समर्थन।

पर्ल की वाइल्ड वेस्ट दिनों में, तुम सब करने के लिए होता है, दूसरे के लिए प्रतीक करने के लिए एक गुप्त कोष आवंटित तो की तरह है:

{ no strict 'refs'; 
    *{$short_pkg_name.'::'} = \*{$full_pkg_name.'::'}; 
}; 

और, उन दो संकुल बिल्कुल वैसा ही बातें कर रहे थे!

लेकिन अब, हम अपने डेटा को लेक्सिकल के साथ थोड़ा और अधिक सुरक्षित रखते हैं।

Class::MOP::store_metaclass_by_name( 
     $short_pkg_name 
    , Class::MOP::get_metaclass_by_name($full_pkg_name) 
    ); 

अब वे पर्ल के लिए और मंत्रालय में सटीक एक ही बात कर रहे हैं: और क्योंकि क्लास :: एमओपी चौकसी के साथ एक शाब्दिक हैश में अपनी मेटा वस्तुओं की रक्षा करता है, तो आप कुछ और जोड़ने के लिए।

इस प्रकार आप ऐसे पैकेज बना सकते हैं जो अन्य पैकेजों के लिए केवल नामस्थान भंडार हैं - अब MOP समर्थन के साथ!

package Namespace::Pool; 
use strict; 
use warnings; 
use Params::Util qw<_POSINT>; 

sub import { 
    shift; # It's just me. 
    my $full_pkg_name = caller(); 
    Carp::croak("'$full_pkg_name' is short enough!") 
     unless my $pool_name 
      = shift // [ split /::/, $full_pkg_name ]->[-2] 
      ; 
    Carp::croak("'::$pool_name\::' not found in '$full_pkg_name'") 
     unless ( _POSINT(my $pos = rindex($full_pkg_name, "::$pool_name\::")) 
       or my $is_short = _POSINT(index($pool_name, '::')) 
       ); 
    my $short_pkg_name 
     = $is_short ? $poll_name 
     :    substr($full_pkg_name, $pos + 2) 
     ; 
    { no strict 'refs'; 
     if (%{$short_pkg_name.'::'}) { 
      Carp::croak("You have already defined $short_pkg_name!"); 
     } 
     *{$short_pkg_name.'::'} = \*{$full_pkg_name.'::'}; 
    }; 

    if (my $meta = Class::MOP::get_metaclass_by_name($full_pkg_name)) { 
     Class::MOP::store_metaclass_by_name($short_pkg_name, $meta); 
    } 
    return; 
} 

इस प्रकार अपनी भूमिका पैकेज में आप निम्न कर सकते हैं:

package Trello::API::Roles::Authable; 
use strict; 
use warnings; 
use Moose::Role; 
use Namespace::Pool 'Roles'; 
... 

और पता है कि यह 'भूमिका' की नाम स्थान से उपलब्ध हो जाएगा।

+0

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

0

मेरे मामले में मैं बस गलती से अपनी भूमिका 'टेस्ट' नामित करता था, लेकिन 'टेस्ट' नामक मेरे सिस्टम पर पहले से ही एक स्थापित मॉड्यूल था और इसलिए मूस ने सोचा कि मैं उस नए मॉडस की भूमिका के बजाय उस मॉड्यूल का उपभोग करना चाहता हूं। डी बनाया गया। एक बार जब मैंने 'टेस्टेबल' में भूमिका से नाम बदल दिया तो यह सब ठीक काम किया।

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

  • कोई संबंधित समस्या नहीं^_^