Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

jkondo (7642)

jkondo
  (email not shown publicly)

Journal of jkondo (7642)

Tuesday January 30, 2007
05:33 PM

Class::Moco

[ #32283 ]

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!

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • 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?
    • 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');