X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=061184de94d5a2435bbad28c16558ae50ea0825e;hb=1edd17220a3f0fa2768084572d8ca57cfc2a2fcc;hp=86841ef89942c718dadf7403dd07b008ad8d4ef6;hpb=daec44b85cffd777869c9652273670b27625e167;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 86841ef..061184d 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -3,6 +3,8 @@ package DBIx::Class::Row; use strict; use warnings; +use base qw/DBIx::Class/; + =head1 NAME DBIx::Class::Row - Basic row methods @@ -33,6 +35,7 @@ sub new { if ($attrs) { $new->throw("attrs must be a hashref" ) unless ref($attrs) eq 'HASH'; while (my ($k, $v) = each %{$attrs}) { + die "No such column $k on $class" unless $class->has_column($k); $new->store_column($k => $v); } } @@ -104,7 +107,10 @@ UPDATE query to commit any changes to the object to the db if required. sub update { my ($self, $upd) = @_; $self->throw( "Not in database" ) unless $self->in_storage; - my %to_update = %{$upd || {}}; + if (ref $upd eq 'HASH') { + $self->$_($upd->{$_}) for keys %$upd; + } + my %to_update; $to_update{$_} = $self->get_column($_) for $self->is_changed; return -1 unless keys %to_update; my $rows = $self->storage->update($self->_table_name, \%to_update, @@ -118,13 +124,6 @@ sub update { return $self; } -sub ident_condition { - my ($self) = @_; - my %cond; - $cond{$_} = $self->get_column($_) for keys %{$self->_primaries}; - return \%cond; -} - =item delete $obj->delete @@ -167,12 +166,25 @@ Fetches a column value sub get_column { my ($self, $column) = @_; $self->throw( "Can't fetch data as class method" ) unless ref $self; - $self->throw( "No such column '${column}'" ) unless $self->_columns->{$column}; + $self->throw( "No such column '${column}'" ) unless $self->has_column($column); return $self->{_column_data}{$column} if exists $self->{_column_data}{$column}; return undef; } +=item get_columns + + my %data = $obj->get_columns; + +Fetch all column values at once. + +=cut + +sub get_columns { + my $self = shift; + return map { $_ => $self->get_column($_) } $self->columns; +} + =item set_column $obj->set_column($col => $val); @@ -191,6 +203,29 @@ sub set_column { return $ret; } +=item set_columns + + my $copy = $orig->set_columns({ $col => $val, ... }); + +Set more than one column value at once. + +=cut + +sub set_columns { + my ($self,$data) = @_; + while (my ($col,$val) = each %$data) { + $self->set_column($col,$val); + } +} + +=item copy + + my $copy = $orig->copy({ change => $to, ... }); + +Insert a new row with the specified changes. + +=cut + =item store_column $obj->store_column($col => $val); @@ -202,26 +237,21 @@ Sets a column value without marking it as dirty sub store_column { my ($self, $column, $value) = @_; $self->throw( "No such column '${column}'" ) - unless $self->_columns->{$column}; + unless $self->has_column($column); $self->throw( "set_column called for ${column} without value" ) if @_ < 3; return $self->{_column_data}{$column} = $value; } -sub _row_to_object { # WARNING: Destructive to @$row +sub _row_to_object { my ($class, $cols, $row) = @_; - my $new = $class->new; - $new->store_column($_, shift @$row) for @$cols; + my %vals; + $vals{$cols->[$_]} = $row->[$_] for 0 .. $#$cols; + my $new = bless({ _column_data => \%vals }, ref $class || $class); $new->in_storage(1); return $new; } -=item copy - - my $copy = $orig->copy({ change => $to, ... }); - -=cut - sub copy { my ($self, $changes) = @_; my $new = bless({ _column_data => { %{$self->{_column_data}}} }, ref $self);