initial merge of Schwern's CDBICompat work, with many thanks
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / CDBICompat / TempColumns.pm
index 6de7fd3..d025bb8 100644 (file)
@@ -1,8 +1,9 @@
-package DBIx::Class::CDBICompat::TempColumns;
+package # hide from PAUSE
+    DBIx::Class::CDBICompat::TempColumns;
 
 use strict;
 use warnings;
-use base qw/Class::Data::Inheritable/;
+use base qw/DBIx::Class/;
 
 __PACKAGE__->mk_classdata('_temp_columns' => { });
 
@@ -21,17 +22,26 @@ sub _add_column_group {
 
 sub new {
   my ($class, $attrs, @rest) = @_;
-  my %temp;
-  foreach my $key (keys %$attrs) {
-    $temp{$key} = delete $attrs->{$key} if $class->_temp_columns->{$key};
-  }
+
+  my $temp = $class->_extract_temp_data($attrs);
+
   my $new = $class->next::method($attrs, @rest);
-  foreach my $key (keys %temp) {
-    $new->set_temp($key, $temp{$key});
-  }
+
+  $new->set_temp($_, $temp->{$_}) for keys %$temp;
+
   return $new;
 }
 
+sub _extract_temp_data {
+  my($self, $data) = @_;
+
+  my %temp;
+  foreach my $key (keys %$data) {
+    $temp{$key} = delete $data->{$key} if $self->_temp_columns->{$key};
+  }
+
+  return \%temp;
+}
 
 sub find_column {
   my ($class, $col, @rest) = @_;
@@ -39,10 +49,20 @@ sub find_column {
   return $class->next::method($col, @rest);
 }
 
+sub set {
+  my($self, %data) = @_;
+  
+  my $temp_data = $self->_extract_temp_data(\%data);
+  
+  $self->set_temp($_, $temp_data->{$_}) for keys %$temp_data;
+  
+  return $self->next::method(%data);
+}
+
 sub get_temp {
   my ($self, $column) = @_;
-  $self->throw( "Can't fetch data as class method" ) unless ref $self;
-  $self->throw( "No such TEMP column '${column}'" ) unless $self->_temp_columns->{$column} ;
+  $self->throw_exception( "Can't fetch data as class method" ) unless ref $self;
+  $self->throw_exception( "No such TEMP column '${column}'" ) unless $self->_temp_columns->{$column} ;
   return $self->{_temp_column_data}{$column}
     if exists $self->{_temp_column_data}{$column};
   return undef;
@@ -50,9 +70,9 @@ sub get_temp {
 
 sub set_temp {
   my ($self, $column, $value) = @_;
-  $self->throw( "No such TEMP column '${column}'" )
+  $self->throw_exception( "No such TEMP column '${column}'" )
     unless $self->_temp_columns->{$column};
-  $self->throw( "set_temp called for ${column} without value" )
+  $self->throw_exception( "set_temp called for ${column} without value" )
     if @_ < 3;
   return $self->{_temp_column_data}{$column} = $value;
 }