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 )