使用Class :: MOP :: Class创建动态数据模型不起作用

时间:2012-06-27 01:47:10

标签: perl dynamic instance creation

我在JSON文件中有Schema定义,我想阅读并使用Class :: MOP :: Class动态生成Classes。例如,有JSON文件A.json,B.json,C.json,它们被转换为A,B,C类。

现在我想从其他一些数据源中实例化A,B,C的对象。

sub generate_classes_from_schema {
    my $self = shift;
    foreach my $cname('A', 'B', 'C') {
        my $class_def = Class::MOP::Class->create($cname); 

        foreach my $att_name(get_attrib_list($cname)) {
            $class_def->add_attribute($att_name);
        }
        $self->{class_defs}->{$cname} = $class_def;
     }
 }
...
...
sub generate_object_map {
    my $self = shift;
    my $query_key = shift;
    my $obj_map = {};

    foreach my $cname('A', 'B', 'C') {
        my $row = get_rowfor_entity($cname, $query_key);
        my $entity_object = $self->{class_defs}->{$cname}->new_object(%{$row});         
        push(@{$obj_map->{$cname}, $entity_object);
    }
    return $obj_map;
}

当我转储obj_map时,它只有每个属性的键值对的散列...

        'A' =>
                 bless( {
                              'att_name' => 'my-att1',
                              'att1' => '4',
                              'att2' => 'false',
                              'att2' => 'true',
                            }, 'A' )

我希望该对象应该至少具有自动生成的属性访问器方法。此外,在尝试向class_def [$ class_def-> add_method(...)]添加方法时,这些方法也不会反映在obj_map的Object实例中。

有人可以解释我哪里出错或者应该采用什么方法?

1 个答案:

答案 0 :(得分:0)

如果要为属性创建访问器,则必须定义访问者的名称。更多关于属性&方法创建&内省见Class::MOP::Class文档。

my $class = Class::MOP::Class->create('Foo');

# Attribute & method creation.
$class->add_attribute(bar => (accessor => 'bar'));
$class->add_method(buz => sub { return 'buz'; });

# Attribute & method introspection.
$class->get_all_attributes();
$class->get_all_methods();