Class::Moco

jkondo on 2007-01-30T22:33:19

I uploaded Class::Moco 0.03 today.

Class::Moco is easy to cache model component. It provides the way to create models like Class::DBI and store objects in cache easily. http://search.cpan.org/dist/Class-Moco/

I'd like to get feedbacks.

Here is the SYNOPSIS of Class::Moco.

# 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!


Sounds interesting

malte on 2007-01-31T07:55:16

Hey, sounds interesting. Could you add documentation on the caching behavior (expiration, max size)? Is it possible to use other or mappers than Class::DBI?

Re:Sounds interesting

jkondo on 2007-01-31T20:52:52

You can use MoCo singularly because MoCo doesn't use Class::DBI.
But APIs are similar to Class::DBI.

MoCo::Cache is simple cache object but doesn't have complicated features such as max size etc..

You can use Cache::* modules instead of MoCo::Cache.
please try like this.

# in your base model class.
package MyClass;
base qw(MoCo);
use Cache::Memory;
__PACKAGE__->cache_object('Cache::Memory');