File Coverage

blib/lib/rperlnames.pm
Criterion Covered Total %
statement 24 88 27.2
branch 0 16 0.0
condition 0 6 0.0
subroutine 8 10 80.0
pod n/a
total 32 120 26.6


line stmt bran cond sub pod time code
1             ## no critic qw(Capitalization ProhibitMultiplePackages ProhibitReusedNames) # SYSTEM DEFAULT 3: allow multiple & lower case package names
2             package # hide from PAUSE indexing
3             rperlnames;
4 7     7   47 use strict;
  7         13  
  7         199  
5 7     7   34 use warnings;
  7         1446  
  7         216  
6 7     7   37 use RPerl::Config;
  7         12  
  7         1204  
7             our $VERSION = 0.001_010;
8              
9             1;
10              
11             # DEV NOTE, CORRELATION #rp008: export name() and scope_type_name_value() to main:: namespace;
12             # can't achieve via Exporter due to circular dependency issue caused by Exporter in Config.pm and solved by 'require rperltypes;' in RPerl.pm
13             package main;
14 7     7   42 use rperltypes;
  7         12  
  7         44  
15 7     7   2317 use rperlnamespaces;
  7         15  
  7         198  
16              
17             #BEGIN { print 'in rperlnames.pm, have @INC = ' . "\n" . Dumper(\@INC) . "\n"; }
18              
19 7     7   1688 use PadWalker qw(peek_my peek_our);
  7         3317  
  7         1305  
20              
21             # NEED UPGRADE: somehow reduce duplicate code of name() and scope_type_name_value(), not easy due to PadWalker magic!
22             sub name {
23 0     0     { my string $RETURN_TYPE };
  0            
24 0           my unknown $input_variable_ref = \$_[0];
25 0           my hashref $pad = peek_my 1; # pad my
26 0           for my string $name ( keys %{$pad} ) {
  0            
27 0 0         if ( $pad->{$name} == $input_variable_ref ) { return $name; }
  0            
28             }
29              
30 0           $pad = peek_our 1; # pad our
31 0           for my string $name ( keys %{$pad} ) {
  0            
32 0 0         if ( $pad->{$name} == $input_variable_ref ) { return $name; }
  0            
33             }
34              
35 0           my string_arrayref_arrayref $sigil_reftypes = [
36             [ '$', 'SCALAR' ],
37             [ '@', 'ARRAY' ],
38             [ '%', 'HASH' ],
39             [ '&', 'CODE' ]
40             ];
41 0           foreach my string $namespace (
42             ( caller() . '::' ),
43 0           sort keys %{ rperlnamespaces::hash_noncore_nonrperl() }
44             )
45             {
46 7     7   45 $pad = do { no strict 'refs'; \%{$namespace} }; # pad stash
  7         12  
  7         1998  
  0            
  0            
  0            
47 0           for my string $name ( keys %{$pad} ) {
  0            
48 0 0         if ( ( ref \$pad->{$name} ) ne 'GLOB' ) { next; }
  0            
49 0           for my string_arrayref $sigil_reftype ( @{$sigil_reftypes} ) {
  0            
50             my string $variable_ref
51 0           = *{ $pad->{$name} }{ $sigil_reftype->[1] };
  0            
52 0 0 0       if ( ( defined $variable_ref )
53             and ( $variable_ref == $input_variable_ref ) )
54             {
55 0           return ( $sigil_reftype->[0] . $namespace . $name );
56             }
57             }
58             }
59             }
60 0           return '$__NO_VARIABLE_NAME_FOUND';
61             }
62              
63             sub scope_type_name_value {
64 0     0     { my string $RETURN_TYPE };
  0            
65 0           my unknown $input_variable_ref = \$_[0];
66              
67 0           my string $type = type( ${$input_variable_ref} );
  0            
68 0           my string $value = to_string( ${$input_variable_ref} );
  0            
69              
70 0           my hashref $pad = peek_my 1; # pad my
71 0           for my string $name ( keys %{$pad} ) {
  0            
72 0 0         if ( $pad->{$name} == $input_variable_ref ) {
73             return (
74 0           'my' . q{ } . $type . q{ } . $name . q{ = } . $value . q{;} );
75             }
76             }
77              
78 0           $pad = peek_our 1; # pad our
79 0           for my string $name ( keys %{$pad} ) {
  0            
80 0 0         if ( $pad->{$name} == $input_variable_ref ) {
81 0           return ( 'our' . q{ }
82             . $type . q{ }
83             . $name . q{ = }
84             . $value
85             . q{;} );
86             }
87             }
88              
89 0           my string_arrayref_arrayref $sigil_reftypes = [
90             [ '$', 'SCALAR' ],
91             [ '@', 'ARRAY' ],
92             [ '%', 'HASH' ],
93             [ '&', 'CODE' ]
94             ];
95              
96 0           foreach my string $namespace (
97             ( caller() . '::' ),
98 0           sort keys %{ rperlnamespaces::hash_noncore_nonrperl() }
99             )
100             {
101             # RPerl::diag( 'in scope_type_name_value(), have $namespace = ' . $namespace . "\n" );
102 7     7   49 $pad = do { no strict 'refs'; \%{$namespace} }; # pad stash
  7         12  
  7         1025  
  0            
  0            
  0            
103 0           for my string $name ( keys %{$pad} ) {
  0            
104 0 0         if ( ( ref \$pad->{$name} ) ne 'GLOB' ) { next; }
  0            
105 0           for my string_arrayref $sigil_reftype ( @{$sigil_reftypes} ) {
  0            
106             my string $variable_ref
107 0           = *{ $pad->{$name} }{ $sigil_reftype->[1] };
  0            
108 0 0 0       if ( ( defined $variable_ref )
109             and ( $variable_ref == $input_variable_ref ) )
110             {
111 0           return ( $sigil_reftype->[0]
112             . $namespace
113             . $name . q{ = }
114             . $value
115             . q{; # }
116             . $type );
117             }
118             }
119             }
120             }
121 0           return $type . ' $__NO_VARIABLE_NAME_FOUND = ' . $value;
122             }
123              
124             1;