DBIx-Class-Helpers

 view release on metacpan or  search on metacpan

lib/DBIx/Class/Helper/Row/StorageValues.pm  view on Meta::CPAN

package DBIx::Class::Helper::Row::StorageValues;
$DBIx::Class::Helper::Row::StorageValues::VERSION = '2.037000';
# ABSTRACT: Keep track of stored vs in-memory row values

use strict;
use warnings;

use parent 'DBIx::Class::Row';

__PACKAGE__->mk_group_accessors(inherited => '_storage_value_columns');
__PACKAGE__->mk_group_accessors(inherited => '_storage_values');

sub _has_storage_value { $_[0]->column_info($_[1])->{keep_storage_value} }

sub storage_value_columns {
   my $self = shift;
   if (!$self->_storage_value_columns) {
     $self->_storage_value_columns([
        grep $self->_has_storage_value($_),
           $self->result_source->columns
     ]);
   }
   return $self->_storage_value_columns;
}

sub store_storage_values {
   my $self = shift;
   $self->_storage_values({
      map {
         my $acc = ($self->column_info($_)->{accessor} || $_);
         $_ => $self->$acc
      } @{$self->storage_value_columns}
   });
   $self->_storage_values;
}

sub get_storage_value { $_[0]->_storage_values->{$_[1]} }

sub new {
   my $class = shift;
   my $ret = $class->next::method(@_);
   $ret->_storage_values({});
   $ret;
}

sub inflate_result {
   my $class = shift;
   my $ret = $class->next::method(@_);
   $ret->store_storage_values;
   $ret;
}

sub insert {
   my $self = shift;
   my $ret = $self->next::method(@_);
   $ret->store_storage_values;
   $ret;
}

sub update {
   my $self = shift;
   my $ret = $self->next::method(@_);
   $ret->store_storage_values;
   $ret;
}

1;

__END__

=pod

=head1 NAME

DBIx::Class::Helper::Row::StorageValues - Keep track of stored vs in-memory row values

=head1 SYNOPSIS

 package MyApp::Schema::Result::BlogPost;

 use parent 'DBIx::Class::Core';

 __PACKAGE__->load_components(qw(Helper::Row::StorageValues));

 __PACKAGE__->table('BlogPost');
 __PACKAGE__->add_columns(
    id => {
       data_type         => 'integer',
       is_auto_increment => 1,
    },
    title => {
       data_type          => 'varchar',
       length             => 32,
       keep_storage_value => 1,
    },
    body => {
       data_type => 'text',
    },
 );

 1;

 # elsewhere:

 my $post = $blog_rs->create({
   title => 'Components for fun and profit',
   body  => '...',
 });

 $post->title('Components for fun');

 warn sprintf 'Changing title from %s to %s',
   $post->storage_value('title'), $post->title;

 $post->update;

=head1 DESCRIPTION

This component keeps track of the value for a given column in the database.  If
you change the column's value and do not call C<update>, the C<storage_value>



( run in 0.453 second using v1.01-cache-2.11-cpan-39bf76dae61 )