package DeWeave::Collection;
use Moose;
use namespace::autoclean;
use MooseX::Types::Moose qw(ArrayRef);
use JSON::Any;
use DeWeave::EDO;
use Lingua::EN::Inflect::Number 'to_S';
has items => (
isa => ArrayRef['DeWeave::WBO'],
is => 'ro',
required => 1,
);
sub _local_part {
my ($class) = @_;
my ($sub) = ($class =~ m{^DeWeave::Collection::(\w+)});
return $sub;
}
sub item_class {
my ($class) = @_;
my $sub = ucfirst(to_S(lc($class->_local_part)));
return "DeWeave::BO::$sub" if $sub;
return 'DeWeave::WBO'
}
sub items_path {
my ($class) = @_;
my $sub = lc($class->_local_part);
return "storage/$sub";
}
sub from_json {
my ($class,$json,$crypt)=@_;
my $j = JSON::Any->new;
my $args = $j->decode($json);
my @items = map {
$class->item_class->new({%$_,__crypt=>$crypt})
} @$args;
return $class->new({
items => \@items,
});
}
sub fetch {
my ($class,$storage,$crypto) = @_;
my $path = $class->items_path;
my $data = $storage->get_item($path);
return $class->from_json(
$data,
$crypto,
);
}
1;