File Coverage

blib/lib/Data/Localize/Trait/WithStorage.pm
Criterion Covered Total %
statement 38 45 84.4
branch 4 8 50.0
condition n/a
subroutine 10 11 90.9
pod 5 5 100.0
total 57 69 82.6


line stmt bran cond sub pod time code
1             package Data::Localize::Trait::WithStorage;
2 2     2   7788 use Moo::Role;
  2         4  
  2         12  
3 2     2   558 use Data::Localize;
  2         2  
  2         70  
4              
5             BEGIN {
6 2     2   1182 if (Data::Localize::DEBUG) {
7             require Data::Localize::Log;
8             Data::Localize::Log->import;
9             }
10             }
11              
12             has storage_class => (
13             is => 'ro',
14             default => sub {
15             return '+Data::Localize::Storage::Hash';
16             }
17             );
18              
19             has storage_args => (
20             is => 'ro',
21             default => sub { +{} }
22             );
23              
24             has 'load_from_storage' => (
25             is => 'ro',
26             default => sub { [] },
27             );
28              
29             has lexicon_map => (
30             is => 'ro',
31             default => sub { +{} },
32             );
33              
34             after BUILD => sub {
35             my $self = shift;
36              
37             my $langs = $self->load_from_storage;
38             if (! $langs || ! @$langs) {
39             if (Data::Localize::DEBUG) {
40             debugf("No languages to load");
41             }
42             return;
43             }
44             my $storage_class = $self->_canonicalize_storage_class;
45             my $storage_args = $self->storage_args;
46             if (Data::Localize::DEBUG) {
47             debugf("Building lexicon map (%s)", $storage_class);
48             }
49              
50             Module::Load::load( $storage_class );
51              
52             unless ( $storage_class->is_volatile ) {
53             foreach my $lang ( @$langs ) {
54             if (Data::Localize::DEBUG) {
55             debugf("Loading storage for lang '%s'", $lang);
56             }
57             $storage_args->{lang} = $lang;
58              
59             $self->set_lexicon_map(
60             $lang,
61             $storage_class->new( $storage_args )
62             );
63             }
64             }
65             };
66              
67             sub get_lexicon_map {
68 29     29 1 32 my ($self, $key) = @_;
69 29         70 return $self->lexicon_map->{ $key };
70             }
71              
72             sub set_lexicon_map {
73 5     5 1 8 my ($self, $key, $value) = @_;
74 5         16 return $self->lexicon_map->{ $key } = $value;
75             }
76              
77             sub get_lexicon {
78 23     23 1 31 my ($self, $lang, $id) = @_;
79 23         39 my $lexicon = $self->get_lexicon_map($lang);
80 23 50       45 return () unless $lexicon;
81 23         56 $lexicon->get($id);
82             }
83              
84             sub set_lexicon {
85 0     0 1 0 my ($self, $lang, $id, $value) = @_;
86 0         0 my $lexicon = $self->get_lexicon_map($lang);
87 0 0       0 if (! $lexicon) {
88 0         0 $lexicon = $self->_build_storage($lang);
89 0         0 $self->set_lexicon_map($lang, $lexicon);
90             }
91 0         0 $lexicon->set($id, $value);
92             }
93              
94             sub merge_lexicon {
95 6     6 1 9 my ($self, $lang, $new_lexicon) = @_;
96              
97 6         7 if (Data::Localize::DEBUG) {
98             debugf("Merging lexicon for lang '%s'", $lang);
99             }
100 6         15 my $lexicon = $self->get_lexicon_map($lang);
101 6 100       16 if (! $lexicon) {
102 5         12 $lexicon = $self->_build_storage($lang);
103 5         1748 $self->set_lexicon_map($lang, $lexicon);
104             }
105 6         27 while (my ($key, $value) = each %$new_lexicon) {
106 17         12 if (Data::Localize::DEBUG) {
107             debugf("Setting lexicon '%s' on '%s'", $key, Scalar::Util::blessed $lexicon);
108             }
109 17         32 $lexicon->set($key, $value);
110             }
111             }
112              
113             sub _build_storage {
114 5     5   8 my ($self, $lang) = @_;
115              
116 5         12 my $class = $self->_canonicalize_storage_class;
117 5         14 my $args = $self->storage_args;
118              
119 5         46 Module::Load::load($class);
120              
121 5         240 $args->{lang} = $lang;
122              
123 5         5 if (Data::Localize::DEBUG) {
124             debugf("Creating storage '%s'", $class);
125             }
126 5         82 return $class->new( $args );
127             }
128              
129             sub _canonicalize_storage_class {
130 5     5   6 my $self = shift;
131 5         13 my $class = $self->storage_class;
132 5 50       35 if ($class !~ s/^\+//) {
133 0         0 $class = "Data::Localize::Storage::$class";
134             }
135 5         10 $class;
136             }
137              
138 2     2   10 no Moo::Role;
  2         3  
  2         8  
139              
140             1;
141              
142             __END__