X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=36f5dd131035275cc0489448c4834517eb6ae7f0;hb=b82c8a28bb4cb7d704496b8ce3966565d255d5b3;hp=b0f24e8e44605e408f1ea7e319e51f050d4fa2d3;hpb=0bb1a52f5e8c1d0e7f45f9f610e6e3bf78245dff;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index b0f24e8..36f5dd1 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -171,9 +171,8 @@ sub new { $new->throw_exception("Can't do multi-create without result source") unless $source; my $info = $source->relationship_info($key); - if ($info && $info->{attrs}{accessor} - && $info->{attrs}{accessor} eq 'single') - { + my $acc_type = $info->{attrs}{accessor} || ''; + if ($acc_type eq 'single') { my $rel_obj = delete $attrs->{$key}; if(!Scalar::Util::blessed($rel_obj)) { $rel_obj = $new->__new_related_find_or_new_helper($key, $rel_obj); @@ -188,9 +187,8 @@ sub new { $related->{$key} = $rel_obj; next; - } elsif ($info && $info->{attrs}{accessor} - && $info->{attrs}{accessor} eq 'multi' - && ref $attrs->{$key} eq 'ARRAY') { + } + elsif ($acc_type eq 'multi' && ref $attrs->{$key} eq 'ARRAY' ) { my $others = delete $attrs->{$key}; my $total = @$others; my @objects; @@ -210,9 +208,8 @@ sub new { } $related->{$key} = \@objects; next; - } elsif ($info && $info->{attrs}{accessor} - && $info->{attrs}{accessor} eq 'filter') - { + } + elsif ($acc_type eq 'filter') { ## 'filter' should disappear and get merged in with 'single' above! my $rel_obj = delete $attrs->{$key}; if(!Scalar::Util::blessed($rel_obj)) { @@ -761,11 +758,9 @@ sub get_inflated_columns { my %inflated; for my $col (keys %loaded_colinfo) { - if (exists $loaded_colinfo{$col}{accessor}) { - my $acc = $loaded_colinfo{$col}{accessor}; - if (defined $acc) { - $inflated{$col} = $self->$acc; - } + my $acc = $loaded_colinfo{$col}{accessor}; + if (defined $acc) { + $inflated{$col} = $self->$acc; } else { $inflated{$col} = $self->$col; @@ -776,7 +771,7 @@ sub get_inflated_columns { return ($self->get_columns, %inflated); } -sub _is_numeric { +sub _is_column_numeric { my ($self, $column) = @_; my $colinfo = $self->column_info ($column); @@ -836,7 +831,7 @@ sub set_column { $dirty = 0; } else { # do a numeric comparison if datatype allows it - if ($self->_is_numeric($column)) { + if ($self->_is_column_numeric($column)) { $dirty = $old_value != $new_value; } else { @@ -917,21 +912,18 @@ sub set_inflated_columns { foreach my $key (keys %$upd) { if (ref $upd->{$key}) { my $info = $self->relationship_info($key); - if ($info && $info->{attrs}{accessor} - && $info->{attrs}{accessor} eq 'single') - { + my $acc_type = $info->{attrs}{accessor} || ''; + if ($acc_type eq 'single') { my $rel = delete $upd->{$key}; $self->set_from_related($key => $rel); $self->{_relationship_data}{$key} = $rel; - } elsif ($info && $info->{attrs}{accessor} - && $info->{attrs}{accessor} eq 'multi') { - $self->throw_exception( - "Recursive update is not supported over relationships of type multi ($key)" - ); } - elsif ($self->has_column($key) - && exists $self->column_info($key)->{_inflate_info}) - { + elsif ($acc_type eq 'multi') { + $self->throw_exception( + "Recursive update is not supported over relationships of type '$acc_type' ($key)" + ); + } + elsif ($self->has_column($key) && exists $self->column_info($key)->{_inflate_info}) { $self->set_inflated_column($key, delete $upd->{$key}); } } @@ -1117,15 +1109,17 @@ sub inflate_result { $fetched = $pre_source->result_class->inflate_result( $pre_source, @{$pre_val}); } - my $accessor = $source->relationship_info($pre)->{attrs}{accessor}; - $class->throw_exception("No accessor for prefetched $pre") - unless defined $accessor; - if ($accessor eq 'single') { + my $acc_type = $source->relationship_info($pre)->{attrs}{accessor} + or $class->throw_exception("No accessor type for prefetched $pre"); + + if ($acc_type eq 'single') { $new->{_relationship_data}{$pre} = $fetched; - } elsif ($accessor eq 'filter') { + } + elsif ($acc_type eq 'filter') { $new->{_inflated_column}{$pre} = $fetched; - } else { - $class->throw_exception("Implicit prefetch (via select/columns) not supported with accessor '$accessor'"); + } + else { + $class->throw_exception("Implicit prefetch (via select/columns) not supported with accessor type '$acc_type'"); } $new->related_resultset($pre)->set_cache([ $fetched ]); }