NAME Class::Moco - Easy to cache Model Component SYNOPSIS # First, set up your db. package Blog::DataBase; use base qw(Class::Moco::DataBase); __PACKAGE__->dsn('dbi:mysql:dbname=blog'); __PACKAGE__->username('test'); __PACKAGE__->password('test'); 1; # Second, create a base class for all models. package Blog::TableObject; use base qw 'Class::Moco'; # Inherit Class::Moco __PACKAGE__->db_object('Blog::DataBase'); 1; # Third, create your models. package Blog::User; use base qw 'Blog::TableObject'; __PACKAGE__->table('user'); __PACKAGE__->primary_keys(['user_id']); __PACKAGE__->has_many( entries => 'Blog::Entry', { key => 'user_id' } ); __PACKAGE__->has_many( bookmarks => 'Blog::Bookmark', { key => 'user_id' } ); 1; package Blog::Entry; use base qw 'Blog::TableObject'; __PACKAGE__->table('entry'); __PACKAGE__->primary_keys(['entry_id']); __PACKAGE__->has_a( user => 'Blog::User', { key => 'user_id' } ); __PACKAGE__->has_many( bookmarks => 'Blog::Bookmark', { key => 'entry_id' } ); 1; package Blog::Bookmark; use base qw 'Blog::TableObject'; __PACKAGE__->table('bookmark'); __PACKAGE__->primary_keys(['user_id','entry_id']); __PACKAGE__->has_a( user => 'Blog::User', { key => 'user_id' } ); __PACKAGE__->has_a( entry => 'Blog::Entry', { key => 'entry_id' } ); 1; # Now, You can use some methods same as in Class::DBI. # And, all objects are stored in cache automatically. my $user = Blog::User->retrieve(user_id => 123); print $user->name; $user->name('jkontan'); # update db immediately print $user->name; # jkontan my $user2 = Blog::User->retrieve(user_id => 123); # $user is same as $user2! # You can easily get has_many objects array. my $entries = $user->entries; my $entries2 = $user->entries; # $entries is same reference as $entries2! my $entry = $entries->first; # isa Blog::Entry print $entry->title; # you can use methods in Entry class. Blog::Entry->create( user_id => 123, title => 'new entry!', ); # $user->entries will be flushed automatically. my $entries3 = $user->entries; # $entries3 isnt $entries! print ($posts1->[-1] eq $posts2->[-1]); # 1 print ($posts1->[-1] eq $posts3->[-1]); # 1 # It's same instance! DESCRIPTION Easy to cache Model Component SEE ALSO Class::DBI, Cache, SQL::Abstract AUTHOR Junya Kondo, Naoya Ito, COPYRIGHT AND LICENSE Copyright (C) Hatena Inc. All Rights Reserved. This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself.