У меня есть Moose :: Role, который содержит сетевой клиент в качестве атрибута:Изменения атрибуты :: Роли лосей во время выполнения
package Widget;
use Moose::Role;
has 'network_thingy' => (
isa => Maybe[ThingyClient],
);
И, конечно, у меня есть несколько конкретных Музы классов, которые используют это должность:
package BlueWidget;
use Moose;
with 'Widget';
Теперь речь идет о функциональном тестировании виджетов. У нас есть возможность создавать объекты ThingyServer
, и было бы намного быстрее и в целом превосходно напрямую использовать объекты ThingyServer вместо вращения демона и подключения ThingyClient к нему по сети. Так как ThingyClient & ThingyServer удобно имеет те же самые методы, это должно быть легко возможным. Но, конечно, Moose требует, чтобы я использовал ThingyClient, когда тест в конечном итоге конструирует BlueWidget.
Я провел некоторое исследование и наткнулся на документацию Moose :: Meta. Отлично! Так вот тестовый код:
my $metarole = Moose::Meta::Role->initialize('Widget');
// first remove the old attribute
$metarole->remove_attribute('network_thingy');
Я собирался добавить новый атрибут, но я думал, что проверить состояние класса роли & первым. Теперь, если я сброшу $ metarole, он выглядит великолепно. Нет атрибута network_thingy. Но если я построить класс BlueWidget, или просто пик внутри метакласса ...
$metaclass = Moose::Meta::Class->initialize('BlueWidget');
diag Dumper ($metaclass);
... Конечно же network_thingy
все еще там. Это совсем не то, чего я ожидал. Как я могу изменить/удалить/заменить атрибут роли Widget во время выполнения?