File Coverage

blib/lib/Factory/Sub.pm
Criterion Covered Total %
statement 51 54 94.4
branch 13 14 92.8
condition 1 2 50.0
subroutine 13 13 100.0
pod 2 4 50.0
total 80 87 91.9


line stmt bran cond sub pod time code
1             package Factory::Sub;
2 2     2   135527 use 5.006; use strict; use warnings;
  2     2   18  
  2     2   10  
  2         3  
  2         59  
  2         10  
  2         4  
  2         59  
3 2     2   919 use Import::Into; use Carp qw/croak/; use Coerce::Types::Standard qw//;
  2     2   5445  
  2     2   60  
  2         13  
  2         3  
  2         89  
  2         1077  
  2         203677  
  2         175  
4             our $VERSION = '0.02';
5              
6             use overload
7 4     4   2042 "&{}" => sub {my $self = shift; sub { $self->call(@_) }},
  4         25  
  4         12  
8 2     2   16 fallback => 1;
  2         4  
  2         17  
9              
10             sub import {
11 2     2   38 my ($pkg, @import) = @_;
12 2 100       20 if (@import) {
13 1         2 my $target = caller;
14 1         16 Coerce::Types::Standard->import::into($target, @import)
15             }
16             }
17              
18             sub new {
19 1     1 0 87 bless { factory => [ ] }, $_[0];
20             }
21              
22             sub add {
23 4     4 1 3019 my ($self, @args) = @_;
24 4         6 push @{ $self->{factory} }, \@args;
  4         45  
25             }
26              
27             sub call {
28 4     4 1 9 my ($self, @params) = @_;
29             FACTORY:
30 4         7 for my $factory ( @{ $self->{factory} } ) {
  4         33  
31 10 100       13235 if ( scalar @{$factory} - 1 == scalar @params) {
  10         26  
32 7         12 my @factory_params = @{clone(\@params)};
  7         16  
33 7         26 for (my $i = 0; $i < scalar @factory_params; $i++) {
34 13 100       1774 eval { $factory_params[$i] = $factory->[$i]->(
35             ref $factory->[$i] eq 'Type::Tiny'
36 13 100 50     39 && scalar @{$factory->[$i]->{coercion}->{type_coercion_map}}
37             ? $factory->[$i]->coerce($factory_params[$i])
38             : $factory_params[$i]
39             ) } or next FACTORY;
40             }
41 4         1187 return $factory->[-1]->(@factory_params);
42             }
43             }
44 0         0 croak "No matching factory sub for given params " . join " ", @params;
45             }
46              
47             sub clone {
48 37     37 0 61 my ($clone) = @_;
49 37         48 my $ref = ref $clone;
50 37 100       83 if ($ref eq 'ARRAY') { return [ map { clone($_) } @{$clone} ]; }
  10 100       15  
  24 50       36  
  10         19  
51 6         9 elsif ($ref eq 'HASH') { return { map +( $_ => clone($clone->{$_}) ), keys %{$clone} }; }
  6         22  
52 0         0 elsif ($ref eq 'SCALAR') { my $r = clone($$clone); return \$r; }
  0         0  
53 21         75 return $clone;
54             }
55              
56             1;
57              
58             __END__;