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.33';
3 3     3   21 use strict;
  3         5  
  3         88  
4 3     3   15 use warnings;
  3         4  
  3         92  
5              
6 3     3   16 use Carp qw(croak);
  3         5  
  3         1428  
7             $Carp::Internal{$_}++ for __PACKAGE__;
8              
9             sub new {
10 4     4 1 11 my $class = shift;
11 4         21 my (%params) = @_;
12            
13             my $self = {
14             class => undef,
15             resultset_class => undef,
16 4   50     55 pk => delete $params{pk} || [],
17             has_many => {},
18             has_one => {},
19             };
20            
21 4         18 for (qw(name)) {
22 4 50       26 $self->{$_} = delete $params{$_} or croak "$_ argument needed";
23             }
24            
25 4 50       20 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 4 50       14 !%params
31             or croak "Unknown options: " . join(', ', keys %params);
32            
33 4         12 bless $self, $class;
34 4         33 $self;
35             }
36              
37             sub pk {
38 4     4 1 10 my $self = shift;
39 4         11 my @cols = @_;
40            
41 4 100       14 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         3 return @{$self->{pk}};
  1         8  
49             }
50              
51             sub autopk {
52 5     5 1 16 my $self = shift;
53 5         11 my $val = shift;
54            
55 5 50       19 if ($val) {
56 0         0 $self->{autopk} = $val;
57 0         0 $self->{pk} = [$val];
58 0         0 return $self;
59             }
60 5         30 return $self->{autopk};
61             }
62              
63             sub class {
64 1     1 1 4 my ($self, $class, $constructor, $storage) = @_;
65            
66 1         3 $self->{class} = $class;
67 1         3 $self->{class_constructor} = $constructor;
68 1         2 $self->{class_storage} = $storage;
69            
70 1 50       3 return undef if !$class;
71            
72             # make the custom class inherit from our base
73 1 50       12 if (!$class->isa('DBIx::Lite::Row')) {
74 3     3   25 no strict 'refs';
  3         5  
  3         193  
75 1         3 push @{"${class}::ISA"}, 'DBIx::Lite::Row';
  1         26  
76             }
77            
78             # install the storage provider
79 1 50       12 if ($storage) {
80 3     3   21 no strict 'refs';
  3         6  
  3         118  
81 3     3   21 no warnings 'redefine';
  3         6  
  3         569  
82 1         9 *{ "${class}::__dbix_lite_row_storage" } = sub {
83 1     1   2 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 25     25 1 75 my $self = shift;
97 25         80 my $class = shift;
98            
99 25 100       71 if ($class) {
100 1         3 $self->{resultset_class} = $class;
101 1         3 return $self;
102             }
103              
104 24         72 $class = $self->{resultset_class};
105 24 100       169 return undef if !$class;
106            
107             # make the custom class inherit from our base
108 1 50       13 if (!$class->isa('DBIx::Lite::ResultSet')) {
109 3     3   23 no strict 'refs';
  3         6  
  3         300  
110 1         2 push @{"${class}::ISA"}, 'DBIx::Lite::ResultSet';
  1         13  
111             }
112            
113 1         5 return $class;
114             }
115              
116             1;
117              
118             __END__