package Fey::DBIManager; BEGIN { $Fey::DBIManager::VERSION = '0.16'; } use strict; use warnings; use namespace::autoclean; use Fey::Exceptions qw( object_state_error param_error ); use Scalar::Util qw( blessed ); use Fey::DBIManager::Source; use Moose 0.90; use MooseX::SemiAffordanceAccessor; use MooseX::StrictConstructor; has _sources => ( traits => ['Hash'], is => 'ro', isa => 'HashRef[Fey::DBIManager::Source]', default => sub { {} }, init_arg => undef, handles => { get_source => 'get', add_source => 'set', remove_source => 'delete', _source_count => 'count', has_source => 'exists', sources => 'values', }, ); around 'add_source' => sub { my $orig = shift; my $self = shift; my $source; if ( @_ > 1 ) { $source = Fey::DBIManager::Source->new(@_); } else { $source = shift; } my $name; if ( blessed $source && $source->can('name') ) { $name = $source->name(); param_error qq{You already have a source named "$name".} if $self->has_source($name); } my $return = $self->$orig( $name => $source ); return $return; }; sub default_source { my $self = shift; if ( $self->_source_count() == 0 ) { object_state_error 'This manager has no default source because it has no sources at all.'; } elsif ( $self->_source_count() == 1 ) { # Need to force scalar context for the return value return ( $self->sources() )[0]; } elsif ( my $source = $self->get_source('default') ) { return $source; } else { object_state_error 'This manager has multiple sources, but none are named "default".'; } return; } sub source_for_sql { my $self = shift; return $self->default_source(); } __PACKAGE__->meta()->make_immutable(); 1; # ABSTRACT: Manage a set of DBI handles =pod =head1 NAME Fey::DBIManager - Manage a set of DBI handles =head1 VERSION version 0.16 =head1 SYNOPSIS my $manager = Fey::DBIManager->new(); $manager->add_source( dsn => 'dbi:Pg:dbname=MyDB' ); my $source = $manager->default_source(); my $source = $manager->source_for_sql($select_sql); =head1 DESCRIPTION C manager a set of L objects, each of which in turn represents a single C handle. It's main purpose is to provide a single interface to one or more data sources, allowing you to easily define your database connections in one spot. =head1 METHODS This class provides the following methods: =head2 Fey::DBIManager->new() Returns a new C object. =head2 $manager->add_source(...) This method adds a new L object to the manager. It can either accept an instantiated L object, or a set of parameters needed to create a new source. Sources are identified by name, and if you try to add one that already exists in the manager, an error will be thrown. =head2 $manager->get_source($name) Given a source name, this returns the named source, if it exists in the manager. =head2 $manager->remove_source($name) Removes the named source, if it exists in the manager. =head2 $manager->has_source($name) Returns true if the manager has the named source. =head2 $manager->sources() Returns all of the source in the manager. =head2 $manager->default_source() This method returns the default source for the manager. If the manager has only one source, then this is the default. Otherwise it looks for a source named "default". If no such source exists, or if the manager has no sources at all, then an exception is thrown. =head2 $manager->source_for_sql($sql_object) This method accepts a single C object and returns an appropriate source. By default, this method simply returns the default source. It exists to provide a spot for subclasses which want to do something more clever, such as use one source for reads and another for writes. =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 AUTHOR Dave Rolsky =head1 COPYRIGHT AND LICENSE This software is Copyright (c) 2011 by Dave Rolsky. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible) =cut __END__