Атрибут класса Moose, действующий как Class :: Data :: Inheritable - PullRequest
5 голосов
/ 05 марта 2012

У меня есть атрибут класса в классе Moose, но я бы хотел, чтобы он работал как Class :: Data :: Inheritable в терминах подкласса, переопределяющего значение родителя. Таким образом, подкласс наследует значение родительского элемента до тех пор, пока в подклассе не будет вызван метод установки, после чего значения станут различаться. например,

#!/usr/bin/perl
use warnings;
use strict;

{
    package Foo;
    use Moose;
    use MooseX::ClassAttribute;
    class_has Item => ( is => 'rw' );
}

{
    package Bar;
    use Moose;
    extends 'Foo';
}

Foo->Item(4);

# This prints "4, 4" as expected
#
print join( ", ", Foo->Item(), Bar->Item() ) . "\n"; 

Bar->Item(5);

# Would like this to print "4, 5", but it prints "5, 5"
#
print join( ", ", Foo->Item(), Bar->Item() ) . "\n"; 

Какой лучший способ получить этот эффект, с MooseX :: ClassAttribute или иным способом? Похоже на желаемое поведение для любого класса с данными класса, которые ожидаются от наследования.

1 Ответ

0 голосов
/ 03 февраля 2013

Я знаю, что вы просили о наследовании, но роли могут помочь вам решить вашу проблему другим способом.

Попробуйте на простом примере:

#!/usr/local/bin/perl

use strict;
use feature 'say';

{
    package Bomb;
    use Moose::Role;
    sub fuse    { say "Bomb explode" }
    sub explode { say "Bomb fuse"}
}

{
    package Spouse;
    use Moose::Role;
    sub fuse    { say "Spouse explode"}
    sub explode { say "Spouse fuse"}
}

{
    package PracticalJoke;
    use Moose;
    with 'Bomb'   => { excludes => 'explode' },
         'Spouse' => { excludes => 'fuse' };
}

my $joke = PracticalJoke->new();
$joke->fuse();
$joke->explode();

И с«исключая», вы можете точно контролировать то, что должно произойти.

Посмотрите на , почему роли удивительны и слайды из Овидия о наследовании против ролей .

...