2015-02-20 2 views
1

Я хочу, чтобы атрибут объявлялся в роли, и его значение должно делиться между всеми экземплярами классов, которые используют роль.Moose: Share атрибут в роли

Я написал это, но я не думаю, что это лучший способ сделать это:

package RealRessource; 
use Moose; 
use MooseX::ClassAttribute; 
class_has '_real_ressource' => (is => 'ro', isa => 'Int', lazy => 1, 
           builder => '_build_real_ressource'); 

sub _build_real_ressource { 
    print "_build_real_ressource\n"; 
    return int(rand(100)); 
} 
__PACKAGE__->meta->make_immutable; 

package ShareRessource; 
use Moose::Role; 
has 'ressource' => (is => 'ro', isa => 'Int', lazy => 1, 
        builder => '_build_ressource'); 

sub _build_ressource { 
    print "Build New Ressource\n"; 
    my $real_ressource = new RealRessource(); 
    return $real_ressource->_real_ressource; 
} 

package A; 
use Moose; 

with 'ShareRessource'; 

__PACKAGE__->meta->make_immutable; 

package B; 
use Moose; 

with 'ShareRessource'; 

__PACKAGE__->meta->make_immutable; 

package main; 
use A; 
use B; 

my $a = new A(); 
my $b = new B(); 
print $a->ressource,$/; 
print $b->ressource,$/; 

Результат:

Build New Ressource 
_build_real_ressource 
28 
Build New Ressource 
28 

ответ

0

Это решение покончила с дополнительным классом RealResource. Роль была преобразована в класс, чтобы он мог делиться атрибутом класса. Использование MooseX::ABC является необязательным, но я поставил его там, чтобы убедиться, что он не может быть создан.

package ShareResource; 
use Moose; 
use MooseX::ABC; 
use MooseX::ClassAttribute; 
class_has 'resource' => (
    is  => 'ro', 
    isa  => 'Int', 
    lazy => 1, 
    builder => '_build_resource', 
); 
sub _build_resource { 
    print "_build_resource\n"; 
    return int(rand(100)); 
} 
__PACKAGE__->meta->make_immutable; 

package A; 
use Moose; 
extends 'ShareResource'; 
__PACKAGE__->meta->make_immutable; 

package B; 
use Moose; 
extends 'ShareResource'; 
__PACKAGE__->meta->make_immutable; 

package main; 
use A; 
use B; 

my $a = A->new(); 
my $b = B->new(); 
print $a->resource,$/; 
print $b->resource,$/; 
Смежные вопросы