Stories
Slash Boxes
Comments

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
06: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');