Модель объекта Perl по умолчанию не имеет понятия атрибутов класса.И нет такого рода хуков, как «когда создается новый подкласс, запустите этот код».
Вместо этого базовый класс может поддерживать хэш счетчиков, используя имя класса в качестве ключей:
package A;
my %counters;
sub new {
my ($class) = @_;
my $counter = $counters{$class} //= Counter->new;
$counter++;
return bless {} => $class;
}
sub get_counter {
my ($self_or_class) = @_;
my $class = (ref $self_or_class) || $self_or_class;
$counters{$class};
}
package B;
use parent -norequire, 'A';
Это создаст новый счетчик при создании экземпляра подкласса.Обратите внимание, что первым аргументом метода является либо имя класса, либо экземпляр объекта.Нам нужно использовать это в new()
в качестве хеш-ключа.В get_counter()
я написал это так, что метод может быть вызван как для класса, так и для объекта с одинаковым эффектом.
Подобный метод известен как объекты наизнанку, где хранится объектполя в хеше, хранящемся в классе, так что сам объект не содержит никаких данных.
(Почему parent
вместо base
? Модуль parent
только наследует, тогда как base
также интегрируется с fields
прагмой, которую вы не должны использовать.)