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;