2009-07-19 8 views
6

Étant donné que les rôles Fooable et Barable ont tous deux été définis, comment puis-je dire que la classe FooBar fait Fooable et Barable? Je n'ai aucun problème en disantComment déclarer qu'une classe utilise plus d'un rôle avec 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; 

Mais lorsque je tente d'ajouter

class FooBar with Fooable, Barable {} 

Je reçois moins que l'erreur utile

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

Juste pour me prouver que je ne suis pas fou, Je l'ai réécrit en utilisant Moose. Ce code fonctionne (mais est plus laid que le péché):

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

Répondre

6

Apparemment, vous avez besoin entre parenthèses:

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

Oui, la documentation indique 'avec (@roles)'. Ma seule question aurait été sur le barewords dans une liste. –

+0

Quels documents utilisez-vous? Les docs MooseX :: Declare disent 'class Foo avec Role {...}'. Les docs de Moose disent 'avec (@roles)', mais alors tous les exemples sont comme 'avec 'Breakable';' –

6

Juste à noter que cela fonctionne aussi:

class FooBar with Fooable with Barable {} 

Cela semble le plus fréquent utilisation que j'ai vu dans MooseX :: Declare world.

Notez également que vous pouvez utiliser le mode « classique » aussi:

class FooBar { 
    with qw(Fooable Barable); 
} 

Il y a des cas où cela est nécessaire parce que cela compose le rôle immédiatement alors que la définition du rôle dans la ligne de classe est reporté jusqu'à la fin de la bloc de classe.

Questions connexes