Как уже говорили другие, документируйте, что делает ваш модуль, и доверяйте пользователю. Однако стоит подумать о философской разнице между вызовом класса и вызовом объекта. Если ваш модуль Perl предоставляет способ создания объектов, многие из методов в этом классе, вероятно, будут полагаться на данные, специфичные для отдельного объекта. Вероятно, это наиболее распространенный способ вызова методов: если у вас есть объект, вы просто делаете $object->method(…)
. Однако вполне вероятно, что некоторые методы класса являются общими и не нуждаются в данных от конкретного объекта. Они часто вызываются с использованием имени пакета, и это чаще всего наблюдается при вызове метода new()
, такого как LWP::UserAgent->new()
.
Удобно, Perl позволяет вам обрабатывать эти два случая одинаково, используя что-то вроде my $self = shift;
в начале метода: если метод вызывается для объекта, $self
получает значение ссылки на объект , если вызывается в классе, $self
получает имя пакета.
Даже если метод вызывается для класса, поэтому $self
содержит имя пакета, вы все равно можете вызывать другие методы этого пакета таким же образом , выполнив $self->method(…)
. Это тогда совместимо с вызовом исходного метода для определенного объекта, поэтому все держится вместе.
Как один из примеров, пакет Perl Math :: BigInt включает в себя довольно много методов, некоторые из которых предназначены для вызова в самом пакете (классе) (например, new()
), некоторые из которых должны вызываться для отдельных объектов (например, round()
), а некоторые для любого (например, accuracy()
).
Мораль: все зависит от функциональности метода в том, способен ли он иметь разумное значение. Разумно предположить, что метод any вызывается с ожиданием того, что он будет делать то, для чего вы его рекламируете. Однако не требует вызова метода для объекта, когда может иметь смысл вызывать этот метод для самого класса.