664f4fde7ad2717998be18914be4bca5f39a2eda
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / HasMany.pm
1 package # hide from PAUSE
2     DBIx::Class::Relationship::HasMany;
3
4 use strict;
5 use warnings;
6 use Try::Tiny;
7 use namespace::clean;
8
9 our %_pod_inherit_config =
10   (
11    class_map => { 'DBIx::Class::Relationship::HasMany' => 'DBIx::Class::Relationship' }
12   );
13
14 sub has_many {
15   my ($class, $rel, $f_class, $cond, $attrs) = @_;
16
17   unless (ref $cond) {
18
19     my $pri = $class->result_source_instance->_single_pri_col_or_die;
20
21     my ($f_key,$guess);
22     if (defined $cond && length $cond) {
23       $f_key = $cond;
24       $guess = "caller specified foreign key '$f_key'";
25     } else {
26       $class =~ /([^\:]+)$/;  # match is safe - $class can't be ''
27       $f_key = lc $1; # go ahead and guess; best we can do
28       $guess = "using our class name '$class' as foreign key source";
29     }
30
31     # only perform checks if the far side appears already loaded
32     if (my $f_rsrc = try { $f_class->result_source_instance } ) {
33       $class->throw_exception(
34         "No such column '$f_key' on foreign class ${f_class} ($guess)"
35       ) if !$f_rsrc->has_column($f_key);
36     }
37
38     $cond = { "foreign.${f_key}" => "self.${pri}" };
39   }
40
41   my $default_cascade = ref $cond eq 'CODE' ? 0 : 1;
42
43   $class->add_relationship($rel, $f_class, $cond, {
44     accessor => 'multi',
45     join_type => 'LEFT',
46     cascade_delete => $default_cascade,
47     cascade_copy => $default_cascade,
48     %{$attrs||{}}
49   });
50 }
51
52 1;