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