perl - 如何在 Moose 强制中访问对象的属性?

标签 perl moose dbix-class

我想将 Str 强制转换为 DBIx::Class::Row 对象以获取我的 Moose 类中的属性。为此,我需要对 DBIC 模式执行查找以找到该行。如果查找失败,我想将错误推送到 ArrayRef 属性上。

我目前将模式作为属性传递给我的类(class)。

通过强制,我似乎无法访问该对象,因此我无法推送到错误 arrayref 属性或使用架构对象来执行查找。

我尝试的另一种方法是在设置时使用“around”来查找和设置属性,但是当属性值通过构造函数传递时,这当然不会被调用。

这是可能的,还是有人有替代的实现来做我想要实现的目标?

最佳答案

当传递到具有属性初始值设定项的构造函数时,您可以捕获并改变存储的值。 (但是,它仅在构造函数中设置属性时运行,而不会在任何其他时间运行。)可以在 Class::MOP::Attribute 中找到初始化程序的文档。 .

由于这仅捕获通过构造函数设置属性的情况,因此您仍然需要捕获设置属性的其他情况。这可以通过您所说的方法修饰符来完成,但是您可以将两者合并为一个方法,包裹在自动生成的访问器周围:

has my_attr => (
    is => 'rw',
    isa => 'DBIx::Class::Row',
    initializer => 'my_attr',
);

# my_attr is the autogenerated accessor - we method-modify it to mutate the
# value being set, and catch cases where it is called as an initializer.

# called for reads, writes, and on initialization at construction time
around 'my_attr' => sub {
    my $orig = shift;
    my $self = shift;
    # value is not defined if being called as a reader
    # setter and attr are only defined if being called as an initializer
    my ($value, $setter, $attr) = @_;

    # the reader behaves normally
    return $self->$orig if not @_;

    # convert the string to the row object
    my $row = $self->convert_str_to_row_obj($value);

    # if called as an initializer, set the value and we're done
    return $setter->($row) if $setter;

    # otherwise, call the real writer with the new value
    $self->$orig($row);
};

关于perl - 如何在 Moose 强制中访问对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5116788/

相关文章:

mysql - Perl DBIx::Class::ResultSet 不同值

mysql - Perl DBI :mysql connection over SSL fails

perl - 如何覆盖 Moose::Role 中的 sub?

perl - 使对象实例不可变

mysql - 如何使用 dbicdump 仅转储特定表

perl - 在 Template Toolkit 中格式化输出的时间戳字段

mysql - 如何在 perl 脚本中使用 UTF8 连接到 MySQL?

Perl:quotemeta 仅用于正则表达式吗?文件名安全吗?

linux - 在虚拟机中在线安全地评估 perl 代码

perl - 从 Moose 类中获取所有属性作为散列的更好方法