Today I started taking a closer look at MooseX::RelatedClasses to see if that could help me out. Well after reading though the documentation and looking at the test files to see how it really works I do not think I need this MooseX at all as it really is just for coordinating name-spaces, So I will move onto the next one for today and that is MooseX::Scaffold

This one does look promising as I can use one common sub to load in my LSDs when one of the DA CRUD commands are issued with all the correct attributes I need.

This one did call for a rather large redesign of how I put things together;

First I had to take the DA_S::LSD out the DA pm file and put it in its own file LSD.pm and in that I added the Scaffold code like this





package DA_S::LSD; use Moose;

use MooseX::Scaffold;

MooseX::Scaffold->setup_scaffolding_import; sub SCAFFOLD {

my $class = shift;

my %given = @_;

$class->has($given{kind} => is=>'ro', isa=>'Object', required=>1);



}





if ($conn eq 'DBH'){

use DA_S::LSD::SQL;

$lsd = DA_S::LSD::SQL->new(DA=>$self);

}



Next I adjusted my DA_S.pm reteive sub to this;Now that is a little problematic as I have know Idea what my LSD writer will pick as a name and I cannot define it for them. However, I expected this as I would not know what Role name they picked as well so it has always been part of my evil plan to have the LSDs load via a namespace but that will be in a much later post.

Finally the part I had to adjust the most were my LSD roles. I had to convert them back to a Class and then add in the following;





use Moose;

with qw(DA::Roles::API);

use MooseX::ClassAttribute;

use DA_S::LSD kind => 'DA';



ok 8 - Address is a DA_S

ok 9 - SQL correct



Now what should happen is when I create my new $lsd in DA_S the scaffolding in DA_S::LSD should kick in and then apply the 'DA' attribute to the DA_S::LSD::SQL with the correct instance value of the current DA. Guess what! this worked;as my test shows.

Now for the Mogo one I though that maybe I can work a little majick here. So in the Mongo I did this





use Moose;

with qw(DA::Roles::API);

use MooseX::ClassAttribute;

use DA_S::LSD elements=>'elements', view=>'view';





$sql .= $self->view()->name();

$sql .= ".find({},{"; foreach my $element ( @{ $self->elements() } ) { $sql .= $delimiter . $element->name() . ": 1";

$delimiter = ", ";





elsif ($conn eq 'MONGO'){

use DA_S::LSD::Mongo;

$lsd = DA_S::LSD::Mongo->new(elements=>$self->elements,view=>$self->view);





sub SCAFFOLD {

my $class = shift;

my %given = @_;

$class->has($given{kind} => is=>'ro', isa=>'Object', required=>1)

if (exists($given{kind}) );



$class->has(elements => is=>'ro', isa=>'ArrayRef', required=>1)

if (exists($given{elements} ));



$class->has(view => is=>'ro', isa=>'Object', required=>1)

if (exists($given{view} ));

}





ok 9 - SQL correct

ok 10 - Mongo Query correct

and changed the retrieve code a little to thisand in my DA_S I did thisand in the DA_S::LSD thisand all my tests incluging the Mongo passedSo now I have a very quick way without iteration to get the Element, View and any other DA level attributes into my LSD instances.

Ok this this one I am going to keep around despite a few problems like needing to have the LSD classes in my DA class and trying to ensure that my LSD writer adds in the proper scaffolding call to DA_::LSD. I am sure I can find some was to fix those up though either though a role or at BUILD time.

Well onto the next one tomorrow.



