我的所有Moose类都必须包含'namespace :: autoclean'和'make_immutable',或者是否有某种方法可以默认获取这些?

时间:2010-10-22 13:28:22

标签: perl moose

根据Moose最佳实践文档,我的Moose课程应如下所示:

package Person;

use Moose;
use namespace::autoclean;

# extends, roles, attributes, etc.

# methods

__PACKAGE__->meta->make_immutable;

1;

请参阅Moose::Manual::BestPractices

99%的时间这是我想要的,所以有一些方法可以让我的命名空间自动清除,默认情况下我的类是不可变的,所以我不必让这个代码混乱吗?

也许有一个技术原因导致它不可能或为什么不应该这样做?

由于

2 个答案:

答案 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可以为你做到。