package DBIx::ObjectMapper;
use strict;
use warnings;
use 5.008_001;
our $VERSION = '0.3013';
use Carp::Clan qw/^DBIx::ObjectMapper/;
use Params::Validate qw(:all);
use DBIx::ObjectMapper::Log;
use DBIx::ObjectMapper::Utils;
use DBIx::ObjectMapper::Metadata;
use DBIx::ObjectMapper::Mapper;
use DBIx::ObjectMapper::Session;
my $DEFAULT_MAPPING_CLASS = 'DBIx::ObjectMapper::Mapper';
my $DEFAULT_SESSION_CLASS = 'DBIx::ObjectMapper::Session';
sub new {
my $class = shift;
my %param_tmp = @_;
my %param = validate(
@_,
{ engine => { type => OBJECT, isa => 'DBIx::ObjectMapper::Engine' },
metadata => {
type => OBJECT,
isa => 'DBIx::ObjectMapper::Metadata',
default => DBIx::ObjectMapper::Metadata->new(),
},
mapping_class => {
type => SCALAR,
isa => $DEFAULT_MAPPING_CLASS,
default => $DEFAULT_MAPPING_CLASS,
},
session_class => {
type => SCALAR,
isa => $DEFAULT_SESSION_CLASS,
default => $DEFAULT_SESSION_CLASS,
},
session_attr => {
type => HASHREF,
default => +{},
},
}
);
$param{metadata}->engine($param{engine});
return bless \%param, $class;
}
sub metadata { $_[0]->{metadata} }
sub engine { $_[0]->{engine} }
sub mapping_class { $_[0]->{mapping_class} }
sub session_class { $_[0]->{session_class} }
sub maps {
my $self = shift;
my $metatable = shift;
my $mapping_class = shift;
$metatable = $self->metadata->t($metatable) unless ref($metatable);
my $mapper = $self->mapping_class->new( $metatable => $mapping_class, @_ );
}
sub begin_session {
my $self = shift;
my %attr = (
%{$self->{session_attr}},
@_
);
$attr{engine} = $self->engine unless exists $attr{engine};
return $self->session_class->new(%attr);
}
sub relation {
my $self = shift;
my $class = ref($self) || $self;
my $rel_type = shift;
my $rel_class
= $class
. '::Relation::'
. DBIx::ObjectMapper::Utils::camelize($rel_type);
Class::MOP::load_class($rel_class)
unless Class::MOP::is_class_loaded($rel_class);
return $rel_class->new( @_ );
}
sub attribute {
my $self = shift;
my $map_class = shift;
if( DBIx::ObjectMapper::Mapper->is_initialized($map_class) ) {
return $map_class->__class_mapper__->attributes;
}
else {
my $class = ref($self);
confess "the $map_class is not under the management of $class";
}
}
*attr = \&attribute;
1;
__END__
=head1 NAME
DBIx::ObjectMapper - An implementation of the Data Mapper pattern (object-relational mapper).
=head1 SYNOPSIS
Create a engine and a mapper object.
use DBIx::ObjectMapper;
use DBIx::ObjectMapper::Engine::DBI;
my $engine = DBIx::ObjectMapper::Engine::DBI->new({
dsn => 'dbi:SQLite:',
username => undef,
password => undef,
});
my $mapper = DBIx::ObjectMapper->new( engine => $engine );
Create a ordinary perl class.
package My::User;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors(qw(id name));
1;
Get/Define metadata of the table.
my $user_meta = $mapper->metadata->table( 'user' => 'autoload' );
# or
use DBIx::ObjectMapper::Metadata::Sugar qw(:all);
my $user_meta = $mapper->metadata->table(
'user' => [
Col( id => Int(), PrimaryKey ),
Col( name => String(128), NotNull ),
]
);
Map the table metadata to the ordinary class.
$mapper->maps( $user_meta => 'My::User' );
Create session. And add My::User object to session object.
my $session = $mapper->begin_session;
my $user = My::User->new({ id => 1, name => 'name1' });
$session->add($user);
When the $session is destroyed, the session object send a insert query to the database.
Get a My::User Object.
my $session = $mapper->begin_session;
my $user = $session->get( 'My::User' => 1 );
$user->id;
$user->name;
=head1 DESCRIPTION
DBIx::ObjectMapper is a implementation of the Data Mapper pattern. And abstraction layer for database access.
Concepts and interfaces of this module borrowed from SQLAlchemy.
L
=head1 METHODS
=head2 new(%args)
=over 5
=item B
L
=item B
By default L.
Set a L based object if you want.
=item B
By default L.
Set a L based object if you want.
=item B
By default L.
Set a L based class if you want.
=item B
Set a hash reference of counstructor parameters of L.
When you call the L method, you get a L object that this option is set up.
=back
=head2 begin_session(%session_option)
Gets a session object instance, and begins session.
See the L for more information.
=head2 maps(%map_config)
Sets a configuration of mapping.
See the L for more information.
=head2 relation( $relation_type => \%relation_config )
L
=head2 metadata()
Returns the metadata object.
=head2 engine()
Returns the engine object.
=head2 mapping_class()
Returns the mapping_class.
=head2 session_class()
Returns the session_class.
=head1 AUTHOR
Eisuke Oishi
=head1 CONTRIBUTORS
nekokak: Atsushi Kobayashi
=head1 COPYRIGHT
Copyright 2010 Eisuke Oishi
=head1 LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.