File Coverage

blib/lib/Type/Coercion/Union.pm
Criterion Covered Total %
statement 40 47 87.2
branch 8 16 50.0
condition n/a
subroutine 12 13 92.3
pod 3 3 100.0
total 63 79 81.0


line stmt bran cond sub pod time code
1             package Type::Coercion::Union;
2              
3 22     22   1351 use 5.008001;
  22         90  
4 22     22   132 use strict;
  22         60  
  22         590  
5 22     22   122 use warnings;
  22         41  
  22         1120  
6              
7             BEGIN {
8 22     22   89 $Type::Coercion::Union::AUTHORITY = 'cpan:TOBYINK';
9 22         980 $Type::Coercion::Union::VERSION = '2.002001';
10             }
11              
12             $Type::Coercion::Union::VERSION =~ tr/_//d;
13              
14 22     22   159 use Scalar::Util qw< blessed >;
  22         69  
  22         1178  
15 22     22   162 use Types::TypeTiny ();
  22         56  
  22         11933  
16              
17 1     1   410 sub _croak ($;@) { require Error::TypeTiny; goto \&Error::TypeTiny::croak }
  1         7  
18              
19             require Type::Coercion;
20             our @ISA = 'Type::Coercion';
21              
22             sub _preserve_type_constraint {
23 65     65   126 my $self = shift;
24             $self->{_union_of} = $self->{type_constraint}->type_constraints
25 65 50       1073 if $self->{type_constraint};
26             }
27              
28             sub _maybe_restore_type_constraint {
29 1     1   2 my $self = shift;
30 1 50       3 if ( my $union = $self->{_union_of} ) {
31 1         5 return Type::Tiny::Union->new( type_constraints => $union );
32             }
33 0         0 return; # uncoverable statement
34             }
35              
36             sub type_coercion_map {
37 17     17 1 22 my $self = shift;
38            
39 17         40 Types::TypeTiny::assert_TypeTiny( my $type = $self->type_constraint );
40 17 50       45 $type->isa( 'Type::Tiny::Union' )
41             or _croak
42             "Type::Coercion::Union must be used in conjunction with Type::Tiny::Union";
43            
44 17         23 my @c;
45 17         43 for my $tc ( @$type ) {
46 34 100       65 next unless $tc->has_coercion;
47 32         48 push @c, @{ $tc->coercion->type_coercion_map };
  32         56  
48             }
49 17         86 return \@c;
50             } #/ sub type_coercion_map
51              
52             sub add_type_coercions {
53 1     1 1 12 my $self = shift;
54 1 50       4 _croak "Adding coercions to Type::Coercion::Union not currently supported"
55             if @_;
56             }
57              
58             sub _build_moose_coercion {
59 0     0   0 my $self = shift;
60            
61 0         0 my %options = ();
62 0 0       0 $options{type_constraint} = $self->type_constraint
63             if $self->has_type_constraint;
64            
65 0         0 require Moose::Meta::TypeCoercion::Union;
66 0         0 my $r = "Moose::Meta::TypeCoercion::Union"->new( %options );
67            
68 0         0 return $r;
69             } #/ sub _build_moose_coercion
70              
71             sub can_be_inlined {
72 3     3 1 4 my $self = shift;
73            
74 3         6 Types::TypeTiny::assert_TypeTiny( my $type = $self->type_constraint );
75            
76 3         8 for my $tc ( @$type ) {
77 6 50       12 next unless $tc->has_coercion;
78 6 50       14 return !!0 unless $tc->coercion->can_be_inlined;
79             }
80            
81 3         9 !!1;
82             } #/ sub can_be_inlined
83              
84             1;
85              
86             __END__