1

Class::MOP::Class を使用してクラスを動的に読み取り、生成したい JSON ファイルにスキーマ定義があります。たとえば、クラス A、B、C に変換される JSON ファイル A.json、B.json、C.json があります。

ここで、他のデータ ソースから 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 インスタンスに反映されません。

誰かが私がどこで間違っているのか、または正しいアプローチは何であるべきかを説明してもらえますか?

4

1 に答える 1

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();
于 2012-06-27T15:09:31.253 に答える