Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Setting a custom hash accessor handle in Moose attribute

by daverave (Scribe)
on Oct 23, 2010 at 14:50 UTC ( [id://866957]=perlquestion: print w/replies, xml ) Need Help??

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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://866957]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2024-03-28 22:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found