[Koha-bugs] [Bug 14539] New: castToObject(), aka. make a Koha::Object from various input types

bugzilla-daemon at bugs.koha-community.org bugzilla-daemon at bugs.koha-community.org
Thu Jul 16 15:06:26 CEST 2015


http://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=14539

            Bug ID: 14539
           Summary: castToObject(), aka. make a Koha::Object from various
                    input types
 Change sponsored?: ---
           Product: Koha
           Version: master
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P5 - low
         Component: Architecture, internals, and plumbing
          Assignee: gmcharlt at gmail.com
          Reporter: olli-antti.kivilahti at jns.fi
        QA Contact: testopia at bugs.koha-community.org

Currently Koha is like an archeological dig site, we have different layers of
dealing with various business objects.

We started with DBI and numerous ways of passing an HASH around. There is no
telling if it will be a List of column => values, or a reference to HASH, or a
HASH or just any of the business object's (eg. Borrower's) unique identifiers
(userid, cardnumber, borrowernumber).

Then DBIx came to the rescue and now we are need to learn DBI and DBIx and SQL
to do DB operatons in Koha. Migration to DBIx is on the way.

Finally we have Koha::Object and subclasses, which include and use the DBIx,
but those are not directly compatible, since Koha::Object is not a subclass of
DBIx::Class making life occasionally miserable.
Now we need to know 3 methods of DB accession.

I am really frustrated with all of those different layers of history, and
making things work nicely across all different programming patterns, I have had
great success in using a casting system, where we take any value and try to
make a Koha::Object-subclass out of it.

So we try to cast a Scalar or a reference of Koha::Object-implementation or
DBIx::ResultSet or HASH, to the desired Koha::Object-implementation.
This is a nice validation/entry function in any subroutine dealing with
business objects, making sure that we always have the "correct" implementation
of the same business object.

An example:
#Does this look familiar?
my $borrower = 1042; #A borrowernumber?
my $user = '121A0321312'; #A cardnumber? or userid?
my $borrower = {borrowernumber => 1043, cardnumber => '121A0321312', ...};
#HASH
my $borrower = Koha::Borrowers->find({borrowernumber => 1024});
my $borrower = $schema->resultset('Borrower')->find({borrowernumber => 1024});

#So when I call my subroutine with the $borrower I got using some function,
makeBorrowerHappy($borrower);
#Bad things most often happen.

#But if my makeBorrowerHappy()-function would cast its parameters to the
#correct type, there would be only merriment and fun!
sub makeBorrowerHappy {
    my ($borrower) = @_;
    $borrower = Koha::Borrowers::castToBorrower($borrower);

    ... #Do fun stuff!
}
#Whatever we throw at the subroutine, things just work (in theory)!

Even better, if the $borrower already is a DBIx-derivative or Koha::Borrower,
we don't even do anything, other than simple if statements. So minimally
expensive, maximally productive.

-- 
You are receiving this mail because:
You are watching all bug changes.


More information about the Koha-bugs mailing list