File Coverage

blib/lib/DBIx/Class/Candy/ResultSet.pm
Criterion Covered Total %
statement 78 85 91.7
branch 9 18 50.0
condition 2 5 40.0
subroutine 16 16 100.0
pod 0 7 0.0
total 105 131 80.1


line stmt bran cond sub pod time code
1             package DBIx::Class::Candy::ResultSet;
2             $DBIx::Class::Candy::ResultSet::VERSION = '0.005003';
3 2     2   7050 use strict;
  2         6  
  2         51  
4 2     2   9 use warnings;
  2         5  
  2         41  
5              
6 2     2   10 use MRO::Compat;
  2         5  
  2         41  
7 2     2   8 use Sub::Exporter 'build_exporter';
  2         5  
  2         20  
8 2     2   650 use Carp 'croak';
  2         5  
  2         1108  
9              
10             # ABSTRACT: Sugar for your resultsets
11              
12 4   50 4 0 16 sub base { return $_[1] || 'DBIx::Class::ResultSet' }
13              
14 2     2 0 5 sub perl_version { return $_[1] }
15              
16 2     2 0 5 sub experimental { $_[1] }
17              
18             sub import {
19 4     4   1912 my $self = shift;
20              
21 4         12 my $inheritor = caller(0);
22 4         19 my $args = $self->parse_arguments(\@_);
23 4         14 my $perl_version = $self->perl_version($args->{perl_version});
24 4         35 my $experimental = $self->experimental($args->{experimental});
25 4         14 my @rest = @{$args->{rest}};
  4         9  
26              
27 4         21 $self->set_base($inheritor, $args->{base});
28 4         8 $inheritor->load_components(@{$args->{components}});
  4         55  
29              
30 4         65 @_ = ($self, @rest);
31 4         20 my $import = build_exporter({
32             installer => $self->installer,
33             collectors => [ INIT => $self->gen_INIT($perl_version, $inheritor, $experimental) ],
34             });
35              
36 4         729 goto $import
37             }
38              
39             sub parse_arguments {
40 4     4 0 6 my $self = shift;
41 4         8 my @args = @{shift @_};
  4         12  
42              
43 4         13 my $skipnext;
44             my $base;
45 4         0 my @rest;
46 4         50 my $perl_version = undef;
47 4         10 my $components = [];
48 4         6 my $experimental;
49              
50 4         14 for my $idx ( 0 .. $#args ) {
51 4         10 my $val = $args[$idx];
52              
53 4 50       13 next unless defined $val;
54 4 100       11 if ($skipnext) {
55 2         5 $skipnext--;
56 2         6 next;
57             }
58              
59 2 50       11 if ( $val eq '-base' ) {
    0          
    0          
    0          
60 2         5 $base = $args[$idx + 1];
61 2         4 $skipnext = 1;
62             } elsif ( $val eq '-perl5' ) {
63 0         0 $perl_version = ord $args[$idx + 1];
64 0         0 $skipnext = 1;
65             } elsif ( $val eq '-experimental' ) {
66 0         0 $experimental = $args[$idx + 1];
67 0         0 $skipnext = 1;
68             } elsif ( $val eq '-components' ) {
69 0         0 $components = $args[$idx + 1];
70 0         0 $skipnext = 1;
71             } else {
72 0         0 push @rest, $val;
73             }
74             }
75              
76             return {
77 4         21 base => $base,
78             perl_version => $perl_version,
79             components => $components,
80             rest => \@rest,
81             experimental => $experimental,
82             };
83             }
84              
85             sub installer {
86 4     4 0 12 my ($self) = @_;
87             sub {
88 4     4   508 Sub::Exporter::default_installer @_;
89             }
90 4         27 }
91              
92             sub set_base {
93 4     4 0 11 my ($self, $inheritor, $base) = @_;
94              
95             # inlined from parent.pm
96 4         13 for ( my @useless = $self->base($base) ) {
97 4         47 s{::|'}{/}g;
98 4         29 require "$_.pm"; # dies if the file is not found
99             }
100              
101             {
102 2     2   17 no strict 'refs';
  2         7  
  2         556  
  4         8  
103             # This is more efficient than push for the new MRO
104             # at least until the new MRO is fixed
105 4         8 @{"$inheritor\::ISA"} = (@{"$inheritor\::ISA"} , $self->base($base));
  4         65  
  4         22  
106             }
107             }
108              
109             sub gen_INIT {
110 4     4 0 13 my ($self, $perl_version, $inheritor, $experimental) = @_;
111             sub {
112 4     4   347 my $orig = $_[1]->{import_args};
113 4         10 $_[1]->{import_args} = [];
114              
115 4         27 strict->import;
116 4         39 warnings->import;
117              
118 4 100       14 if ($perl_version) {
119 2         11 require feature;
120 2         150 feature->import(":5.$perl_version")
121             }
122              
123 4 100       15 if ($experimental) {
124 2         9 require experimental;
125 2 50 33     17 die 'experimental arg must be an arrayref!'
126             unless ref $experimental && ref $experimental eq 'ARRAY';
127             # to avoid experimental referring to the method
128 2         13 experimental::->import(@$experimental)
129             }
130              
131 4         118 mro::set_mro($inheritor, 'c3');
132              
133 4         12 1;
134             }
135 4         39 }
136              
137             1;
138              
139             __END__