File Coverage

blib/lib/DBIx/Class/CDBICompat/Constraints.pm
Criterion Covered Total %
statement 6 30 20.0
branch 0 22 0.0
condition n/a
subroutine 2 7 28.5
pod 0 2 0.0
total 8 61 13.1


line stmt bran cond sub pod time code
1             package # hide from PAUSE
2             DBIx::Class::CDBICompat::Constraints;
3              
4 2     2   1210 use strict;
  2         4  
  2         56  
5 2     2   8 use warnings;
  2         3  
  2         888  
6              
7             sub constrain_column {
8 0     0 0   my $class = shift;
9 0 0         my $col = $class->find_column(+shift)
10             or return $class->throw_exception("constraint_column needs a valid column");
11 0 0         my $how = shift
12             or return $class->throw_exception("constrain_column needs a constraint");
13 0 0         if (ref $how eq "ARRAY") {
    0          
14 0           my %hash = map { $_ => 1 } @$how;
  0            
15 0     0     $class->add_constraint(list => $col => sub { exists $hash{ +shift } });
  0            
16             } elsif (ref $how eq "Regexp") {
17 0     0     $class->add_constraint(regexp => $col => sub { shift =~ $how });
  0            
18             } else {
19 0           $how =~ m/([^:]+)$/; # match is safe - we throw above on empty $how
20 0           my $try_method = sprintf '_constrain_by_%s', lc $1; # $how->moniker;
21 0 0         if (my $dispatch = $class->can($try_method)) {
22 0           $class->$dispatch($col => ($how, @_));
23             } else {
24 0           $class->throw_exception("Don't know how to constrain $col with $how");
25             }
26             }
27             }
28              
29             sub add_constraint {
30 0     0 0   my $class = shift;
31 0 0         $class->_invalid_object_method('add_constraint()') if ref $class;
32 0 0         my $name = shift or return $class->throw_exception("Constraint needs a name");
33 0 0         my $column = $class->find_column(+shift)
34             or return $class->throw_exception("Constraint $name needs a valid column");
35 0 0         my $code = shift
36             or return $class->throw_exception("Constraint $name needs a code reference");
37 0 0         return $class->throw_exception("Constraint $name '$code' is not a code reference")
38             unless ref($code) eq "CODE";
39              
40             #$column->is_constrained(1);
41             $class->add_trigger(
42             "before_set_$column" => sub {
43 0     0     my ($self, $value, $column_values) = @_;
44 0 0         $code->($value, $self, $column, $column_values)
45             or return $self->throw_exception(
46             "$class $column fails '$name' constraint with '$value'");
47             }
48 0           );
49             }
50              
51             1;