Baby Moose Back Again?
Well its Accessor.pm post-ette day today here in the Moose-Pen
Yesterday's post I managed to make a very small start on my Driver::DBI before I figured it would be a good idea to do more of the param validation on the Accessor side rather than the driver side. That way I know I will not run into the situation where one Accessor/Driver combination works differently than another.
The validation rule for today is on the $container param for both the Create and Update and is as follows;
'Each element in the elements array that has the same view as the DA class must be present as a key in a Hash-ref or as an attribute in Class container. This rule is not on by default but is to be turned on only when the all_elements_present flag is true.
So to get the above in place I will need to add in that new flag here;
has [
qw(da_compose_only
da_no_effect
da_warning
++ all_elements_present
...
Now for the validation I created the neat little recursive sub;
sub _all_elements_present {
my $self = shift;
my ( $message, $container ) = @_;
if ( ref($container) eq "ARRAY" ) {
$message.=” The Array-ref container, has an error! “;
foreach my $sub_container ( @{$container} ) {
$self->_all_elements_present($message,$sub_container);
}
}
else {
foreach my $element ( $self->elements() ) {
next
if ( !( $element->view )
and $element->view ne $self->view->name() )
; #ignore elements on other view (joins etc)
if ( ref($container) eq 'HASH' ) {
die $message
. "The Hash-Ref \$container must have a "
. $element->name
. " key present!"
if ( !exists( $container->{ $element->name } ) );
}
else {
die $message
. "The Class \$container must have a "
. $element->name
. " attribute!"
if ( !( $container->can( $element->name ) ) );
}
}
}
}
and then a quick add in to the create and update methods
++ $self->_all_elements_present($message,$container)
++ if ($self->all_elements_present);
$self->_execute( Database::Accessor::Constants::CREATE,
…
and
++ $self->_all_elements_present($message,$container)
++ if ($self->all_elements_present);
$self->_execute( Database::Accessor::Constants::UPDATE,
and that should be good to go. A start on it anyway, I see in some of my earlier notes I am going to a few element attributes to handle as well here is a partial list
- no_create
- no_retrieve
- no_update
- is_identity
- only_retrieve
and some of these are not even in Accessor.pm yet.
I do not think I am ever going to get to play in Driver::DBI, as I need code and tests for all of the above to boot and I just saw one other rule I will have to add, all elements on a create or update must have the same view. Oh well more posts at least.
Leave a comment