Как я могу умереть при доступе к несуществующему ключу в глубоком хохе в качестве атрибута Moose? - PullRequest
1 голос
/ 12 ноября 2010

У меня есть объект 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?

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Как правило, я бы сказал, что если у вас сложная структура данных, которую вы хотите обрабатывать объектно-ориентированным образом, вам следует превратить структуру данных в дерево объектов. При помощи лося это можно смоделировать довольно прозрачно.

0 голосов
/ 12 ноября 2010

Вы можете посмотреть отключение автовивификации через autovivification.

Вы можете передать unimport подпрограмму 'exception', которая заставит его умереть, где он может иметь autoviv-ed.

...