X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FCascadeActions.pm;h=c3a66eaba1ead1493684d66374f7e82c5a83b8cd;hb=4acd110dfdca619ef9fb44bce494b36df295b8fc;hp=0da3993441dea2f2feeb1e1eded60f6fde95b08e;hpb=147dd158cf91465b8a48adce738d56b85f7d1b9b;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/CascadeActions.pm b/lib/DBIx/Class/Relationship/CascadeActions.pm index 0da3993..c3a66ea 100644 --- a/lib/DBIx/Class/Relationship/CascadeActions.pm +++ b/lib/DBIx/Class/Relationship/CascadeActions.pm @@ -1,4 +1,13 @@ -package DBIx::Class::Relationship::CascadeActions; +package # hide from PAUSE + DBIx::Class::Relationship::CascadeActions; + +use strict; +use warnings; + +our %_pod_inherit_config = + ( + class_map => { 'DBIx::Class::Relationship::CascadeActions' => 'DBIx::Class::Relationship' } + ); sub delete { my ($self, @rest) = @_; @@ -9,10 +18,11 @@ sub delete { my $ret = $self->next::method(@rest); - my %rels = %{ $self->_relationships }; + my $source = $self->result_source; + my %rels = map { $_ => $source->relationship_info($_) } $source->relationships; my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels; foreach my $rel (@cascade) { - $self->search_related($rel)->delete; + $self->search_related($rel)->delete_all; } return $ret; } @@ -24,10 +34,18 @@ sub update { my $ret = $self->next::method(@rest); - my %rels = %{ $self->_relationships }; + my $source = $self->result_source; + my %rels = map { $_ => $source->relationship_info($_) } $source->relationships; my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels; foreach my $rel (@cascade) { - $_->update for $self->$rel; + next if ( + $rels{$rel}{attrs}{accessor} + && + $rels{$rel}{attrs}{accessor} eq 'single' + && + !exists($self->{_relationship_data}{$rel}) + ); + $_->update for grep defined, $self->$rel; } return $ret; }