2012-03-05 20 views
5

Tengo un atributo de clase en una clase Moose, pero me gustaría que funcione como Class::Data::Inheritable en términos de una subclase que anula el valor principal. Es decir, la subclase hereda el valor del elemento principal hasta que se invoca al programador en la subclase, en cuyo punto los valores se vuelven distintos. p.ej.Atributo de clase Moose que actúa como Clase :: Datos :: Incrustable

#!/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"; 

Cuál es la mejor manera de conseguir este efecto, la MooseX::ClassAttribute o de otra manera? Parece un comportamiento deseable para cualquier clase con datos de clases de los que se espera heredar.

+1

Clase FWIW :: Datos :: Inheritable no está en conflicto con Moose. – Schwern

+1

Schwern: Eso puede ser cierto, aunque los objetos Moose tienen que heredar de Moose :: Object por lo que al menos habría múltiples herencias involucradas, lo que me molesta. Además, no obtienes ninguna de las bondades de declaración de atributos de Moose que MooseX :: ClassAttribute te brinda. –

Respuesta

0

Sé que pidió herencia, pero puede que los roles le ayuden a resolver su problema de otra manera.

intentarlo con un ejemplo sencillo:

#!/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(); 

Y con los '' excluye que puede controlar exactamente lo que debe suceder.

Eche un vistazo a why roles are awsome y las diapositivas de Ovid sobre inheritance versus roles.

+0

Es posible que desee resumir esos enlaces aquí en su respuesta; De esa forma, si esos enlaces desaparecen, no correrás el riesgo de que se eliminen. –

+0

Bien. Agregué el ejemplo del enlace mencionado. – smartmeta

Cuestiones relacionadas