Это хороший случай, когда v (он же черты в обобщенной литературе ООП) будет полезен.
Вместо классического объекта - это класс , сРоли объект * выполняет роль *.
Проверьте соответствующие документы Moose для получения дополнительной информации.
Пример:
package Device::ActLikeA;
use Moose::Role;
has 'attribute' => (
isa => string,
is => 'rw',
default => 'Apple',
);
sub an_a_like_method {
my $self = shift;
# foo
}
1;
Итактеперь у меня есть роль с именем Device::ActLikeA
, что мне с ней делать?
Хорошо, я могу применить роль к классу, и код и атрибуты, определенные в ActLikeA
, будут доступны в классе:
package Device::USBButterChurn;
use Moose;
does 'Device::ActLikeA';
# now has an attribute 'attribute' and a method 'an_a_like_method'
1;
Вы также можете применять роли к отдельным экземплярам класса.
package Device;
use Moose;
has 'part_no' => (
isa => 'Str',
is => 'ro',
required => 1,
);
has 'serial' => {
isa => 'Str',
is => 'ro',
lazy => 1,
build => '_build_serial',
);
1;
А затем основной код, который просматривает деталь и применяет соответствующие роли:
my @PART_MATCH = (
[ qr/Foo/, 'Device::MetaSyntacticVariable' ],
[ qr/^...-[^_]*[A][^-], 'Device::ActLikeA; ],
[ qr/^...-[^_]*[B][^-], 'Device::ActLikeB; ],
# etc
);
my $parts = load_parts($config_file);
for my $part ( @$parts ) {
my $part_no = $part->part_number();
for my $_ (@PART_MATCH) {
my ($match, $role) = @$_;
$part->apply_role($role)
if $part_no =~ /$match/;
}
}