Shameful Moose

It is another shame day here in the Moose-pen

I never like taking out code but that is the first thing I had to do today. So all the code changes from yesterday have been rolled back and I still have the same problem;

Attribute (predicates) does not pass the type constraint because: Validation failed for 'Predicate' with value undef (not isa Database::Accessor::Predicate) at D:\GitHub\database-accessor\lib/Database/Accessor/ line 349# 
Namely an error message that tells me nothing of where my mistake;

$da->add_condition(  undef);

I take a good number of 'warn' statements throughout my 'Types' class finally find a spot where I can intercept and create a better error message.

I eventually tracked it down to the '_predicate_array_or_object' sub in the 'Types' class;

sub _predicate_array_or_object {
my ( $class, $in ) = @_;
my $objects = [];
foreach my $object ( @{$in} ) {
if ( ref($object) eq $class ) {
push( @{$objects}, $object );
elsif ( ref($object) eq "ARRAY" ) {
@{ _predicate_array_or_object( $class, $object ) }
else {
push( @{$objects}, $class->new( { predicates => $object } ) );
return $objects;

and my code was failing on the final 'else' as the $object that was coming in would have been 'undef' and I get that fail when I try to create a '$class' of 'Condition' with 'predicates' undef;

I added in these lines to capture that case;

else {
my ($package, $filename, $line, $subroutine) = caller(3);
++ die "Attribute (Condition) does not pass the type constraint because:
++ Validation failed for 'Conditions' with value undef"
++ unless($object);
push( @{$objects}, $class->new( { predicates => $object } ) );

and now I get

Attribute (Condition) does not pass the type constraint because:
Validation failed for 'Conditions' with value undef at D:\GitHub\database-accessor\lib/Database/Accessor/ line 346.

a little better. The only problem is I have introduced with the above a bug??

Can't use an undefined value as an ARRAY reference at D:\GitHub\database-accessor\lib/Database/ line 1014.

when I am just trying to do this;

$da->retrieve( Data::Test->new(), $return );

after adding in a few 'dynamic_conditions'. Leaving that bug unfixed there will really make my code useless as I can't do any real work.

Well after poking about again I finally stumbled into it. At some point in my playing about I did this

has dynamic_links => (
isa => 'ArrayRefofLinks',
traits => ['Array','MooseX::MetaDescription::Meta::Trait'],
description => { not_in_DAD => 1 },
is => 'rw',
-- default => sub { [] },
++ #default => sub { [] },
handles => {
reset_links => 'clear',
add_link => 'push',
dynamic_link_count => 'count',

Must of had a brain cramp at some point. I took that '#' out and now all the failing tests pass;

Now to clean up that error message a little;

In this case I want to know where and what I am calling and I can get that with the good old 'caller' function. I will have to now do all of this in a 'unless' block like this;

unless ($object) {
my ( $package, $filename, $line, $subroutine ) = caller(3);
warn("$class $package, $filename, $line, $subroutine");
$subroutine =~ s/Database::Accessor:://g;
$class =~ s/Database::Accessor:://g;
my $die =
caller => [ $package, $filename, $line, $subroutine ], );
message => "Database::Accessor "
. $subroutine
. " Error:\n"
. "You cannot add undef to dynamic_"
. $class . "s! "
die $die;
push( @{$objects}, $class->new( { predicates => $object } ) );

and now I get;

Database::Accessor add_condition Error:
You cannot add undef to dynamic_Conditions! at at 43_dynamic_conditions.t line 25

Just what the doctorb ordered.

Now I did do something a little naughty here as I am using the ' MooseX::Constructor::AllErrors' here to create an error for something that does not happen at the 'Constructor' stage. I suppose if some smarty pants out there will complain about it someday but I can suffer those slings and arrows;

Now I hope I can move on to something else soon.


Leave a comment

About byterock

user-pic Long time Perl guy, a few CPAN mods allot of work on DBD::Oracle and a few YAPC presentations