我有一个Perl类,它基于一个有福的hashref(https://github.com/kylemhall/Koha/blob/master/Koha/Object.pm)
这是一个基于社区的项目,有许多不同技能的开发人员。
我看到的是一些开发人员意外地将我们的对象用作hashrefs。实际数据不存储在祝福的hashref中,而是存储在hashref中的dbic对象中(在$ self-> {_ result}中)。当开发人员尝试像$ object-> {id} perl这样的东西不会抱怨时,它只会返回undef,就像预期的那样。
我想做的是 A)发生这种情况时,使脚本爆炸并显示错误 B)允许使用hashref语法设置/获取存储在$ self-> {_ result}
中的dbic对象中的值我尝试使用:
use overload '%{}' => \&get_hashref;
但是当我这样做时,每次调用常规方法时都会调用get_hashref!这在某种程度上是有道理的,因为对象本身是一个hashref。我确信这与Perl内部有关,因为祝福的hashrefs是对象。
我正在努力实现的目标是什么?
答案 0 :(得分:5)
我建议使用基于标量或基于数组的对象而不是基于散列的对象。这是一种廉价(高效)的解决方案,因为它只会导致罪犯违反现有的类型检查。
例如,以下生成的对象只是对实际对象的引用。只需在方法中使用$$self
代替$self
。
$ perl -e'
sub new {
my $class = shift;
my $self = bless(\{}, $class);
# $$self->{...} = ...;
return $self;
}
my $o = __PACKAGE__->new();
my $id = $o->{id};
'
Not a HASH reference at -e line 9.
答案 1 :(得分:3)
实现此目的的一种方法是使用“由内而外的对象”,其中对象只是一个有福的简单标量,并且数据是分开存储的。 例如,请参阅Class::STD