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; #### 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!