Data-ObjectDriver
view release on metacpan or search on metacpan
lib/Data/ObjectDriver.pm view on Meta::CPAN
}
sub debug {
my $driver = shift;
return unless $DEBUG;
my $class = ref $driver || $driver;
my @caller;
my $i = 0;
while (1) {
@caller = caller($i++);
last if $caller[0] !~ /^(Data::ObjectDriver|$class)/;
}
my $where = " in file $caller[1] line $caller[2]\n";
if (@_ == 1 && !ref($_[0])) {
$driver->logger->( @_, $where );
} else {
require Data::Dumper;
local $Data::Dumper::Indent = 1;
$driver->logger->( Data::Dumper::Dumper(@_), $where );
}
}
sub profiler {
my $driver = shift;
my ($sql) = @_;
local $@;
$PROFILER ||= eval {
require Data::ObjectDriver::Profiler;
Data::ObjectDriver::Profiler->new;
};
return $PROFILE = 0 if $@ || !$PROFILER;
return $PROFILER unless @_;
$PROFILER->record_query($driver, $sql);
}
sub list_or_iterator {
my $driver = shift;
my($objs) = @_;
## Emulate the standard search behavior of returning an
## iterator in scalar context, and the full list in list context.
if (wantarray) {
return @{$objs};
} else {
my $iter = sub { shift @{$objs} };
return Data::ObjectDriver::Iterator->new($iter);
}
}
sub cache_object { }
sub uncache_object { }
1;
__END__
=head1 NAME
Data::ObjectDriver - Simple, transparent data interface, with caching
=head1 SYNOPSIS
## Set up your database driver code.
package FoodDriver;
sub driver {
Data::ObjectDriver::Driver::DBI->new(
dsn => 'dbi:mysql:dbname',
username => 'username',
password => 'password',
)
}
## Set up the classes for your recipe and ingredient objects.
package Recipe;
use base qw( Data::ObjectDriver::BaseObject );
__PACKAGE__->install_properties({
columns => [ 'recipe_id', 'title' ],
datasource => 'recipe',
primary_key => 'recipe_id',
driver => FoodDriver->driver,
});
package Ingredient;
use base qw( Data::ObjectDriver::BaseObject );
__PACKAGE__->install_properties({
columns => [ 'ingredient_id', 'recipe_id', 'name', 'quantity' ],
datasource => 'ingredient',
primary_key => [ 'recipe_id', 'ingredient_id' ],
driver => FoodDriver->driver,
});
## And now, use them!
my $recipe = Recipe->new;
$recipe->title('Banana Milkshake');
$recipe->save;
my $ingredient = Ingredient->new;
$ingredient->recipe_id($recipe->id);
$ingredient->name('Bananas');
$ingredient->quantity(5);
$ingredient->save;
## Needs more bananas!
$ingredient->quantity(10);
$ingredient->save;
## Shorthand constructor
my $ingredient = Ingredient->new(recipe_id=> $recipe->id,
name => 'Milk',
quantity => 2);
=head1 DESCRIPTION
I<Data::ObjectDriver> is an object relational mapper, meaning that it maps
object-oriented design concepts onto a relational database.
It's inspired by, and descended from, the I<MT::ObjectDriver> classes in
Six Apart's Movable Type and TypePad weblogging products. But it adds in
caching and partitioning layers, allowing you to spread data across multiple
( run in 0.793 second using v1.01-cache-2.11-cpan-39bf76dae61 )