Moose Likes Classes

Its the last result_set day here in the Moose-pen.

Going to try and get the final 'da_result_set' 'Class' to work today, and by now it should not take very long.

The first thing I did was update '20_dad_load.t' yet again but this time I will not bother to show the tests as they should be like an old hat by now.

I then added in a new attribute

        has da_result_class => (
            is  => 'rw',
            isa => 'Str|Undef',
            default     => undef,
and an update to pass that value down to the DAD.

        da_key_case          => $self->da_key_case,
++      da_result_class      => $self->da_result_class,
        identity_index       => $self->_identity_index
and when I run my test case I get;

ok 22 - Role DAD can da_result_class
ok 56 - result Class is undef
so that looks ok.

Now on the test case for Driver::DBI 20_result_sets.t I decided it was best not to add this set type to my loop, but have it as a standalone;

my $class = $da->result()->set->[0];
ok(ref($class) eq "Xtest::DA::Person","Result set is correct class");
cmp_deeply({%$class}, $expected->{"Lower"},"Class properties all set");

as a class will only really work with the correct attributes matching and Lower is the best I have for that Person class.

As one can see the above tests sets the class to 'Xtest::DA::Person', the result set to 'Class' and key to 'Lower'. I then do a retrieve and check that the returned set is the correct class then I check an unblessed version of the class against by expected.

Now to code that up in Driver::DBI and I think all I need there is

++ if ($self->is_Class() and $self->da_result_class()){
++ my $class=$self->da_result_class();
++ my $new = $class->new($hash_ref);
++ push(@{$results},$new);
++ }
++ elsif ($self->is_JSON()){
-- if ($self->is_JSON()){

and on my first test run I get;

not ok 17 - Class properties all set
# Failed test 'Class properties all set'
# at 20_result_sets.t line 74.
# Comparing hash keys of $data
# Missing: 'time zone'

Ok I did expected that as I have an alias with a space in it for that field

alias=>'time zone',

and that of course will never match up with an accessor so I will work with that by addting this to the test

ok(ref($class) eq "Xtest::DA::Person","Result set is correct class");
++ ok(!$class->time_zone,"time_zone not set");
++ delete( $expected->{"Lower"}->{'time zone'});
cmp_deeply({%$class}, $expected->{"Lower"},"Class properties all set");

I make sure 'time_zone' is undef and a remove the 'time zone' key from the expected results and this time round I get;

ok 16 - Result set is correct class
ok 17 - time_zone not set
ok 18 - Class properties all set

so that solves that little problem;

Something different for tomorrow I guess;


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