我有一个包含一堆对象的对象。该对象表示当前状态,并且堆栈中的每个对象都将状态保持在特定的嵌套级别。
package State;
use Mouse;
use RealState;
has state_stack => {
is => 'rw',
isa => 'ArrayRef[RealState]',
default => sub {
return [RealState->new]
}
};
我希望State委托给State->state_stack->[0]
。我怎样才能有效地使用鼠标(所以没有元黑客攻击)。我不能使用Moose,my project不能有任何依赖(我正在捆绑Mouse :: Tiny)。
“你不能”很好,我会写一个AUTOLOAD
。
答案 0 :(得分:3)
你不能直接,但有一个比AUTOLOAD更好的黑客。也就是说,RealState-> meta-> get_all_method_names()为您提供在RealState中定义的方法名称。
#!perl
use 5.14.0;
package RealState {
use Mouse;
sub foo { 'foo' }
__PACKAGE__->meta->make_immutable;
}
package State {
use Mouse;
has stack => (
is => 'rw',
isa => 'ArrayRef',
default => sub { [ RealState->new ] },
);
# define delegates for stack->[0]
my $meta = __PACKAGE__->meta;
foreach my $name(RealState->meta->get_all_method_names) {
next if Mouse::Object->can($name); # avoid 'new', 'DESTROY', etc.
# say "delegate $name";
$meta->add_method($name => sub {
my $self = shift;
$self->stack->[0]->$name(@_);
});
}
$meta->make_immutable;
}
my $state = State->new();
say $state->foo();