如何使用鼠标委托数组的第一个元素?

时间:2011-11-03 02:55:06

标签: perl delegates mouse moose

我有一个包含一堆对象的对象。该对象表示当前状态,并且堆栈中的每个对象都将状态保持在特定的嵌套级别。

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

1 个答案:

答案 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();