我认为唯一的避免这种情况的一种方法是使用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。