File Coverage

lib/Pcore/Util/Class.pm
Criterion Covered Total %
statement 39 54 72.2
branch 8 16 50.0
condition 2 6 33.3
subroutine 5 10 50.0
pod 0 8 0.0
total 54 94 57.4


line stmt bran cond sub pod time code
1             package Pcore::Util::Class;
2              
3 3     3   17 use Pcore;
  3         5  
  3         19  
4 3     3   23 use Sub::Util qw[]; ## no critic qw[Modules::ProhibitEvilModules]
  3         9  
  3         2668  
5              
6 4     4 0 8 sub load ( $class, @ ) {
  4         8  
  4         7  
7 4         19 my %args = (
8             ns => undef,
9             isa => undef, # InstanceOf
10             does => undef, # ConsumerOf
11             splice @_, 1,
12             );
13              
14 4         8 my $module;
15              
16 4 50       16 if ( substr( $class, -3 ) eq '.pm' ) {
17 0         0 $module = $class;
18              
19 0         0 $class =~ s[/][::]smg;
20              
21 0         0 substr $class, -3, 3, q[];
22             }
23             else {
24 4         14 $class = resolve_class_name( $class, $args{ns} );
25              
26 4         22 $module = ( $class =~ s[::][/]smgr ) . '.pm';
27             }
28              
29 4         1290 require $module;
30              
31 4 50 33     25 die qq[Error loading class "$class". Class must be instance of "$args{isa}"] if $args{isa} && !$class->isa( $args{isa} );
32              
33 4 50 33     21 die qq[Error loading class "$class". Class must be consumer of "$args{does}"] if $args{does} && !$class->does( $args{does} );
34              
35 4         26 return $class;
36             }
37              
38 6     6 0 12 sub find ( $class, @ ) {
  6         9  
  6         9  
39 6         23 my %args = (
40             ns => undef,
41             splice @_, 1,
42             );
43              
44 6         11 my $class_filename;
45              
46 6 50       18 if ( $class =~ /[.]pm\z/sm ) {
47 0         0 $class_filename = $class;
48             }
49             else {
50 6         17 $class = resolve_class_name( $class, $args{ns} );
51              
52 6         23 $class_filename = ( $class =~ s[::][/]smgr ) . q[.pm];
53             }
54              
55 6         10 my $found;
56              
57             # find class in @INC
58 6         12 for my $inc ( grep { !ref } @INC ) {
  54         78  
59 22 100       236 if ( -f "$inc/$class_filename" ) {
60 4         11 $found = "$inc/$class_filename";
61              
62 4         8 last;
63             }
64             }
65              
66 6         26 return $found;
67             }
68              
69 10     10 0 14 sub resolve_class_name ( $class, $ns = undef ) {
  10         13  
  10         18  
  10         13  
70 10 50       24 if ( substr( $class, 0, 1 ) eq '+' ) {
71 0         0 return $class;
72             }
73             else {
74 10 50       40 return $ns ? "${ns}::$class" : $class;
75             }
76             }
77              
78             sub set_sub_prototype {
79 0     0 0   return &Sub::Util::set_prototype; ## no critic qw[Subroutines::ProhibitAmpersandSigils]
80             }
81              
82             sub get_sub_prototype {
83 0     0 0   return &Sub::Util::prototype; ## no critic qw[Subroutines::ProhibitAmpersandSigils]
84             }
85              
86             # allow to specify name as '::<name>', caller namespace will be used as full sub name
87             sub set_subname {
88 0     0 0   return &Sub::Util::set_subname; ## no critic qw[Subroutines::ProhibitAmpersandSigils]
89             }
90              
91             sub get_sub_name {
92 0     0 0   my ( $package, $name ) = &Sub::Util::subname =~ /^(.+)::(.+)$/sm; ## no critic qw[Subroutines::ProhibitAmpersandSigils]
93              
94 0           return $name;
95             }
96              
97             sub get_sub_fullname {
98 0     0 0   my $full_name = &Sub::Util::subname; ## no critic qw[Subroutines::ProhibitAmpersandSigils]
99              
100 0 0         if (wantarray) {
101 0           my ( $package, $name ) = $full_name =~ /^(.+)::(.+)$/sm;
102              
103 0           return $name, $package;
104             }
105             else {
106 0           return $full_name;
107             }
108             }
109              
110             1;
111             __END__
112             =pod
113              
114             =encoding utf8
115              
116             =cut