根据Moose最佳实践文档,我的Moose类应该如下所示:
package Person;
use Moose;
use namespace::autoclean;
# extends, roles, attributes, etc.
# methods
__PACKAGE__->meta->make_immutable;
1;
Run Code Online (Sandbox Code Playgroud)
请参阅Moose :: Manual :: BestPractices.
99%的时间这是我想要的,所以有没有办法让我的命名空间自动清理,我的类默认为不可变,所以我不必让这个代码混乱?
也许有一个技术上的原因,为什么它不可能或为什么不应该这样做?
谢谢
我认为避免这种情况的唯一方法就是使用MooseX::Declare.
MooseX::Declare是一个macro在下面变成你的例子:
use MooseX::Declare;
class Person {
# attributes
# methods
}
Run Code Online (Sandbox Code Playgroud)
它会自动插入namespace::autoclean并使类不可变.
对于扩展课程,您可以:
class Person extends Human { ... }
Run Code Online (Sandbox Code Playgroud)
要添加角色,您需要:
class Person with BlueEyeRole { ... }
Run Code Online (Sandbox Code Playgroud)
你可以轻松地结合这些:
class Person extends Human with BlueEyeRole { ... }
Run Code Online (Sandbox Code Playgroud)
您还可以获得一些其他定义的关键字,例如.method:
class Person {
has 'name' => (is => 'rw', isa => 'Str');
method hello { "Hello " . $self->name }
}
Run Code Online (Sandbox Code Playgroud)
如果你确实希望让你的类可变,那么:
class Person is mutable { ... }
Run Code Online (Sandbox Code Playgroud)
也许有一个技术上的原因,为什么它不可能或为什么不应该这样做?
从技术上讲,将这些全部拉到一起很难.MooseX::Declare利用Devel::Declare构建Perl的必要语法来解释.
因此,如果锅炉板是您的问题,那么考虑使用MooseX::Declare.我已经在许多没有问题的项目中使用它,并且在快速草绘基于类的应用程序时发现它是理想的.但是大多数时候我对样板很满意,所以坚持标准Moose.
| 归档时间: |
|
| 查看次数: |
986 次 |
| 最近记录: |