X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=daf5885d399e64cfbc19dcdfbbd4cd7359a4637d;hb=aff5e9c14f7ad7453a4a2a7d04dc4e85fa0d661c;hp=a4a18b97f64bee8f1babae7c20e44bb8b3d60b2e;hpb=096ab902adff61f687a3bf39b7d47c4c9a1fce80;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index a4a18b9..daf5885 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -7,7 +7,7 @@ use base qw/DBIx::Class/; use Scalar::Util 'blessed'; use List::Util 'first'; -use Try::Tiny; +use DBIx::Class::_Util 'dbic_internal_try'; use DBIx::Class::Carp; use SQL::Abstract qw( is_literal_value is_plain_value ); @@ -621,7 +621,7 @@ sub delete { $self->in_storage(0); } else { - my $rsrc = try { $self->result_source_instance } + my $rsrc = dbic_internal_try { $self->result_source_instance } or $self->throw_exception("Can't do class delete without a ResultSource instance"); my $attrs = @_ > 1 && ref $_[$#_] eq 'HASH' ? { %{pop(@_)} } : {}; @@ -900,7 +900,7 @@ sub _is_column_numeric { if ( ! defined $colinfo->{is_numeric} and - my $storage = try { $self->result_source->schema->storage } + my $storage = dbic_internal_try { $self->result_source->schema->storage } ) { $colinfo->{is_numeric} = $storage->is_datatype_numeric ($colinfo->{data_type}) @@ -1174,16 +1174,21 @@ sub copy { next unless $rel_info->{attrs}{cascade_copy}; - my $resolved = $rsrc->_resolve_condition( - $rel_info->{cond}, $rel_name, $new, $rel_name - ); - + my $foreign_vals; my $copied = $rel_names_copied->{ $rel_info->{source} } ||= {}; - foreach my $related ($self->search_related($rel_name)->all) { - $related->copy($resolved) - unless $copied->{$related->ID}++; - } + $copied->{$_->ID}++ or $_->copy( + + $foreign_vals ||= $rsrc->_resolve_relationship_condition( + infer_values_based_on => {}, + rel_name => $rel_name, + self_result_object => $new, + + self_alias => "\xFE", # irrelevant + foreign_alias => "\xFF", # irrelevant, + )->{inferred_values} + + ) for $self->search_related($rel_name)->all; } return $new; } @@ -1216,11 +1221,16 @@ sub store_column { $self->throw_exception( "set_column called for ${column} without value" ) if @_ < 3; - # stringify all refs explicitly, guards against overloaded objects + return $self->{_column_data}{$column} = $value + unless length ref $value and my $vref = is_plain_value( $value ); + + # if we are dealing with a value/ref - there are a couple possibilities + # unpack the underlying piece of data and stringify all objects explicitly + # ( to accomodate { -value => ... } and guard against overloaded objects # with defined stringification AND fallback => 0 (ugh!) - $self->{_column_data}{$column} = ( length ref $value and is_plain_value( $value ) ) - ? "$value" - : $value + $self->{_column_data}{$column} = defined blessed $$vref + ? "$$vref" + : $$vref ; } @@ -1570,7 +1580,11 @@ See L. sub throw_exception { my $self=shift; - if (ref $self && ref (my $rsrc = try { $self->result_source_instance } ) ) { + if ( + ref $self + and + my $rsrc = dbic_internal_try { $self->result_source_instance } + ) { $rsrc->throw_exception(@_) } else {