| 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; |