Is it possible that that code that you passed $dbh into wasn't accidentally de-referencing $dbh somewhere? If $dbh was being inappropriately dereferenced in the One and Two packages (for example) then that would explain why passing a reference to a reference would fix it. It may not have anything to do with DBI at all.
I don't think that happened, because if I somehow managed
to dereference it, the first method I tried to call on it
would give an error. I also couldn't have fixed the problem
by adding the reference and an extra dereference (which I
failed to mention having done), because there would still
have been the double dereference.