首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用发布的Moo API动态修改Moo中的方法

使用发布的Moo API动态修改Moo中的方法
EN

Stack Overflow用户
提问于 2019-01-28 02:58:17
回答 1查看 118关注 0票数 3

我试图坚持使用已发布的应用程序接口来动态修改Moo中的方法,但还没有想出一个通用的解决方案。

首先,有一些代码:

代码语言:javascript
复制
package R1 {
    use Moo::Role;
    sub r1 { say __PACKAGE__ }
}

package C1 {
    use Moo;
    sub c1 { say __PACKAGE__ }
}

use Scalar::Util qw[ blessed ];
use Moo::Role ();

my $c = C1->new;
Moo::Role->apply_roles_to_object( $c, 'R1' );

角色应用程序将在一种方法中演示失败。

我尝试了两种方法。

第一个使用Class::Method::Modifiers

代码语言:javascript
复制
use Class::Method::Modifiers qw[ install_modifier ];
install_modifier( blessed( $c ), 
                  before => r1 =>
                  sub { say "BEFORE r1" }
                );
$c->r1;

并且运行良好:

代码语言:javascript
复制
% perl test.pl
BEFORE r1
R1

Moo的内部_install_modifier子例程的代码非常相似,但也执行额外的特定于Moo的操作,因此这种方法并不完全等效。

我尝试的下一种方法是直接使用$c可用的before修饰符,从而获得额外的Moo特殊调料:

代码语言:javascript
复制
$c->can('before')->( r1 => sub { say "BEFORE r1" } );
$c->r1;

但是..。

代码语言:javascript
复制
% perl test.pl
The method 'r1' is not found in the inheritance hierarchy for class C1 at [...]/lib/site_perl/5.28.0/Class/Method/Modifiers.pm line 42.
        Class::Method::Modifiers::install_modifier("C1", "before", "r1") called at /[...]/lib/site_perl/5.28.0/Moo/_Utils.pm line 44
        Moo::_Utils::_install_modifier("C1", "before", "r1", CODE(0x5590bb800360)) called at [...]/lib/site_perl/5.28.0/Moo.pm line 84
        Moo::before("r1", CODE(0x5590bb800360)) called at test.pl line 25

修饰符似乎是为原始的C1类生成的,并且在应用R1角色时没有更新。下面这个惊人的黑客“修复”了这个问题:

代码语言:javascript
复制
use Import::Into;
Moo->import::into( blessed $c );

$c->can('before')->( r1 => sub { say "BEFORE r1" } );
$c->r1;

这会导致:

代码语言:javascript
复制
% perl test.pl
BEFORE r1
R1

那么,有没有办法只使用发布的Moo应用程序接口来实现我的目标呢?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-01-29 03:27:15

你可以通过应用另一个角色来修改方法(它甚至不需要是Moo::Role,除非你在处理属性):

代码语言:javascript
复制
use Role::Tiny;
before r1 => sub { say "BEFORE r1" };

只需确保在组成r1方法的角色之后应用此角色,或者在角色中包含一个虚拟sub r1 {} (如果已经存在,它将被忽略)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54391782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档