Как мне объявить, что класс использует более одной роли с MooseX :: Declare? - PullRequest
6 голосов
/ 20 июля 2009

Учитывая, что роли Fooable и Barable были определены, как я могу сказать, что класс FooBar выполняет функции Fooable и Barable? Я без проблем говорю

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

Но когда я пытаюсь добавить

class FooBar with Fooable, Barable {}

Я получаю менее полезную ошибку

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

Чтобы доказать себе, что я не сумасшедший, я переписал его, используя Moose. Этот код работает (но он страшнее греха):

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

Ответы [ 2 ]

6 голосов
/ 20 июля 2009

Просто чтобы заметить, что это также работает:

class FooBar with Fooable with Barable {}

Это, кажется, наиболее распространенное использование, которое я видел в MooseX :: Declare world.

Также обратите внимание, что вы также можете использовать «классический» способ:

class FooBar {
    with qw(Fooable Barable);
}

Есть случаи, когда это необходимо, потому что это немедленно создает роль, в то время как определение роли в строке класса задерживается до конца блока класса.

6 голосов
/ 20 июля 2009

Видимо, вам нужны скобки:

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