perl 如何将角色注入调用者模块?

nwlqm0z1  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(178)
  • 我有角色(将有多个此类角色)
package Validation;
use Moose::Role;

sub check_entity {
    my ( $self, $db_id ) = @_;
    #some logic
    my $found_db = sub {
        #logic verify id present in db
        return 1;
    }
    return $found_db; 
}

我有一个模块,可以帮助我使用下面的package MyApp::Moose;编写干净的模块。我尝试了很多搜索,但不确定如何将上述角色注入调用方(以便它被使用),调用方可以访问check_entity方法。我引用了

注意:-我不能创建调用者的对象,因为它有一些必需的实体(* 对象可能不需要注入角色,我相信)
但不幸的是,我不能找到正确的方法,我相信一定有一个简单的方法来做这件事,我错过了。也希望做类似的多个角色,在未来一旦我开发他们。

package MyApp::Moose;

use strict;
use warnings;
use namespace::autoclean;
use Hook::AfterRuntime;
use Import::Into;
use Moose ();
use Clone 'clone';

sub import {
    my ($class, @opts) = @_;
    my $caller = caller;
    my %opt = map { $_ => 1 } @opts;
    strict->import::into($caller);

    warnings->import();
    Clone->import::into($caller,'clone');

    if($opt{role}) {
      require Moose::Role;
      Moose::Role->import({into=>$caller});
    } else {
      Moose->import({into=>$caller});
      after_runtime {
          $caller->meta->make_immutable();
      };
    }

    namespace::autoclean->import(
        -cleanee => $caller,
    );

    return;
}

1;
  • 目前正在使用上面的代码,如下所示。
package MyApp::Process;

use MyApp::Moose;

sub some_method {
    my ($self, $db_id) = @_;

    # I want to call like this
    $self->check_entity($db_id) || return;

}

1;
rxztt3cl

rxztt3cl1#

一般来说,调用者应该 * 选择 * 来导入你的角色,他们使用with关键字来完成这个任务:

package MyApp::SomeClass;

use MyApp::Moose;
with 'Validation';

...;

但是,如果您确实希望自动将您的角色应用到$caller,这非常简单:

use Moose::Util ();
Moose::Util::ensure_all_roles( $caller, 'Validation' );

相关问题