has '_posts' => (is => 'ro', lazy => 1, traits => ['Hash'], isa => 'HashRef[HashRef]', builder => '_load_posts', handles => { set_post => 'set', get_post => 'get', num_posts => 'count', post_pairs => 'kv', post_keys => 'keys' }, writer => '_set_posts'); #### use Storable; store { {} }, $file; # This line needs to be changed. ... $s->_set_posts(retrieve $file); #### Attribute (_posts) does not pass the type constraint because: Validation failed for 'HashRef[HashRef]' with value 1 at native delegation method Site::Posts::num_posts (count) of attribute _posts #### package Site::Posts ; use Moose; use Storable; use Data::Dumper qw(Dumper); use namespace::autoclean; has '_posts' => (is => 'ro', lazy => 1, traits => ['Hash'], isa => 'HashRef[HashRef]', builder => '_load_posts', handles => { set_post => 'set', get_post => 'get', num_posts => 'count', post_pairs => 'kv', post_keys => 'keys' }, writer => '_set_posts'); has 'file' => (is => 'ro', isa => 'Str', required => 1 ); ### Public methods ### sub list { my $s = shift; if ($s->num_posts) { my @keys = $s->post_keys; print Dumper \@keys; } } sub add { my $s = shift; my $id = shift; $s->set_post($id => {exists => 1}); } sub delete { my $s = shift; store { {} }, $s->file; } sub save { my $s = shift; store $s->_posts, $s->file; } ### Private methods ### sub _load_posts { my $s = shift; if ( !-f $s->file ) { store { {} }, $s->file; } my $posts = retrieve $s->file; $s->_set_posts($posts); } 1;