Hey, thanks. I often do this in BUILD with a set of if statements depending on 
the parameters to the constructor - this is much more elegant.

Dan

On 27/11/2009, at 11:32 AM, Jeffrey Ray wrote:

> Dan Horne wrote:
>> Yes - I often need user, pass and dsn strings for a DBI connection or a 
>> DBI::db object. What would be the best pattern to deal with such cases if 
>> one were to generalise it?
>>  
> 
> I often take care of this using type coercion:
> 
> package Object;
> use Moose;
> use Moose::Util::TypeConstraints;
> 
> class_type 'DBI::db';
> 
> coerce 'DBI::db'
>   => from 'ArrayRef'
>  => via { DBI->connect(@$_) }
> 
> coerce 'DBI::db'
>   => from 'HashRef'
>  => via { DBI->connect(@{$_}{qw/dsn username password/}) }
> 
> has 'dbh' => (
>   isa => 'DBI::db',
>   coerce => 1,
> );
> 
> package main;
> 
> $object = Object->new(dbh => [qw/dbh:string username password]);
> 
> or
> 
> $object = Object->new(dbh => {dsn => ..., username => ..., password => ...});
> 
> or
> 
> $object = Object->new(dbh => DBI->connect(...));
> 
> will all produce an $object with a dbh that is a DBI::db object
> 


Reply via email to