daverave has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

I have written a Moose object module using the following attribute:

package MyObj; use Moose; use namespace::autoclean; # some irrelevant attributes and methods... 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', }, ); sub _build_custom_fields { return {}; } __PACKAGE__->meta->make_immutable; 1;
I would like to change the default hash accessor, such that an attempt to read from a non-existing key will croak, while writing (setting) a non-existing key will work as usual. That is:
my $obj = MyObj->new(); $biorange->custom_field('foo', 23); # OK my $foo = $biorange->custom_field('foo'); # OK my $foo = $biorange->custom_field('bar'); # should croak!
I guess I should replace the accessor with my own code (?), but I'm not sure what interface I should follow (i.e. what is the accessors prototype and how do I get access to the actual hash).

Thank you,
Dave

Replies are listed 'Best First'.
Re: Setting a custom hash accessor handle in Moose attribute
by stvn (Monsignor) on Oct 24, 2010 at 23:35 UTC

    Try this:

    before 'custom_field' => sub { my $self = shift; if (scalar @_ == 1) { my $key = shift; confess "The field $key does not exist" unless $self->has_custom_field( $key ); } };

    -stvn
      Thank you.