File Coverage

blib/lib/Sub/Lib.pm
Criterion Covered Total %
statement 53 53 100.0
branch 20 20 100.0
condition n/a
subroutine 16 16 100.0
pod 8 8 100.0
total 97 97 100.0


line stmt bran cond sub pod time code
1             package Sub::Lib;
2              
3 1     1   12978 use strict;
  1         2  
  1         22  
4 1     1   4 use warnings;
  1         1  
  1         20  
5 1     1   10 use v5.8.8;
  1         5  
6              
7             our $VERSION = '0.03';
8              
9             sub new {
10 5     5 1 2435 my ($class, @args) = @_;
11              
12 5         5 my $args;
13 5 100       11 if(1 == @args) {
14 2 100       8 die "reference argument to new() must be a HASH\n"
15             unless 'HASH' eq ref $args[0];
16 1         3 $args = $args[0];
17             }
18             else {
19 3 100       11 die "non-reference argument list to new() must have an even number of elements\n"
20             unless 0 == @args % 2;
21 2         4 $args = {@args};
22             }
23              
24             # \o/ Lobe den Abgrund
25 3         3 my $self = bless do {
26 3         3 my $_lib = { };
27             sub {
28 15     15   1672 my ($name, $sub) = @_;
29              
30 15 100       26 return $_lib
31             unless defined $name;
32              
33 10 100       16 if(defined $sub) {
34 3 100       15 die "sub-routine ($name) is not a sub-routine?\n"
35             unless 'CODE' eq ref $sub;
36             die "sub-routine ($name) already installed in library\n"
37 2 100       8 if exists $_lib->{$name};
38              
39 1         1 $_lib->{$name} = $sub;
40             }
41             else {
42             die "sub-routine ($name) not installed in library\n"
43 7 100       15 unless exists $_lib->{$name};
44             }
45              
46 7         13 return $_lib->{$name};
47             }
48 3         13 }, $class;
49              
50             $self->($_, $args->{$_})
51 3         9 for keys %$args;
52 2         3 return $self;
53             }
54              
55             sub has {
56 2     2 1 6 my ($self, $name) = @_;
57              
58 2         3 my $_lib = $self->();
59 2         7 return $_lib->{$name};
60             }
61              
62             sub run {
63 1     1 1 334 my ($self, $name, @args) = @_;
64              
65 1         3 return $self->($name)->(@args);
66             }
67              
68             sub call {
69 1     1 1 328 my ($self, $name, $object, @args) = @_;
70              
71 1         3 my $sub = $self->($name);
72 1         3 return $object->$sub(@args);
73             }
74              
75             sub void {
76 2     2 1 572 my ($self, $name) = @_;
77              
78 2         5 my $_lib = $self->();
79             my $sub = exists $_lib->{$name}
80             ? $_lib->{$name}
81 1     1   3 : sub { return }
82 2 100       8 ;
83              
84 2         5 return $sub;
85             }
86              
87             sub curry {
88 1     1 1 2 my ($self, $name, @args) = @_;
89              
90 1         2 my $sub = $self->($name);
91 1     1   4 return sub { $sub->(@args, @_) };
  1         5  
92             }
93              
94             sub o {
95 1     1 1 321 my ($self, $name, $object, @args) = @_;
96              
97 1         5 my $sub = $self->($name);
98 1     1   5 return sub { $object->$sub(@args, @_) };
  1         4  
99             }
100              
101             sub y {
102 2     2 1 919 my ($self, $name, $sub, @args) = @_;
103              
104 2 100       10 die "code reference required for lambda\n"
105             unless 'CODE' eq ref $sub;
106              
107 1     1   2 return sub { $sub->( $self->($name), @args, @_ ) }
108 1         4 }
109              
110              
111             1
112             __END__