On Mon, 28 Mar 2011 09:49:22 -0700, Sam Brain <s...@stanford.edu> wrote:
> (1) Does DBIx::BuildMooseObjects seem a reasonable name, and

I don't see anything Moose-specific here.  The interesting bit is the
transformation from a single-level array to a multi-level structure grouped by
specific values, and you could write that without any objects at all, e.g.

>    J Smith | M   | 35  | A Jones, MD | 12/08/2009 | B.P    | 120/80
>    J Smith | M   | 35  | A Jones, MD | 12/08/2009 | Weight | 156
>    J Smith | M   | 35  | A Jones, MD | 03/19/2010 | B.P    | 122/88

can just be transformed into:

  [
    {
      name => 'J Smith',
      sex  => 'M',
      age  => 35,
      visits => [
        {
          md_name => 'A Jones, MD',
          date    => '12/08/2009',
          tests   => [ ... ]
        },
        {
          md_name => 'A Jones, MD',
          date    => '03/19/2010',
          tests   => [ ... ]
        }
      ]
    }
  ]
    
So, write a function that does that, though you probably already have one, or
most of one.  Then write coercions for your Moose classes from HashRef and
ArrayRef[HashRef]:

  coerce 'Test', from 'HashRef', via { Test->new($_) };
  subtype 'ArrayRefOfTest', as 'ArrayRef[Test]';
  coerce 'ArrayRefOfTest', from 'ArrayRef[HashRef]',
    via { [ map { Test->new($_) } @$_ ] };

Assuming you write coercions for Test, Visit, and Patient, all you need then is
to call Patient->new with the nested data structure above:

  my @patients = map { Patient->new($_) }
    your_grouping_function($dbh->selectall_arrayref, ...);

hdp.

Reply via email to