Yeah, committing the new tests would help ...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / HasOne.pm
CommitLineData
22b15c96 1package DBIx::Class::Relationship::HasOne;
2
3use strict;
4use warnings;
5
6sub has_one {
0567538f 7 my ($class, $acc_name, $f_class, $cond) = @_;
22b15c96 8 eval "require $f_class";
9 # single key relationship
0567538f 10 if (not defined $cond) {
22b15c96 11 my ($pri, $too_many) = keys %{ $f_class->_primaries };
12 my $acc_type = ($class->_columns->{$acc_name}) ? 'filter' : 'single';
13 $class->add_relationship($acc_name, $f_class,
14 { "foreign.${pri}" => "self.${acc_name}" },
15 { accessor => $acc_type }
16 );
17 }
18 # multiple key relationship
19 else {
20 my %f_primaries = %{ $f_class->_primaries };
0567538f 21 my $cond_rel;
22 for (keys %$cond) {
23 $cond_rel->{"foreign.$_"} = "self.".$cond->{$_};
22b15c96 24 # primary key usage checks
25 if (exists $f_primaries{$_}) {
26 delete $f_primaries{$_};
27 }
28 else
29 {
30 $class->throw("non primary key used in join condition: $_");
31 }
32 }
33 $class->throw("not all primary keys used in multi key relationship!") if keys %f_primaries;
34 $class->add_relationship($acc_name, $f_class,
0567538f 35 $cond_rel,
22b15c96 36 { accessor => 'single' }
37 );
38 }
39 return 1;
40}
41
421;