File Coverage

blib/lib/Perinci/Object/Metadata.pm
Criterion Covered Total %
statement 78 79 98.7
branch 22 24 91.6
condition 21 23 91.3
subroutine 12 13 92.3
pod 9 9 100.0
total 142 148 95.9


line stmt bran cond sub pod time code
1             package Perinci::Object::Metadata;
2              
3             our $DATE = '2017-02-03'; # DATE
4             our $VERSION = '0.30'; # VERSION
5              
6 5     5   1948 use 5.010;
  5         12  
7 5     5   22 use strict;
  5         8  
  5         103  
8 5     5   19 use warnings;
  5         5  
  5         3668  
9              
10             # BEGIN COPY-PASTE FROM String::Trim::More
11             sub __trim_blank_lines {
12 39     39   33 local $_ = shift;
13 39 50       56 return $_ unless defined;
14 39         26 s/\A(?:\n\s*)+//;
15 39         53 s/(?:\n\s*){2,}\z/\n/;
16 39         59 $_;
17             }
18             # END COPY-PASTE
19              
20             sub new {
21 19     19 1 28 my ($class, $meta) = @_;
22 19   50     42 $meta //= {};
23 19         22 my $obj = \$meta;
24 19         52 bless $obj, $class;
25             }
26              
27             sub v {
28 8     8 1 12 my $self = shift;
29 8   100     9 ${$self}->{v} // 1.0;
  8         92  
30             }
31              
32             sub type {
33 0     0 1 0 die "BUG: type() must be subclassed";
34             }
35              
36             sub as_struct {
37 1     1 1 3 my $self = shift;
38 1         1 ${$self};
  1         6  
39             }
40              
41             sub langprop {
42 39     39 1 3085 my $self = shift;
43 39         28 my $opts;
44 39 100       61 if (ref($_[0]) eq 'HASH') {
45 32         22 $opts = shift;
46             } else {
47 7         8 $opts = {};
48             }
49 39         33 my $prop = shift;
50              
51 39   100     30 my $deflang = ${$self}->{default_lang} // "en_US";
  39         116  
52 39   66     116 my $olang = $opts->{lang} || $ENV{LANGUAGE} || $ENV{LANG} || $deflang;
53 39         64 $olang =~ s/\W.+//; # change "en_US.UTF-8" to "en_US"
54 39 50       56 $olang = "en_US" if $olang eq 'C';
55 39         153 (my $olang2 = $olang) =~ s/\A([a-z]{2})_[A-Z]{2}\z/$1/; # change "en_US" to "en"
56 39   100     102 my $mark = $opts->{mark_different_lang} // 1;
57             #print "deflang=$deflang, olang=$olang, mark_different_lang=$mark\n";
58              
59 39         26 my @k;
60 39 100       45 if ($olang eq $deflang) {
61 18         32 @k = ([$olang, $prop, 0]);
62             } else {
63 21         80 @k = (
64             [$olang, "$prop.alt.lang.$olang", 0],
65             ([$olang2, "$prop.alt.lang.$olang2", 0]) x !!($olang2 ne $olang),
66             [$deflang, $prop, $mark],
67             );
68             }
69              
70 39         30 my $v;
71             GET:
72 39         40 for my $k (@k) {
73             #print "k=".join(", ", @$k)."\n";
74 47         30 $v = ${$self}->{$k->[1]};
  47         63  
75 47 100       66 if (defined $v) {
76 39 100       47 if ($k->[2]) {
77 3         5 my $has_nl = $v =~ s/\n\z//;
78 3 100       10 $v = "{$olang|$k->[0] $v}" . ($has_nl ? "\n" : "");
79             }
80 39         44 $v = __trim_blank_lines($v);
81 39         49 last GET;
82             }
83             }
84              
85 39 100       55 if (@_) {
86             # set value
87 10         8 ${$self}->{$k[0][1]} = $_[0];
  10         14  
88             }
89              
90 39         135 $v;
91             }
92              
93             sub name {
94 6     6 1 8 my $self = shift;
95 6         4 my $opts;
96 6 100 100     23 if (@_ && ref($_[0]) eq 'HASH') {
97 3         3 $opts = shift;
98             } else {
99 3         3 $opts = {};
100             }
101 6         9 $self->langprop($opts, "name", @_);
102             }
103              
104             sub caption {
105 6     6 1 7 my $self = shift;
106 6         1 my $opts;
107 6 100 100     36 if (@_ && ref($_[0]) eq 'HASH') {
108 3         4 $opts = shift;
109             } else {
110 3         3 $opts = {};
111             }
112 6         9 $self->langprop($opts, "caption", @_);
113             }
114              
115             sub summary {
116 6     6 1 5 my $self = shift;
117 6         5 my $opts;
118 6 100 100     23 if (@_ && ref($_[0]) eq 'HASH') {
119 3         4 $opts = shift;
120             } else {
121 3         2 $opts = {};
122             }
123 6         9 $self->langprop($opts, "summary", @_);
124             }
125              
126             sub description {
127 6     6 1 7 my $self = shift;
128 6         6 my $opts;
129 6 100 100     22 if (@_ && ref($_[0]) eq 'HASH') {
130 3         2 $opts = shift;
131             } else {
132 3         3 $opts = {};
133             }
134 6         10 $self->langprop($opts, "description", @_);
135             }
136              
137             1;
138             # ABSTRACT: Base class for Perinci::Object metadata classes
139              
140             __END__