English 中文(简体)
将角色组合成不工作的摩斯类
原标题:Composing Roles into a Moose class not working

阿罗哈!

我正忙于在一种叫作"可认证性"的摩斯类中定义我的角色, 基本上由任何可能在未来需要某种形式的认证的类别组成; 这是一个相当简单的角色, 这里的完整:

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

use Moose::Role;

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

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

1;

For whatever reason, when I attempt to compose it into a class using multiple different statements, i.e., with "Trello::API::Roles::Authable"; or with "Roles::Authable";

我总是收到相同的错误消息 : 您只能消耗角色, 角色 :: 可认证不是穆斯角色 。

知道为什么会发生这种事吗?

编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑 编辑

我查了穆斯的实际来源: 作用,

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

这似乎是出错发生的地方,所以,出于某种原因,我所扮演的角色似乎并不是说它是元阶级的角色。尽管我可能弄错了!任何帮助都会受到欢迎。

又一个方便的EDIT!

效益:规定例行作业的守则背景。

package Trello::API::Resource;

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


with  Roles::Authable ;

当我这样做的时候,它聪明地知道 尝试和消耗 角色/可允许的. 下午,但无论出于什么原因, 它只是没有发挥作用!

最佳回答

首先,我必须同意皮尔斯的观点, 技术上,你应该把它称为 与特雷洛::API: ROles:: 可认证

So, you re asking for something that I don t find to be implemented in basic Moose. I have used the ideas of generic namespace pools before. They are sort of universal namespaces to which you can offer your semi-anonymous services--without the lock-in of a fixed namespace. I refined my basic idea of the namespace pool with Moose (really MOP) support.

在珀尔的西部狂野的日子里 你只需要给另一个符号 分配一个藏品,就像这样:

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

这两个包都是一模一样的东西!

但是现在,我们用词典来保护我们的数据。因为类: MOP嫉妒地用词典来保护它的元物体, 你必须补充一些其他的东西:

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

现在它们和Perl和MOP完全一样了

Thus you can create packages that are simply a namespace repository for other packages -- Now with MOP support!

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 ;
...

并且知道它将会从角色的命名空间中获得。

问题回答

在我的情况中,我只是不小心给角色测试命名了,但我的系统上已经安装了一个模块,叫做测试,所以穆斯认为我想消耗这个模块,而不是我所创造的新的穆斯角色。一旦我被角色重新命名为“测试”它,它就运作顺利。





相关问题
Why does my chdir to a filehandle not work in Perl?

When I try a "chdir" with a filehandle as argument, "chdir" returns 0 and a pwd returns still the same directory. Should that be so? I tried this, because in the documentation to chdir I found: "...

How do I use GetOptions to get the default argument?

I ve read the doc for GetOptions but I can t seem to find what I need... (maybe I am blind) What I want to do is to parse command line like this myperlscript.pl -mode [sth] [inputfile] I can use ...

Object-Oriented Perl constructor syntax and named parameters

I m a little confused about what is going on in Perl constructors. I found these two examples perldoc perlbot. package Foo; #In Perl, the constructor is just a subroutine called new. sub new { #I ...

Where can I find object-oriented Perl tutorials? [closed]

A Google search yields a number of results - but which ones are the best? The Perl site appears to contain two - perlboot and perltoot. I m reading these now, but what else is out there? Note: I ve ...

热门标签