Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

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

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の行と違ってリファレンスも保存したかったので、ゲッター呼んだ時はディープコピーした値を返してる。