1

最初的主题是从这里开始的,但我需要一个工作代码示例,如何使用 Moo 或 Moose 正确委派属性。

根据文档,我编写了这段代码来检查:

package Cat;
use Moo;

has 'token' => ( is => 'rw', default => '12345' );
has 'tiger' => ( is => 'rw', default => sub { my $self = shift; Cat::Tiger->new(token => $self->token) }, handles => [ qw(token) ] );

package Cat::Tiger;
use Moo;
extends 'Cat';
# + some additional methods


package main;
use Data::Dumper;

my $cat = Cat->new(token=>'54321');
warn $cat->token;
warn $cat->tiger->token;

但是这段代码会产生错误:

您不能在 3.pl 第 5 行使用委托覆盖本地定义的方法(令牌)

如果我handles => [ qw(token) ]在第 5 行删除代码将返回另一个错误:

在 3.pl 第 5 行对子例程“Tiger::new”进行深度递归。

那么怎么办呢?

我需要将对象 () 的标记设置为与对象Cat::Tiger( $cat->tiger->token) 中相同的标记,并在每次对象标记更改时同步它们。Cat$cat-tokenCat

4

1 回答 1

2

好吧,通过将令牌移动到单独的类并为此类使用MooX::Singleton解决了问题:

package Credentials;
use Moo;
with 'MooX::Singleton';
has 'token' => ( is => 'rw', default => '12345' );

package Cat;
use Moo;
has 'credentials' => ( is => 'rw', default => sub { Credentials->instance }, handles => [qw(token)] );
has 'tiger' => ( is => 'rw', default => sub { Cat::Tiger->new(token => shift->token) } );

package Cat::Tiger;
use Moo;
has 'credentials' => ( is => 'rw', default => sub { Credentials->instance }, handles => [qw(token)] );


package main;
use Data::Dumper;
my $cat = Cat->new;
warn $cat->token;
warn $cat->tiger->token;
$cat->token('54321');
warn $cat->token;
warn $cat->tiger->token; # will be also 54321

如果有人知道更好的解决方案,欢迎您提出建议:)

于 2017-04-11T10:47:24.057 回答