NAME
    Data::Model - model interface which had more data sources unified, a.k.a
    data/object mapper

SYNOPSIS
      package Your::Model;
      use base 'Data::Model';
      use Data::Model::Schema;
      use Data::Model::Driver::DBI;
  
      my $dbfile = '/foo/bar.db';
      my $driver = Data::Model::Driver::DBI->new(
          dsn => "dbi:SQLite:dbname=$dbfile",
      );
      base_driver( $driver );
  
      install_model user => schema {
          key 'id';
          columns qw/
              id
              name
          /;
      };
  
      # create database file
      unless (-f $dbfile) {
          my $dbh = DBI->connect($dsn, '', '', { RaiseError => 1, PrintError => 0 });
          for my $sql (__PACKAGE__->as_sqls) {
              $dbh->do( $sql );
          }
          $dbh->disconnect;
      }
  
      # in your script:
      use Your::Model;
  
      my $model = Your::Model->new;
  
      # insert
      my $row = $model->set(
          user => {
              id => 1,
          }
      );
  
      my $row = $model->lookup( user => 1 );
      $row->delete;

DESCRIPTION
    Data::Model is can use as ORM which can be defined briefly.

    There are few documents. It is due to be increased in the near future.

SCHEMA DEFINITION
    One package can define two or more tables using DSL.

    see Data::Model::Schema.

METHODS
  new([ \%options ]);
      my $model = Class->new;

  lookup($target => $key)
      my $row = $model->lookup( user => $id );
      print $row->name;

  lookup_multi($target => \@keylist)
      my @row = $model->lookup_multi( user => [ $id1, $id2 ] );
      print $row[0]->name;
      print $row[1]->name;

  get($target => $key [, \%options ])
      my $iterator = $model->get( user => { 
          id => {
              IN => [ $id1, $id2 ],
          }
      });
      while (my $row = $iterator->next) {
          print $row->name;
      }
      # or
      while (my $row = <$iterator>) {
          print $row->name;
      }
      # or
      while (<$iterator>) {
          print $_->name;
      }

  set($target => $key, => \%values [, \%options ])
      $model->set( user => {
        id   => 3,
        name => 'insert record',
      });

  delete($target => $key [, \%options ])
      $model->delete( user => 3 ); # id = 3 is deleted

ROW OBJECT METHODS
    row object is provided by Data::Model::Row.

  update
      my $row = $model->lookup( user => $id );
      $row->name('update record');
      $row->update;

  delete
      my $row = $model->lookup( user => $id );
      $row->delete;

TRANSACTION
    see Data::Model::Transaction.

DATA DRIVERS
  DBI
    see Data::Model::Driver::DBI.

  DBI::MasterSlave
    master-slave composition for mysql.

    see Data::Model::Driver::DBI::MasterSlave.

  Cache
    Cash of the result of a query.

    see Data::Model::Driver::Cache::HASH, see
    Data::Model::Driver::Cache::Memcached.

  Memcached
    memcached is used for data storage.

    see Data::Model::Driver::Memcached.

  Queue::Q4M
    queuing manager for Q4M.

    see Data::Model::Driver::Queue::Q4M.

  Memory
    on memory storage.

    see Data::Model::Driver::Memory.

SEE ALSO
    Data::Model::Row, Data::Model::Iterator

ACKNOWLEDGEMENTS
    Benjamin Trott more idea given by Data::ObjectDriver

AUTHOR
    Kazuhiro Osawa <yappo <at> shibuya <döt> pl>

REPOSITORY
      git clone git://github.com/yappo/p5-Data-Model.git

    Data::Model's Git repository is hosted at
    <http://github.com/yappo/p5-Data-Model>. patches and collaborators are
    welcome.

LICENSE
    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

