Не.
Классы лося, их атрибуты и все, что к ним принадлежит, имеют множество метаданных, прикрепленных к ним.Вы не можете вывести все эти метаданные из данных одного экземпляра.
Я предполагаю, что для документа yaml указано
---
foo: 42
bar: ['moo', 'kooh']
, которое вы ожидаете, и объектобратно, который отвечает на вызовы методов foo
и bar
, возвращая соответствующие значения.Но как должны вести себя эти средства доступа?Должны ли они быть простыми методами чтения или также позволять писать?Должны ли они проверять против какого-либо типа ограничения?и т. д.
Если все, что вам действительно нужно, это что-то, что делает некоторую необъясненную структуру данных доступной, например, объект, взгляните на Data::Hive
, Hash::AsObject
и аналогичные модули вместо этого.
Если вы действительно хотите создать надлежащие классы Moose и либо согласны с догадками, которые могут быть задействованы, либо случайно где-то есть необходимые метаданные, вы можете простоиспользуйте мета-протокол.
my $class = Moose::Meta::Class->create_anon_class(
attributes => [map {
# your particular set of assumptions here
Moose::Meta::Attribute->new($_ => (is => 'ro', ...))
} keys %{ $deserialized_yaml }],
);
my $instance = $class->name->new($deserialized_yaml);
$instance->$some_key_in_the_yaml_document;