gpt4 book ai didi

perl - 如何将 Moose 方法修饰符应用于基于方法属性的方法?

转载 作者:行者123 更新时间:2023-12-05 01:07:30 28 4
gpt4 key购买 nike

我想将 Moose 'before' 方法修饰符应用于我类(class)中的许多方法。我想在角色中提供修饰符方法。我可以这样做:

package MyApp::Role;

use Moose::Role

before [qw(foo bar)] => sub {
...
};

package MyApp;

use Moose;
with (MyApp::Role);

sub foo { ... }

sub bar { ... }

sub baz { ... } # this method is unaffected

然而,必须维护角色中相关方法的列表将其与消费类联系起来,这似乎是错误的。我想用更聪明的方式来做,比如使用方法属性:
package MyApp;

use Moose;
with (MyApp::Role);

sub foo :SomeFlag { ... }

sub bar :SomeFlag { ... }

sub baz { ... } # this method is unaffected

我不熟悉如何识别方法属性或如何将方法修饰符动态应用于它们。

或者,也许有更好的方法来做到这一点?

最佳答案

让我们使用 Attribute::Handlers为此 - 使用属性的一种相当理智的方式。我们必须在基类中定义一个函数,它本身具有属性 :ATTR(CODE) .这需要一些参数:

  • sub(或其他变量)来自的包。
  • globref 或字符串 ANON .
  • 对值的引用(此处:coderef)。
  • 属性的名称。
  • 属性的可选数据。
  • 调用属性的(编译)阶段。
  • 声明 sub 的文件名。
  • 声明 sub 的行号。

  • 所以我们可以做的是编写一个处理程序来应用 before :
    use strict; use warnings; use feature 'say';

    BEGIN {
    package MyRole;
    use Moose::Role;
    use Attribute::Handlers;

    sub SomeFlag :ATTR(CODE) {
    my ($package, $globref, $code, $attr, $data, $phase, $filename, $line) = @_;

    ref($globref) eq 'GLOB'
    or die "Only global subroutines can be decorated with :SomeFlag"
    . " at $filename line $line.\n";

    # use the MOP to install the method modifier
    $package->meta->add_before_method_modifier(
    *$globref{NAME} => sub {
    warn "Just about to call a flagged sub!";
    },
    );
    }
    }

    BEGIN {
    package MyApp;
    use Moose;
    # important: SomeFlag must be available before the attrs are handled (CHECK phase)
    BEGIN { with 'MyRole' };

    sub foo :SomeFlag { say "Hi from foo sub!" }
    sub bar :SomeFlag { say "Hi from bar sub!" }
    sub baz { say "Hi from baz sub!" }
    }

    package main;

    my $o = MyApp->new;
    $o->$_ for qw/foo bar baz/;

    我把所有这些都塞进了一个文件中,但这显然不是必需的(只需添加所需的 use s)。

    输出:

    Just about to call a flagged sub! at so.pl line 16.
    Hi from foo sub!
    Just about to call a flagged sub! at so.pl line 16.
    Hi from bar sub!
    Hi from baz sub!

    关于perl - 如何将 Moose 方法修饰符应用于基于方法属性的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18528461/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com