Hi, folks! i'm a newbie to Moose but I find it extremely useful. I am
currently developing a package that interfaces with mysql databases using
DBI. I can instantiate a Field object as follows:
package Field;
use Moose;
use Moose::Util::TypeConstraints;
use MooseX::StrictConstructor;
use lib /SVN/WbMx/trunk';
use Constants qw( DBI_CONSTANT );
subtype 'DBIConstant'
=> as 'Str'
=> where { DBI_CONSTANT( $_ ) }
=> message { "$_ is not a valid DBI type." };
has 'name' => ( is => 'ro', isa => 'Str', required => 1 );
has 'index' => ( is => 'ro', isa => 'Int', required => 1 );
has 'type' => ( is => 'ro', isa => 'DBIConstant', required => 1 );
has 'precision' => ( is => 'ro', isa => 'Int', required => 1 );
has 'is_nullable' => ( is => 'ro', isa => 'Str', default => 'NO' );
has 'primary_key' => ( is => 'ro', isa => 'Bool', default => 0, );
has 'foreign_key' => ( is => 'ro', isa => 'Str', required => 0 );
__PACKAGE__->meta->make_immutable;
The function DBI_CONSTANTS encapsulates the DBI type checking, you may use
either the usual SQL types (VARCHAR, INTEGER, etc.) or their numeric
equivalents. The attribute missing here is 'value', and here's where I am
kind of lost. I'd like to be able to set 'isa' dynamically, so that if the
Field type was VARCHAR, the new attribute would be 'has 'value' => ( is =>
'ro', isa => 'Str', required => 0 )', if it was INTEGER, I'd have 'has
'value' => ( is => 'ro', isa => 'Int', required => 0 )', etc. I suppose I
could implement that using roles to provide a 'setter' method for the
attribute 'value', but I can't figure out how to tell the role to check the
the attribute 'type' before hand so it can set 'isa' accordingly. Any help
will be greatly appreciated. Thanks!
--
Marcos S. Barbeitos
Post-doctoral researcher
American Museum of Natural History
Department of Invertebrate Zoology
79th st and Central Park West
New York, NY 10024