perl - 修饰符在服务对象下不可见

标签 perl moo bread-board

鉴于以下情况:

  • 哞 2.001001;
  • 面包::董事会 0.34;
  • 一个 Bread::Board 容器
  • 基类 Foo 具有属性 straround 修饰符 str
  • 子类 Bar 扩展 Foo

问题:

  • [好] 当从普通 Bar 实例化对象时,执行 Foo::str 修饰符;
  • [错误] 当从容器服务为 Bar 实例化对象时,未执行 Foo::str 修饰符;
  • [WORSE] 在 [BAD] 发生后,从普通 Bar 实例化也不再有效;

代码示例:

#!/usr/qlc/apps/common/perl_5.18.2/bin/perl -w

package Foo;

use Moo;

has str => ( is => 'rw', default => '' );

sub BUILD {
    my ($self, $args) = @_;

    $self->str($self->str);
}

around str => sub {
    my ($orig, $self, $val) = @_;

    return $self->$orig unless defined $val;

    $self->$orig('prefix_'.$val);
};
# end of Foo



package Bar;

use Moo;

extends 'Foo';
# end of Bar



package main;

use 5.010;
use strictures 2;

use Bread::Board;

my $c = container 'MyApp' => as {
    service 'foo' => ( class => 'Foo', parameters => { str => { optional => 1 } } );
    service 'bar' => ( class => 'Bar', parameters => { str => { optional => 1 } } );
};


my $foo_plain = Foo->new({ str => 'foo_plain' });
say "foo_plain = ".$foo_plain->str;

my $foo_bb = $c->resolve( service => 'foo', parameters => { str => 'foo_bb' } );
say "foo_bb = ".$foo_bb->str;

$foo_bb->str('foo_bb_setter');
say "foo_bb_setter = ".$foo_bb->str;

my $foo_plain_after_bb = Foo->new({ str => 'foo_plain_after_bb' });
say "foo_plain_after_bb = ".$foo_plain_after_bb->str;


my $bar_plain = Bar->new({ str => 'bar_plain' });
say "bar_plain = ".$bar_plain->str;

my $bar_bb = $c->resolve( service => 'bar', parameters => { str => 'bar_bb' } );
say "bar_bb = ".$bar_bb->str;

$bar_bb->str('bar_bb_setter');
say "bar_bb_setter = ".$bar_bb->str;

my $bar_plain_after_bb = Bar->new({ str => 'bar_plain_after_bb' });
say "bar_plain_after_bb = ".$bar_plain_after_bb->str;


die;

输出:

foo_plain = prefix_foo_plain
foo_bb = prefix_foo_bb
foo_bb_setter = prefix_foo_bb_setter
foo_plain_after_bb = prefix_foo_plain_after_bb
bar_plain = prefix_bar_plain
bar_bb = bar_bb
bar_bb_setter = bar_bb_setter
bar_plain_after_bb = bar_plain_after_bb

请注意输出 bar_bbbar_bb_setterbar_plain_after_bb 不包含 prefix_ 字符串。

为什么?

最佳答案

这是 Bread::Board 中的一个错误。

修复于 this commit .

谢谢 @Yanick .

关于perl - 修饰符在服务对象下不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335137/

相关文章:

javascript - 用于编程的 Vim 折叠配置

perl - 驼鹿:属性值更改时过期的缓存计算结果到期吗?

java - 从 Perl 或 Python 解析 Java 类

perl - 使用 Sub::Quote 弱化捕获

perl - 在 Moose 中,如果一个角色定义了一个具有默认值的属性,我如何在我的消费类中更改该默认值?

perl - 为什么我的 Moo 对象继承自非 Moo 类的某些模块被祝福到父包中?

perl - Bread::Board - 注入(inject)带有 ArrayRef 类型约束的参数?

multithreading - 在 Perl 中跨线程共享文件数据的巧妙方法