File Coverage

blib/lib/DBIx/Lite/Schema/Table.pm
Criterion Covered Total %
statement 68 73 93.1
branch 16 28 57.1
condition 1 2 50.0
subroutine 13 13 100.0
pod 5 5 100.0
total 103 121 85.1


line stmt bran cond sub pod time code
1             package DBIx::Lite::Schema::Table;
2             $DBIx::Lite::Schema::Table::VERSION = '0.36';
3 7     7   217989 use strict;
  7         18  
  7         277  
4 7     7   38 use warnings;
  7         12  
  7         403  
5              
6 7     7   50 use Carp qw(croak);
  7         13  
  7         4519  
7             $Carp::Internal{$_}++ for __PACKAGE__;
8              
9             sub new {
10 5     5 1 11 my $class = shift;
11 5         24 my (%params) = @_;
12            
13             my $self = {
14             class => undef,
15             resultset_class => undef,
16 5   50     60 pk => delete $params{pk} || [],
17             has_many => {},
18             has_one => {},
19             };
20            
21 5         18 for (qw(name)) {
22 5 50       30 $self->{$_} = delete $params{$_} or croak "$_ argument needed";
23             }
24            
25 5 50       27 if ($self->{autopk} = delete $params{autopk}) {
26 0 0       0 !ref $self->{autopk} or croak "autopk only accepts a single column";
27 0         0 $self->{pk} = [$self->{autopk}];
28             }
29            
30 5 50       29 !%params
31             or croak "Unknown options: " . join(', ', keys %params);
32            
33 5         34 bless $self, $class;
34 5         42 $self;
35             }
36              
37             sub pk {
38 4     4 1 10 my $self = shift;
39 4         13 my @cols = @_;
40            
41 4 100       16 if (@cols) {
42             $self->{pk} = [
43             grep defined $_,
44 3 50       9 map { (ref $_ eq 'ARRAY') ? @$_ : $_ } @cols
  3         24  
45             ];
46 3         10 return $self;
47             }
48 1         2 return @{$self->{pk}};
  1         9  
49             }
50              
51             sub autopk {
52 5     5 1 14 my $self = shift;
53 5         11 my $val = shift;
54            
55 5 50       20 if ($val) {
56 0         0 $self->{autopk} = $val;
57 0         0 $self->{pk} = [$val];
58 0         0 return $self;
59             }
60 5         34 return $self->{autopk};
61             }
62              
63             sub class {
64 1     1 1 15 my ($self, $class, $constructor, $storage) = @_;
65            
66 1         4 $self->{class} = $class;
67 1         4 $self->{class_constructor} = $constructor;
68 1         3 $self->{class_storage} = $storage;
69            
70 1 50       4 return undef if !$class;
71            
72             # make the custom class inherit from our base
73 1 50       31 if (!$class->isa('DBIx::Lite::Row')) {
74 7     7   145 no strict 'refs';
  7         25  
  7         634  
75 1         2 push @{"${class}::ISA"}, 'DBIx::Lite::Row';
  1         17  
76             }
77            
78             # install the storage provider
79 1 50       6 if ($storage) {
80 7     7   49 no strict 'refs';
  7         13  
  7         315  
81 7     7   39 no warnings 'redefine';
  7         13  
  7         1994  
82 1         9 *{ "${class}::__dbix_lite_row_storage" } = sub {
83 1     1   4 my ($row) = @_;
84            
85 1 50       5 croak "$class does not provide a $storage method"
86             if !$row->can($storage);
87            
88 1         5 return $row->$storage;
89 1         7 };
90             }
91            
92 1         4 return $class;
93             }
94              
95             sub resultset_class {
96 30     30 1 62 my $self = shift;
97 30         58 my $class = shift;
98            
99 30 100       84 if ($class) {
100 1         11 $self->{resultset_class} = $class;
101 1         4 return $self;
102             }
103              
104 29         58 $class = $self->{resultset_class};
105 29 100       244 return undef if !$class;
106            
107             # make the custom class inherit from our base
108 1 50       23 if (!$class->isa('DBIx::Lite::ResultSet')) {
109 7     7   56 no strict 'refs';
  7         16  
  7         840  
110 1         2 push @{"${class}::ISA"}, 'DBIx::Lite::ResultSet';
  1         17  
111             }
112            
113 1         8 return $class;
114             }
115              
116             1;
117              
118             __END__