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;