Я думаю, что единственный Один из способов избежать этого - использовать MooseX::Declare
.
MooseX::Declare
- это macro
который превращается ниже в ваш пример:
use MooseX::Declare;
class Person {
# attributes
# methods
}
Он автоматически вставляет namespace::autoclean
и делает класс неизменным.
Для расширенных классов вы делаете:
class Person extends Human { ... }
И для добавления ролей вы делаете:
class Person with BlueEyeRole { ... }
И вы можете легко комбинировать их:
class Person extends Human with BlueEyeRole { ... }
Вы также получаете некоторые другие определенные ключевые слова, например.method
:
class Person {
has 'name' => (is => 'rw', isa => 'Str');
method hello { "Hello " . $self->name }
}
Если вы хотите сделать свой класс изменчивым, тогда его:
class Person is mutable { ... }
Возможно, естьтехническая причина, почему это невозможно или почему это не следует делать?
Технически было бы сложно собрать все это вместе.MooseX::Declare
использует Devel::Declare
для создания необходимого синтаксиса для интерпретации Perl.
Так что, если для вас проблема с котлом, подумайтеиспользуя MooseX::Declare
.Я использовал его во многих проектах без проблем и считаю его идеальным для быстрого создания эскизов приложения на основе классов.Однако большую часть времени я доволен образцом и поэтому придерживаюсь стандарта Moose
.