2009-07-19 14 views
6

Fooable ve Barable rollerinin her ikisi de tanımlanmış olduğu için, FooBar'ın Fooable ve Barable sınıfını nasıl söylerim? BenBir sınıfın MooseX :: Declare ile birden fazla rol kullandığını nasıl bildiririm?

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

diyerek sorunum yok Ama çalıştığınızda

class FooBar with Fooable, Barable {} 

alıyorum eklemek az

hata kullanışlı daha
expected option name at [path to MooseX/Declare/Syntax/NamespaceHandling.pm] line 45 

Sadece ben deli değilim kendime kanıtlamak için, Moose'u kullanarak yeniden yazdım. Bu kod çalışır (ama günah daha çirkin bir):

class FooBar with Fooable with Barable {} 

En yaygın görünüyor: Sadece bu da çalışır unutmayın

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

cevap

6

Görünüşe parantez gerek MooseX'te gördüğüm kullanım :: Declare world.

Ayrıca da "klasik" şekilde kullanabilirsiniz not:

class FooBar { 
    with qw(Fooable Barable); 
} 

bu sınıf hattında rolünü tanımlayan sonuna kadar gecikmeli alır hemen oysa rol oluşturur çünkü bu gereklidir durumlar vardır sınıf bloğu.

+0

Evet, belgelere "@ (@roles) ile" diyor. Tek sorum, bir listedeki barworld hakkında olurdu. –

+0

Hangi dokümanları kullanıyorsunuz? MooseX :: Declare docs, "Foo with class foo" (...}) diyor. Moose doktorları “(@roles) ile” derler, ama sonra bütün örnekler “Kırılabilir” ile; –

6

:

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