Class::DBI::FromSledge

作ったけど却下なやつ。
ってかもしやるなら、searchを呼ぶのではなく、find_or_createをよぶべしべし。


$ svn diff Class/DBI/FromSledge.pm
Index: Class/DBI/FromSledge.pm
===================================================================
--- Class/DBI/FromSledge.pm (revision 7888)
+++ Class/DBI/FromSledge.pm (working copy)
@@ -28,6 +28,30 @@
return $class->create($cols);
}

+sub find_or_create_from_sledge : Plugged {
+ my ($class, $page, $args) = @_;
+ croak "find_or_create_from_sledge can only be called as a class method" if ref $class;
+ croak "error detected at validator" if $page->valid->is_error;
+
+ my $cols = $args || {};
+ for my $col ($class->columns) {
+ unless ($cols->{$col}) {
+ if ($page->valid->{PLAN}->{$col}) {
+ $cols->{$col} = &_get_val($page, $col);
+ } elsif ($page->valid->{PLAN}->{"$col\_year"}) {
+ $cols->{$col} = sprintf '%d-%02d-%02d', map {$page->r->param("$col\_$_")} qw(year month day);
+
+ if ($page->valid->{PLAN}->{"$col\_hour"}) {
+ $cols->{$col} = $cols->{$col} . " " . sprintf '%02d:%02d:%02d', map {$page->r->param("$col\_$_")} qw(hour minute second);
+ }
+ }
+ }
+ }
+
+ my ($exists) = $class->search($cols);
+ return defined($exists) ? $exists : $class->create($cols);
+}
+
sub update_from_sledge : Plugged {
my ($self, $page, $args) = @_;
croak "update_from_sledge cannot be called as a class method" unless ref $self;

最近Postしてなかったから書いただけ。