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.005004';
3 2     2   11687 use strict;
  2         5  
  2         72  
4 2     2   8 use warnings;
  2         4  
  2         90  
5              
6 2     2   10 use MRO::Compat;
  2         5  
  2         49  
7 2     2   8 use Sub::Exporter 'build_exporter';
  2         5  
  2         19  
8 2     2   659 use Carp 'croak';
  2         5  
  2         1397  
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 4 sub perl_version { return $_[1] }
15              
16 2     2 0 4 sub experimental { $_[1] }
17              
18             sub import {
19 4     4   5208 my $self = shift;
20              
21 4         12 my $inheritor = caller(0);
22 4         22 my $args = $self->parse_arguments(\@_);
23 4         15 my $perl_version = $self->perl_version($args->{perl_version});
24 4         17 my $experimental = $self->experimental($args->{experimental});
25 4         12 my @rest = @{$args->{rest}};
  4         9  
26              
27 4         20 $self->set_base($inheritor, $args->{base});
28 4         8 $inheritor->load_components(@{$args->{components}});
  4         64  
29              
30 4         56 @_ = ($self, @rest);
31 4         17 my $import = build_exporter({
32             installer => $self->installer,
33             collectors => [ INIT => $self->gen_INIT($perl_version, $inheritor, $experimental) ],
34             });
35              
36 4         767 goto $import
37             }
38              
39             sub parse_arguments {
40 4     4 0 10 my $self = shift;
41 4         7 my @args = @{shift @_};
  4         11  
42              
43 4         13 my $skipnext;
44             my $base;
45 4         0 my @rest;
46 4         8 my $perl_version = undef;
47 4         8 my $components = [];
48 4         8 my $experimental;
49              
50 4         15 for my $idx ( 0 .. $#args ) {
51 4         8 my $val = $args[$idx];
52              
53 4 50       13 next unless defined $val;
54 4 100       10 if ($skipnext) {
55 2         4 $skipnext--;
56 2         5 next;
57             }
58              
59 2 50       8 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         26 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 8 my ($self) = @_;
87             sub {
88 4     4   479 Sub::Exporter::default_installer @_;
89             }
90 4         25 }
91              
92             sub set_base {
93 4     4 0 9 my ($self, $inheritor, $base) = @_;
94              
95             # inlined from parent.pm
96 4         12 for ( my @useless = $self->base($base) ) {
97 4         47 s{::|'}{/}g;
98 4         30 require "$_.pm"; # dies if the file is not found
99             }
100              
101             {
102 2     2   14 no strict 'refs';
  2         4  
  2         650  
  4         7  
103             # This is more efficient than push for the new MRO
104             # at least until the new MRO is fixed
105 4         6 @{"$inheritor\::ISA"} = (@{"$inheritor\::ISA"} , $self->base($base));
  4         83  
  4         23  
106             }
107             }
108              
109             sub gen_INIT {
110 4     4 0 13 my ($self, $perl_version, $inheritor, $experimental) = @_;
111             sub {
112 4     4   317 my $orig = $_[1]->{import_args};
113 4         8 $_[1]->{import_args} = [];
114              
115 4         28 strict->import;
116 4         97 warnings->import;
117              
118 4 100       13 if ($perl_version) {
119 2         13 require feature;
120 2         258 feature->import(":5.$perl_version")
121             }
122              
123 4 100       12 if ($experimental) {
124 2         9 require experimental;
125 2 50 33     34 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         17 experimental::->import(@$experimental)
129             }
130              
131 4         113 mro::set_mro($inheritor, 'c3');
132              
133 4         12 1;
134             }
135 4         32 }
136              
137             1;
138              
139             __END__