Never Role Twice!

Well did a little more playing about with my applied roles on my and added in a bunch more testing to see if things where working for me.

First I wanted to see if using a role twice caused any ill effects so I added

$address->retrieve( 'DBH', $result ) eq
'SELECT street, city, country FROM person AS me',
'SQL correct'

$address->retrieve('MONGO') eq
'db.person.find({},{ street: 1, city: 1, country: 1}',
"Mongo Query correct"

to the end of my test and they both passed.

ok 9 - SQL correct
ok 10 - Mongo Query correct
ok 11 - SQL correct
ok 12 - Mongo Query correct

which is good I can flip between LSDs without much problem. Then I though that there could be some code bleed between the roles so in DA::LSD::Mongo I commented out the with statement

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

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

and re-ran my tests and unfortunately there was some code bleed as all my test passed!

So obviously the 'DA::Roles::API' is applied in the first call to 'retrieve' and sticks about.

I wanted to see how bad this bleed-out is so I added a sub ping to SQL and a sub pong to Mongo and added in these tests before the final two

eval {
pass("address can pong");
if ($@) {
fail("address cannot do a pong");

eval {
pass("address can ping");
if ($@) {
fail("address cannot do a ping");

and got this

ok 11 - address can pong
ok 12 - address can ping

Ouch! that will cause problems. Using roles like this causes the common subs like '_execute' to be overwritten on the role apply but extra methods, and attributes as well, do like our Aussie cousins say 'Hang around like a fart in a phone booth'.

So this blead of code that will really screw up the consitant API I want to make. Just think of the the mayhem that would result if a sneak an LSD in there wiht out the requited subs, simply by loading one with the correct role first. Mogo calls to DBI and vice versa.

Defintly not the way I want to go.

So it is back to the drawing board.

Anyway here is a picture of some cute kittens to make up for this short post


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