2009-07-19 8 views
6

Dato che i ruoli Fooable e Barable sono stati entrambi definiti, come posso dire che la classe FooBar fa Fooable e Barable? Non ho alcun problema a direCome si dichiara che una classe utilizza più di un ruolo con MooseX :: Declare?

#!/usr/bin/perl 

use MooseX::Declare; 

role Fooable { 
    method foo { print "foo\n" } 
} 

role Barable { 
    method bar { print "bar\n" } 
} 

class Foo with Fooable {} 
class Bar with Barable {} 

package main; 

use strict; 
use warnings; 

Foo->new->foo; 
Bar->new->bar; 

Ma quando provo ad aggiungere

class FooBar with Fooable, Barable {} 

ottengo il meno utile errore

expected option name at [path to MooseX/Declare/Syntax/NamespaceHandling.pm] line 45 

Giusto per dimostrare a me stesso che non mi fa impazzire, L'ho riscritto usando Moose. Questo codice funziona (ma è più brutto di peccato):

#!/usr/bin/perl 

package Fooable; 
    use Moose::Role;  
    sub foo { print "foo\n" } 

package Barable;  
    use Moose::Role;  
    sub bar { print "bar\n" } 

package Foo;  
    use Moose;  
    with "Fooable"; 

package Bar;  
    use Moose;  
    with "Barable"; 

package FooBar;  
    use Moose;  
    with "Fooable", "Barable"; 

package main; 

use strict; 
use warnings; 

Foo->new->foo; 
Bar->new->bar; 
FooBar->new->foo; 
FooBar->new->bar; 

risposta

6

A quanto pare è necessario parentesi:

#!/usr/bin/perl 

use MooseX::Declare; 

role Fooable { 
    method foo { print "foo\n" } 
} 

role Barable { 
    method bar { print "bar\n" } 
} 

class Foo with Fooable {} 
class Bar with Barable {} 
class FooBar with (Fooable, Barable) {} 

package main; 

use strict; 
use warnings; 

Foo->new->foo; 
Bar->new->bar; 
FooBar->new->foo; 
FooBar->new->bar; 
+0

Sì, la documentazione dice 'con (@roles)'. La mia unica domanda sarebbe stata sulle bareword in una lista. –

+0

Che documenti stai usando? I documenti MooseX :: Declare dicono 'classe Foo con ruolo {...}'. I documenti Moose dicono 'con (@roles)', ma poi tutti gli esempi sono come 'con 'Breakable';' –

6

Basta notare che questo funziona anche:

class FooBar with Fooable with Barable {} 

Questo sembra il più comune utilizzo che ho visto in MooseX :: Declare world.

notare Inoltre è possibile utilizzare il modo "classico" anche:

class FooBar { 
    with qw(Fooable Barable); 
} 

Ci sono casi in cui ciò è necessario perché questo compone il ruolo immediatamente considerando che la definizione ruolo nella linea di classe viene ritardato fino alla fine del blocco di classe.

Problemi correlati