Использование Moose для кодирования объектов в полиморфной ситуации, когда клиенты ожидают доступа к данным $ object -> {private_variable} - PullRequest
2 голосов
/ 17 сентября 2011

Я знаю, что хотя внутреннее представление объекта Moose (по праву) оставлено неопределенным.Однако почти во всех случаях это будет простой благословенный хэшреф.В ситуации, когда создается новый объект, который может быть вызван унаследованным кодом, который ожидает доступа к атрибутам объекта, извлекая его из благословенного хеша ($object->{attribute}), а не инкапсулирует в объект с помощью вызова метода ($object->attribute()), есть ли способ явно определить, что объект должен быть сохранен как благословенный хэш-индекс, чтобы атрибуты работали должным образом?

Еще лучше, есть ли какие-нибудь модули, которые разъединяют благословенный объект, являющийсяобошли объект от внутреннего представления?Кажется, что можно было бы передать связанный хеш, который мог бы связать определенные ключи хеш-функции в вызовы методов для экземпляра метаобъекта, поэтому вся проверка типов по-прежнему выполняется, даже если какой-то старый код вызывает объект как $object->{attribute} = 'blahblah'.

1 Ответ

1 голос
/ 17 сентября 2011
BEGIN {
    package MyMyMy;
    use Moose;
    has "watusi" =>
        is => "rw",
        isa => "Str";
}

my $mymymy = MyMyMy->new( watusi => "batusi" );
print $mymymy->watusi, $/;

$mymymy->watusi("woo-woo");
print $mymymy->{watusi}, $/;

$mymymy->{watusi} = "BAD DEV, BAD!";
print $mymymy->watusi, $/;

__END__    
batusi
woo-woo
BAD DEV, BAD!

Полагаю, вы уже знали, что это сработает так, как работает. Мне очень трудно представить, что Moose когда-либо изменит внутреннее устройство таким образом, чтобы это не сработало. Итак, как бы правильно вы ни старались, если ваша настоящая цель - просто извлечь какой-то устаревший код из дампа, я бы сказал, что вы можете рассчитывать на это, если есть реальный план продвижения вперед и перехода к более современные практики и предотвращение нарушений интерфейса.

...