Для этого фокуса потребуется взять один Class::Accessor и один Test::Deep, замешав их в одном модуле:
package MyTest;
use base 'Class::Accessor';
use Test::Deep;
__PACKAGE__->mk_accessors qw(mytest);
1;
Модуль Class::Accessor создаст в пакете MyTest метод mytest(), который должен работать как пара сеттер — геттер для установки поля mytest (точнее, $self->{mytest}). Тестируем:
use v5.12;
use MyTest;
my $test = new MyTest;
$test->mytest('test');
say "mytest=", $test->mytest;
И видим, что никакое значение mytest=test не устанавливается. Комментируем в файле MyTest.pm строку, подключающую модуль Test::Deep, и все работает:
mytest=test
Раскомментируем обратно и попробуем немного по-другому:
$test->set('key', 'value');
set $test('key', 'value');
Опять не работает. Но по-другому мы пробуем уже после того, как заглянули в исходник Test::Deep и увидели там безусловный экспорт функции set:
@EXPORT = qw( eq_deeply cmp_deeply cmp_set cmp_bag cmp_methods
useclass noclass set bag subbagof superbagof subsetof
supersetof superhashof subhashof
);
В свою очередь, внутри методов-аккессоров, которые создает Class::Accessor, используются вызовы $self->set(...), которые в модуле, унаследованном от него, попадают напрямую в Test::Deep::set().
Неуклюжее быстрое решение: подсказать компилятору, куда направлять внутренние вызовы методов set:
package MyTest;
use base 'Class::Accessor';
use Test::Deep;
*set = *Class::Accessor::set;
__PACKAGE__->mk_accessors qw(mytest);
1;






