Perl类的属性组成?

前端之家收集整理的这篇文章主要介绍了Perl类的属性组成?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有多个角色,每个角色定义一组项目:

package A;
use Moose::Role;
sub items () { qw/apple orange/ }

package B;
use Moose::Role;
with 'A';
sub items () { qw/watermelon/ }

package C;
use Moose::Role;
sub items () { qw/banana/ }

假设我在另一个类中使用它们,我想收集所有这些项目:

package Foo;
use Moose;
with qw(B C);

sub do_something {
    my $self = shift;
    my @items = ???;   # How can I get apple,orange,watermelon,banana here?
    ....
}

一种可能的解决方案是采用MooseX::ComposedBehavior,但它的POD说(当然在撰写本文时)它的API“不太稳定”,而且“当前的实现是一种破解,应该被更多的东西取代健壮的“.因此,我正在调查这是否可以在不依赖于这种“黑客”的情况下完成.

警告:如果您将来阅读此内容,请查看MooseX::ComposedBehavior的POD(当前版本:0.003),因为它可能在平均时间内发生了变化.事情变化很快. CPAN作者发布了新版本.目前“不太稳定”的东西可能在未来变得更加稳定.甚至可能还有其他模块.自行检查.

理想情况下应该有类似的东西:我的@items = map $_-> items,@ISA;
然而,这对Moose不起作用.有没有更好,更可靠的解决方案?

更新:我最终得到了这个三线解决方案:

package A;
use Moose::Role;
sub items () { qw/apple orange/ }

package B;
use Moose::Role;
with 'A';
sub items () { qw/watermelon/ }

package C;
use Moose::Role;
sub items () { qw/banana/ }

package Foo;
use Moose;
with qw(B C);
sub items () {}

sub do_something {
    my $self = shift;

    my @items = map $_->execute,grep $_,map $_->get_method('items'),$self->Meta->calculate_all_roles_with_inheritance;

    ...
}

更新:由于不同的人在#moose IRC channel中请求我,我删除了我之前的断言,即MooseX :: ComposedBehavior“不稳定”并将其替换为从其POD中获取文字.

更新:我写了一个MooseX::Collect模块,它允许以下语法:

package Foo;
use Moose;
use MooseX::Collect;

collect 'items';
with qw(B C);

sub do_something {
    my $self = shift;
    my @items = $self->items;
    ...
}

解决方法

你需要使用:

package A;
use Moose::Role;
requires 'items';
around items => sub {
    my ($orig,$self,@args) = @_;
    return ($self->$orig(@args),qw/apple orange/);
};

package B;
use Moose::Role;
requires 'items';
with 'A'; # not required,do it if you want it
around items => sub {
    my ($orig,qw/watermelon/);
};

package C;
use Moose::Role;
requires 'items';
around items => sub {
    my ($orig,qw/banana/);
};

package Class;
use Moose;
with qw/B C/;
sub items {}

但一般来说,使用类来表示数据是错误的,那就是这样类的实例是为.很难提供进一步的建议,因为你的例子如此繁琐.你真的想做什么?

猜你在找的Perl相关文章