- 我有角色(會有多個這樣的角色)
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方法。我參考了
- https://metacpan.org/pod/Moose::Meta::Role
- https://metacpan.org/pod/Moose::Util::MetaRole
- https://metacpan.org/pod/Moose::Cookbook::Extending::Mooseish_MooseSugar
注意:- 我無法創建呼叫者的物件,因為它有一些必需的物體(我相信可能不需要 * 物件來注入角色)
但不幸的是,我無法找出正確的方法,我相信一定有一種簡單的方法可以做到這一點,但我錯過了。一旦我開發了多個角色,我也想在未來為多個角色做類似的事情。
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;
我非常感謝您能提供的任何幫助。
uj5u.com熱心網友回復:
一般來說,呼叫者應該選擇匯入你的角色。他們使用with關鍵字執行此操作:
package MyApp::SomeClass;
use MyApp::Moose;
with 'Validation';
...;
但是,如果您確實希望自動將您的角色應用于$caller,這很容易:
use Moose::Util ();
Moose::Util::ensure_all_roles( $caller, 'Validation' );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/493826.html
