代码之家  ›  专栏  ›  技术社区  ›  rjh

为什么带有方法修饰符的Moose角色应用程序不能在我的代码中工作?

  •  3
  • rjh  · 技术社区  · 16 年前

    package Blah;
    use Moose::Role;
    
    use Blah::A;
    use Blah::B;
    (etc...)
    
    requires '...';
    requires 'foo';
    around 'foo' => sub { ... }
    

    package Blah::A;
    use Moose;
    with 'Blah';
    
    sub foo { ... }
    
    __PACKAGE__->meta->make_immutable;
    

    问题是:Moose没有将方法修饰符应用于任何Blah::*类。即使我删除了类的make\u immutable调用,也会发生这种情况。我认为角色应用程序完全是在运行时完成的,所以即使Blah::*类是在Blah之前加载的,修饰符仍然应该应用吗?

    我在找一个解决办法,或者一个替代的方法。目前Blah基本上是一个抽象的基类,除了方法修饰符,这就是为什么我首先使用角色-但是类层次结构可能更好?提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  4
  •   Ether    16 年前

    你的通话顺序有点奇怪——为什么 use

    我建议把这些拿出来 使用 使用 各处的行杂乱无章,您可以将它们移入Includes文件。

    但不,作为对你假设的回答——角色申请是 在运行时完成,但在 with 遇到行。如果你 在编译时创建一个模块,然后立即编译该文件 具有 Moose::Util

        2
  •  -1
  •   Evan Carroll    16 年前

    我认为您只是误解了文件包含和角色组合之间的区别。

    在引擎盖下面, use 语句只是调用 require import() BEGIN {}

    它不会将函数作为类::MOP(CMOP)的元类方法安装。我不确定声明的方法和导入的方法之间有什么区别,也不确定CMOP如何说明区别,但这只是因为调用 add_method . 我想从irc.perl.org/#moose获得更多信息,但我被禁止了。希望这个例子能告诉你你需要什么,或者给你更多的信息来制定一个更好的问题。

    package Class;
    use Moose;
    use Carp qw(carp);
    
    ### You have to add the method onto the class.
    Class->meta->add_method( 'carp' => \&carp );
    
    around 'carp' => sub { warn "this won't trigger" };
    
    package main;
    
    my $c = Class->new;
    $c->carp('foo');
    

    如果可能的话,我会重写你的那些文件包 使用 进入对驼鹿友好的角色,然后让当前角色使用 with