Например, в родительском классе я говорю:
package A;
....
__PACKAGE__->attr('foo');
Потом почкую потомка:
package B;
use base 'A';
__PACKAGE__->foo({
многоэтажный => 'хеш',
который => ['является', 'общим', 'для всех', ['экземпляров', 'данного', 'класса и его потомков']]
});
....
А потом делаю еще двоих:
package C;
use base 'B';
....
package D;
use base 'B';
__PACKAGE__->foo({'совсем' => 'другое значение'});
И вот когда я использую у себя в программе классы C и D одновременно, foo() каждого из них должен возвращать: для C — значение, объявленное в B, а для D — значение, объявленное в D.
В данный момент, когда я использую Class::Accessor::Class и mk_class_accessors, оба пакета будут возвращать из foo() значение, определенное в последнем из загруженных модулей, что, мягко говоря, неправильно.
Использование переменных объекта вместо переменных класса имеет два существенных недостатка: расточительность по памяти, а также то, что изменение такого атрибута должно отразиться на всех экземплярах класса сразу.
Moose не используется, из-за того, что некоторых объектов надо создавать много в короткое время, а конструктор Moose слишком медленный в данном контексте, даже с make_immutable().
Вообще, у перла с ООП столько детских проблем, которых в питоне отродясь не было, что меня удивляет, что перл всерьез используют, и пытаются доказать его пригодность. Простейшие вещи делаются огромным количеством костылей и подпорок, требуя либо знать много внутренностей реализации языка, либо копировать-вставлять кусок волосатого кода, «который делает магию», и который вынести куда-то в абстрактную даль крайне сложно.