File Coverage

blib/lib/Sub/Meta/TypeSub.pm
Criterion Covered Total %
statement 42 42 100.0
branch 10 10 100.0
condition n/a
subroutine 12 12 100.0
pod 4 4 100.0
total 68 68 100.0


line stmt bran cond sub pod time code
1             package Sub::Meta::TypeSub;
2 3     3   921 use 5.010;
  3         41  
3 3     3   28 use strict;
  3         6  
  3         83  
4 3     3   38 use warnings;
  3         7  
  3         96  
5 3     3   441 use parent qw(Type::Tiny);
  3         357  
  3         20  
6              
7 3     3   24573 use Types::Standard qw(InstanceOf);
  3         74068  
  3         22  
8              
9 39     39 1 165 sub submeta_type { my $self = shift; return $self->{submeta_type} }
  39         159  
10              
11             ## override
12             sub new {
13 7     7 1 8505 my $class = shift;
14 7 100       36 my %params = ( @_ == 1 ) ? %{ $_[0] } : @_;
  1         4  
15              
16             ## no critic (Subroutines::ProtectPrivateSubs)
17 7 100       27 Type::Tiny::_croak "Need to supply submeta_type" unless exists $params{submeta_type};
18              
19 5 100       19 if (!exists $params{name}) {
20 4 100       21 $params{name} = $params{submeta_type}->submeta_strict_check ? 'StrictSub' : 'Sub';
21             }
22              
23 5         32 return $class->SUPER::new(%params);
24             }
25              
26             ## override
27 3     3 1 22 sub can_be_inlined { return !!0 }
28              
29             ## override
30             sub _build_display_name { ## no critic (ProhibitUnusedPrivateSubroutines)
31 3     3   728 my $self = shift;
32 3         8 return sprintf('%s[%s]', $self->name, $self->submeta_type->submeta->display);
33             }
34              
35             ## override
36             sub _build_constraint { ## no critic (ProhibitUnusedPrivateSubroutines)
37 3     3   162 my $self = shift;
38              
39             return sub {
40 16     16   2848 my $sub = shift;
41 16         45 my $other_meta = $self->submeta_type->coerce($sub);
42 16         38 $self->submeta_type->check($other_meta)
43             }
44 3         22 }
45              
46             ## override
47             sub get_message {
48 2     2 1 4860 my $self = shift;
49 2         5 my $sub = shift;
50              
51 2         18 my $default = $self->SUPER::get_message($sub);
52 2         7557 my $meta = $self->submeta_type->coerce($sub);
53              
54 2         60 state $SubMeta = InstanceOf['Sub::Meta'];
55              
56 2         133 my $message = "$default\n";
57 2 100       19 if ($SubMeta->check($meta)) {
58 1         15 $message .= $self->submeta_type->get_detail_message($meta);
59             }
60             else {
61 1         21 my $s = Type::Tiny::_dd($sub); ## no critic (Subroutines::ProtectPrivateSubs)
62 1         12 $message .= " Cannot find submeta of `$s`";
63             }
64 2         25 return $message;
65             }
66              
67             1;
68             __END__