File Coverage

lib/Types/Standard/Tied.pm
Criterion Covered Total %
statement 47 47 100.0
branch 14 18 77.7
condition n/a
subroutine 13 13 100.0
pod n/a
total 74 78 94.8


line stmt bran cond sub pod time code
1             # INTERNAL MODULE: guts for Tied type from Types::Standard.
2              
3             package Types::Standard::Tied;
4              
5 3     3   67 use 5.008001;
  3         11  
6 3     3   17 use strict;
  3         7  
  3         77  
7 3     3   12 use warnings;
  3         5  
  3         275  
8              
9             BEGIN {
10 3     3   12 $Types::Standard::Tied::AUTHORITY = 'cpan:TOBYINK';
11 3         145 $Types::Standard::Tied::VERSION = '2.010001';
12             }
13              
14             $Types::Standard::Tied::VERSION =~ tr/_//d;
15              
16 3     3   17 use Type::Tiny ();
  3         4  
  3         62  
17 3     3   13 use Types::Standard ();
  3         5  
  3         44  
18 3     3   10 use Types::TypeTiny ();
  3         5  
  3         227  
19              
20 1     1   7 sub _croak ($;@) { require Error::TypeTiny; goto \&Error::TypeTiny::croak }
  1         7  
21              
22 3     3   15 no warnings;
  3         167  
  3         1605  
23              
24             sub __constraint_generator {
25 37 50   37   122 return Types::Standard->meta->get_type( 'Tied' ) unless @_;
26            
27 37         219 Type::Tiny::check_parameter_count_for_parameterized_type( 'Types::Standard', 'Tied', \@_, 1 );
28 37         123 my $param = Types::TypeTiny::to_TypeTiny( shift );
29 37 100       883 unless ( Types::TypeTiny::is_TypeTiny( $param ) ) {
30 27 100       251 Types::TypeTiny::is_StringLike( $param )
31             or _croak( "Parameter to Tied[`a] expected to be a class name; got $param" );
32 26         1411 require Type::Tiny::Class;
33 26         159 $param = "Type::Tiny::Class"->new( class => "$param" );
34             }
35            
36 36         229 my $check = $param->compiled_check;
37             sub {
38             $check->(
39             tied(
40 11         171 Scalar::Util::reftype( $_ ) eq 'HASH' ? %{$_}
41 11         103 : Scalar::Util::reftype( $_ ) eq 'ARRAY' ? @{$_}
42 33 50   33   197 : Scalar::Util::reftype( $_ ) =~ /^(SCALAR|REF)$/ ? ${$_}
  11 100       107  
    100          
43             : undef
44             )
45             );
46 36         253 };
47             } #/ sub __constraint_generator
48              
49             sub __inline_generator {
50 36     36   102 my $param = Types::TypeTiny::to_TypeTiny( shift );
51 36 100       818 unless ( Types::TypeTiny::is_TypeTiny( $param ) ) {
52 26 50       199 Types::TypeTiny::is_StringLike( $param )
53             or _croak( "Parameter to Tied[`a] expected to be a class name; got $param" );
54 26         121 require Type::Tiny::Class;
55 26         131 $param = "Type::Tiny::Class"->new( class => "$param" );
56             }
57 36 50       224 return unless $param->can_be_inlined;
58            
59             sub {
60 106     106   572 require B;
61 106         202 my $var = $_[1];
62 106         491 sprintf(
63             "%s and do { my \$TIED = tied(Scalar::Util::reftype($var) eq 'HASH' ? \%{$var} : Scalar::Util::reftype($var) eq 'ARRAY' ? \@{$var} : Scalar::Util::reftype($var) =~ /^(SCALAR|REF)\$/ ? \${$var} : undef); %s }",
64             Types::Standard::Ref()->inline_check( $var ),
65             $param->inline_check( '$TIED' )
66             );
67             }
68 36         256 } #/ sub __inline_generator
69              
70             1;