File Coverage

lib/Email/MIME/Creator/ISO_2022_JP.pm
Criterion Covered Total %
statement 61 62 98.3
branch 13 16 81.2
condition 5 8 62.5
subroutine 11 11 100.0
pod 2 2 100.0
total 92 99 92.9


line stmt bran cond sub pod time code
1             package Email::MIME::Creator::ISO_2022_JP;
2            
3 4     4   465947 use strict;
  4         12  
  4         157  
4 4     4   24 use warnings;
  4         8  
  4         130  
5 4     4   1168 use Email::MIME;
  4         85976  
  4         99  
6 4     4   29 use Encode;
  4         8  
  4         541  
7 4     4   1134 use Sub::Install 'reinstall_sub';
  4         1879  
  4         38  
8            
9             BEGIN {
10 4 50   4   3405 if ( $Encode::VERSION < 2.11 ) {
11 0         0 require Encode::compat::MIME::Header::ISO_2022_JP;
12             }
13             }
14            
15             our $VERSION = '0.02';
16            
17             sub import {
18 7     7   11124 my $class = shift;
19            
20 7 100       129 if (!$class->can('create_utf8')) {
21 4         11 for my $method (qw(create header_str_set)) {
22 8         58 reinstall_sub({
23             as => "${method}_utf8",
24             into => $class,
25 8         221 code => \&{"Email::MIME::${method}"},
26             });
27             }
28             }
29 7         176 for my $method (qw(create header_str_set)) {
30 14         105 reinstall_sub({
31             as => $method,
32             into => "Email::MIME",
33 14         601 code => \&{"${class}\::${method}_iso_2022_jp"},
34             });
35             }
36            
37 7 100       502 unless (grep /^$class/, @Email::MIME::ISA) {
38 4         76 push @Email::MIME::ISA, $class;
39             }
40             }
41            
42             sub unimport {
43 3     3   3888 my $class = shift;
44            
45 3 50       30 if ($class->can('create_utf8')) {
46 3         7 for my $method (qw(create header_str_set)) {
47 6         95 reinstall_sub({
48             as => $method,
49             into => "Email::MIME",
50 6         293 code => \&{"${class}\::${method}_utf8"},
51             });
52             }
53             }
54             }
55            
56             sub create_iso_2022_jp {
57 10     10 1 164 my ($class, %args) = @_;
58            
59 10 100       34 if (exists $args{header_str}) {
60 6   100     32 $args{attributes}{charset} ||= 'ISO-2022-JP';
61            
62 6         6 my @headers = @{ delete $args{header_str} };
  6         26  
63 6   50     43 $args{header} ||= [];
64 6 50       24 pop @headers if @headers % 2 == 1;
65 6         27 while (my ($key, $value) = splice @headers, 0, 2) {
66 16         33037 push @{$args{header}},
  16         63  
67             ( $key => Encode::encode('MIME-Header-ISO_2022_JP', $value) );
68             }
69             }
70 10 100       1120 if (exists $args{body_str}) {
71 6   50     25 $args{attributes}{charset} ||= 'ISO-2022-JP';
72 6   50     23 $args{attributes}{encoding} ||= '7bit';
73             }
74            
75 10         94 my $email = $class->create_utf8(%args); # i.e. original create
76            
77 10         14207 my $remove; $remove = sub {
78 14     14   23 my ($email) = @_;
79            
80 14         41 my @parts = $email->parts;
81 14 100       173 return if $email eq $parts[0]; # avoid recursion
82            
83 2         5 foreach my $part (@parts) {
84 4         14 $part->header_set(Date => ());
85 4         149 $part->header_set('MIME-Version' => ());
86 4         137 $remove->($part);
87             }
88 2         9 $email->parts_set(\@parts);
89 10         66 };
90 10         30 $remove->($email);
91            
92 10         2807 return $email;
93             }
94            
95             sub header_str_set_iso_2022_jp {
96 2     2 1 28 my ($self, $name, @vals) = @_;
97            
98 2         6 my @values = map { Encode::encode('MIME-Header-ISO_2022_JP', $_, 1) } @vals;
  2         6  
99            
100 2         368 $self->header_set($name => @values);
101             }
102            
103             1;
104            
105             __END__