Addition of a bunch of helper relationship methods
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class / Relationship / HasOne.pm
CommitLineData
22b15c96 1package DBIx::Class::Relationship::HasOne;
2
3use strict;
4use warnings;
5
07037f89 6sub might_have {
7 shift->_has_one('LEFT' => @_);
8}
9
22b15c96 10sub has_one {
07037f89 11 shift->_has_one(undef => @_);
12}
13
14sub _has_one {
15 my ($class, $join_type, $rel, $f_class, @columns) = @_;
16 my $cond;
17 if (ref $columns[0]) {
18 $cond = shift @columns;
19 } else {
20 my ($pri, $too_many) = keys %{ $class->_primaries };
21 $class->throw( "might_have/has_one can only infer join for a single primary key; ${class} has more" )
22 if $too_many;
23 my $f_key;
24 if ($f_class->_columns->{$rel}) {
25 $f_key = $rel;
26 } else {
27 ($f_key, $too_many) = keys %{ $f_class->_primaries };
28 $class->throw( "might_have/has_one can only infer join for a single primary key; ${f_class} has more" )
29 if $too_many;
22b15c96 30 }
07037f89 31 $cond = { "foreign.${f_key}" => "self.${pri}" },
32 }
33 shift(@columns) unless defined $columns[0]; # Explicit empty condition
34 my %attrs;
35 if (ref $columns[0] eq 'HASH') {
36 %attrs = %{shift @columns};
22b15c96 37 }
07037f89 38 shift(@columns) unless defined $columns[0]; # Explicit empty attrs
39 $class->add_relationship($rel, $f_class,
40 $cond,
41 { accessor => 'single', (@columns ? (proxy => \@columns) : ()),
42 cascade_update => 1, cascade_delete => 1,
43 ($join_type ? ('join_type' => $join_type) : ()),
44 %attrs });
45 1;
22b15c96 46}
47
481;