File Coverage

blib/lib/rperlnames.pm
Criterion Covered Total %
statement 24 84 28.5
branch 0 16 0.0
condition 0 6 0.0
subroutine 8 10 80.0
pod n/a
total 32 116 27.5


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 9     9   57 use strict;
  9         18  
  9         236  
5 9     9   42 use warnings;
  9         16  
  9         217  
6 9     9   42 use RPerl::Config;
  9         15  
  9         1110  
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 9     9   57 use rperltypes;
  9         19  
  9         202  
15 9     9   2942 use rperlnamespaces;
  9         29  
  9         283  
16              
17             #BEGIN { print 'in rperlnames.pm, have @INC = ' . "\n" . Dumper(\@INC) . "\n"; }
18              
19 9     9   3648 use PadWalker qw(peek_my peek_our);
  9         4717  
  9         1516  
20              
21             # NEED UPGRADE: somehow reduce duplicate code of name() and scope_type_name_value(), not easy due to PadWalker magic!
22             #my string $name = sub {
23             sub name {
24 0     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 9     9   64 $pad = do { no strict 'refs'; \%{$namespace} }; # pad stash
  9         20  
  9         2511  
  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             #my string $scope_type_name_value = sub {
64             sub scope_type_name_value {
65 0     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 9     9   61 $pad = do { no strict 'refs'; \%{$namespace} }; # pad stash
  9         21  
  9         1293  
  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;