Это не поддерживается, и для этого есть веская причина. Класс или роль не совпадают с сахарными методами, и на каком-то уровне разные вещи должны отличаться. Если ваша проблема заключается в том, чтобы «использовать» пакет Moose + A Custom Sugar, то вы можете решить эту проблему, просто экспортировав свой собственный пакет Moose, украдя из вашего примера:
package MySugar;
use strict;
use Moose::Exporter;
Moose::Exporter->setup_import_methods(
with_meta => [ 'has_rw' ],
as_is => [ 'thing' ],
also => 'Moose',
);
sub has_rw {
my ( $meta, $name, %options ) = @_;
$meta->add_attribute(
$name,
is => 'rw',
%options,
);
}
Тогда вы просто говорите:
package MyApp;
use MySugar; # imports everything from Moose + has_rw and thing
extends(Parent);
has_rw 'name';
has 'size';
thing;
Так работает MooseX::POE
, а также несколько других пакетов. Я бы, например, возразил против того, чтобы extends
вводил сахар, как вы предлагаете здесь, потому что класс не является набором функций сахара, и эти два действительно никогда не следует путать.
ОБНОВЛЕНИЕ: чтобы объединить оба сразу, самый чистый подход состоит в том, чтобы переработать Parent как роль, которая применяется к Moose :: Object.
package Parent::Methods;
use 5.10.0;
use Moose::Role;
sub something_special { say 'sparkles' }
Затем мы просто изменим вызов Moose :: Exporter в MySugar, чтобы он выглядел как
Moose::Exporter->setup_import_methods(
apply_base_class_roles => 'Parent::Methods',
with_meta => ['has_rw'],
as_is => ['thing'],
also => 'Moose',
);
Теперь вы можете просто сказать
package MyApp;
use MySugar;
has_rw 'name';
has 'size';
thing;
package main;
MyApp->new->something_special; # prints sparkles
Который, я думаю, последняя деталь, которую вы хотели.