У меня есть объект Moose с атрибутом хеш:
has 'custom_fields' => (
traits => [qw( Hash )],
isa => 'HashRef',
builder => '_build_custom_fields',
handles => {
custom_field => 'accessor',
has_custom_field => 'exists',
custom_fields => 'keys',
has_custom_fields => 'count',
delete_custom_field => 'delete',
},
);
around 'custom_field' => sub {
my $orig = shift // confess;
my $self = shift // confess;
my $field = shift // confess;
confess "Attempt accessing non-existing custom field '$field'"
unless ( @_ or $self->has_custom_field($field) );
$self->$orig( $field, @_ );
};
он хорошо работает для простых одноуровневых хэшей.Теперь я хотел бы разрешить глубокие хэши (хэш хэшей хэшей ...) и все же confess
всякий раз, когда делается попытка доступа к несуществующему (возможно, глубокому) ключу.
ОБНОВЛЕНИЕ Возможно, как-то использовать Data::Diver
?