根据Moose最佳实践文档,我的Moose课程应如下所示:
package Person;
use Moose;
use namespace::autoclean;
# extends, roles, attributes, etc.
# methods
__PACKAGE__->meta->make_immutable;
1;
请参阅Moose::Manual::BestPractices。
99%的时间这是我想要的,所以有一些方法可以让我的命名空间自动清除,默认情况下我的类是不可变的,所以我不必让这个代码混乱吗?
也许有一个技术原因导致它不可能或为什么不应该这样做?
由于
答案 0 :(得分:8)
我认为唯一的避免这种情况的一种方法是使用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
。
答案 1 :(得分:3)
我认为MooseX::MakeImmutable可以为你做到。