読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の壮年PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Class::Accessor::TrackDirty っての書いた

perl

KVMにハッシュ的なデータ構造出し入れするのに、O/Rマッパーのエンティティみたいにプロパティが変わったかを追っかけて必要なときだけ保存したかったんだけど、良さげなのを見つけられなかったので自分で Class::Accessor::TrackDirty て名前のClass::Accessor風インタフェースで使えるモジュールを書いた。

package UserInfo;
use Class::Accessor::TrackDirty;
Class::Accessor::TrackDirty->mk_new_and_tracked_accessors("name", "password");
Class::Accessor::TrackDirty->mk_accessors("modified");

package main;
my $user = UserInfo->new({name => 'honma', password => 'F!aS3l'});
store_into_someplace($user->to_hash) if $user->is_dirty;
        ...
$user = UserInfo->from_hash(restore_from_someplace());
$user->name('hiratara');
$user->revert; # but decided not to
$user->name('honma');
$user->name('hiratara');
$user->name('honma'); # I can't make up my mind...
        ... blabla ...

# Store it only if $user was really modified.
store_into_someplace($user->to_hash) if $user->is_dirty;

中でやってることは、from_hashで渡された内容をまるっと保管しておいて、is_dirty呼ばれた時に現在のフィールドの値と比べて変わってるかを見てるだけ。ただ、flatRDBの行と違ってリファレンスも保存したかったので、ゲッター呼んだ時はディープコピーした値を返してる。