我正在为驼鹿物体写一个模块.我想允许使用此对象的用户(或我自己......)根据需要随时添加一些字段.我无法先验地定义这些字段,因为我根本不知道它们会是什么.
我目前只是添加了一个名为extra的hashref类型的字段rw
,因此用户可以简单地将东西放入该哈希:
# $obj is a ref to my Moose object
$obj->extra()->{new_thingie}="abc123"; # adds some arbitrary stuff to the object
say $obj->extra()->{new_thingie};
Run Code Online (Sandbox Code Playgroud)
这有效.但是......这是一种常见的做法吗?还有其他(可能更优雅)的想法吗?
注意我不想创建另一个扩展这个模块的模块,这实际上只是为了我想添加的即时内容.
我正在编写一个链接到外部资源的类.其中一种方法是破坏外部资源的删除方法.不应该对该对象进行进一步的方法调用.如果设置了标志,我想在所有方法中设置一个标志和死亡,但是有更好,更简单的方法吗?可能涉及DESTROY的东西?
到目前为止,我真的很喜欢Axeman的建议,但使用AUTOLOAD是因为我懒得重新创建所有方法:
#!/usr/bin/perl
use strict;
use warnings;
my $er = ExternalResource->new;
$er->meth1;
$er->meth2;
$er->delete;
$er->meth1;
$er->meth2;
$er->undelete;
$er->meth1;
$er->meth2;
$er->delete;
$er->meth1;
$er->meth2;
$er->meth3;
package ExternalResource;
use strict;
use warnings;
sub new {
my $class = shift;
return bless {}, $class;
}
sub meth1 {
my $self = shift;
print "in meth1\n";
}
sub meth2 {
my $self = shift;
print "in meth2\n";
}
sub delete {
my $self = shift;
$self->{orig_class} = ref $self;
return bless $self, "ExternalResource::Dead";
}
package …
Run Code Online (Sandbox Code Playgroud)