File Coverage

blib/lib/Data/Record/Serialize/Role/Default.pm
Criterion Covered Total %
statement 23 23 100.0
branch 1 2 50.0
condition n/a
subroutine 12 12 100.0
pod 1 4 25.0
total 37 41 90.2


line stmt bran cond sub pod time code
1             package Data::Record::Serialize::Role::Default;
2              
3             # ABSTRACT: Default methods for Data::Record::Serialize
4              
5 20     20   301356 use v5.12;
  20         91  
6 20     20   683 use Moo::Role;
  20         19076  
  20         175  
7              
8             our $VERSION = '2.02';
9              
10 20     20   25164 use Hash::Util qw[ hv_store ];
  20         84184  
  20         175  
11 20     20   3013 use Ref::Util qw[ is_coderef ];
  20         3953  
  20         1580  
12              
13 20     20   545 use Data::Record::Serialize::Error { errors => ['fields'] }, -all;
  20         42  
  20         371  
14              
15 20     20   4821 use namespace::clean;
  20         18711  
  20         199  
16              
17              
18              
19              
20              
21              
22              
23              
24              
25              
26              
27              
28              
29              
30              
31              
32              
33              
34              
35              
36              
37             ## no critic( Subroutines::ProhibitBuiltinHomonyms )
38              
39             # provide default if not already defined
40             sub send {
41 40     40 1 279 my $self = shift;
42              
43 40 50       202 $self->_needs_eol
44             ? $self->say( $self->encode( @_ ) )
45             : $self->print( $self->encode( @_ ) );
46             }
47              
48             # just in case they're not defined in preceding roles
49       51 0   sub setup { }
50       64 0   sub finalize { }
51       120     sub _map_types { }
52 4     4   27 sub _needs_eol { 1 }
53              
54             around 'setup' => sub {
55             my ( $orig, $self, $data ) = @_;
56              
57             $self->setup_from_record( $data );
58              
59             $orig->( $self );
60              
61             $self->_set__run_setup( 0 );
62             };
63              
64             before 'close' => sub {
65             my ( $self, @args ) = @_;
66             $self->finalize( @args );
67             };
68              
69             before 'send' => sub {
70             my ( $self, $data ) = @_;
71              
72             # can't do format or numify until we have types, which might need to
73             # be done from the data, which will be done in setup.
74              
75             $self->setup( $data )
76             if $self->_run_setup;
77              
78             # remove fields that won't be output
79             delete @{$data}{ grep { !exists $self->_fieldh->{$_} } keys %{$data} };
80              
81             # nullify fields (set to undef) those that are zero length
82              
83             if ( defined( my $fields = $self->_nullified ) ) {
84             $data->{$_} = undef for grep { defined $data->{$_} && !length $data->{$_} } @$fields;
85             }
86              
87             if ( defined( my $fields = $self->_numified ) ) {
88             $data->{$_} = ( $data->{$_} || 0 ) +0 for grep { defined $data->{$_} } @{$fields};
89             }
90              
91             if ( defined( my $fields = $self->_stringified ) ) {
92             $data->{$_} = "@{[ $data->{$_}]}" for grep { defined $data->{$_} } @{$fields};
93             }
94              
95             if ( my $format = $self->_format ) {
96             $data->{$_}
97             = is_coderef( $format->{$_} )
98             ? $format->{$_}( $data->{$_} )
99             : sprintf( $format->{$_}, $data->{$_} )
100             foreach grep { defined $data->{$_} && length $data->{$_} }
101             keys %{$format};
102             }
103              
104              
105             # handle boolean
106             if ( $self->_boolify ) {
107             my @fields = grep { exists $data->{$_} } @{ $self->boolean_fields };
108              
109             if ( $self->_can_bool ) {
110             $data->{$_} = $self->to_bool( $data->{$_} ) for @fields;
111             }
112              
113             # the encoder doesn't have native boolean, must convert a
114             # truthy value to 0/1;
115             else {
116             $data->{$_} = $data->{$_} ? 1 : 0 foreach @fields;
117             }
118             }
119              
120             if ( my $rename = $self->rename_fields ) {
121             for my $from ( @{ $self->fields } ) {
122             my $to = $rename->{$from}
123             or next;
124              
125             hv_store( %$data, $to, $data->{$from} );
126             delete $data->{$from};
127             }
128             }
129             };
130              
131             sub DEMOLISH {
132 60     60 0 208019 my ( $self, $in_global_destruction ) = @_;
133              
134             # we can't make the decision about whether to pay attention during
135             # Global Destruction. the objects have to do that
136 60         1771 $self->close( $in_global_destruction );
137 60         1501 return;
138             }
139              
140             1;
141              
142             #
143             # This file is part of Data-Record-Serialize
144             #
145             # This software is Copyright (c) 2017 by Smithsonian Astrophysical Observatory.
146             #
147             # This is free software, licensed under:
148             #
149             # The GNU General Public License, Version 3, June 2007
150             #
151              
152             __END__