Merge 'DBIx-Class-current' into 'many_to_many'
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / ManyToMany.pm
1 package # hide from PAUSE
2     DBIx::Class::Relationship::ManyToMany;
3
4 use strict;
5 use warnings;
6
7 sub many_to_many {
8   my ($class, $meth, $rel, $f_rel, $rel_attrs) = @_;
9   {
10     no strict 'refs';
11     no warnings 'redefine';
12
13     *{"${class}::${meth}"} = sub {
14       my $self = shift;
15       my $attrs = @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {};
16       $self->search_related($rel)->search_related(
17         $f_rel, @_ > 0 ? @_ : undef, { %{$rel_attrs||{}}, %$attrs }
18       );
19     };
20
21     *{"${class}::add_to_${meth}"} = sub {
22       my( $self, $obj ) = @_;
23       my $vals = @_ > 2 && ref $_[$#_] eq 'HASH' ? pop(@_) : {};
24       return $self->search_related($rel)->create({
25         map { $_=>$self->get_column($_) } $self->primary_columns(),
26         map { $_=>$obj->get_column($_) } $obj->primary_columns(),
27         %$vals,
28       });
29     };
30
31     *{"${class}::remove_from_${meth}"} = sub {
32       my( $self, $obj ) = @_;
33       return $self->search_related(
34         $rel,
35         {
36             map { $_=>$self->get_column($_) } $self->primary_columns(),
37             map { $_=>$obj->get_column($_) } $obj->primary_columns(),
38         },
39       )->delete();
40     };
41
42   }
43 }
44
45 1;