[Omaha.pm] Moose::Meta::Attribute::Native::Trait::Array (mouthful) object sorting by attributes

pbaker0804 pbaker0804 at gmail.com
Fri May 13 05:40:38 PDT 2011


I have an guest object that stores information.  It has several attributes,
including an array of stay history records that are
Moose::Meta::Attribute::Native::Trait::Array objects.  I wanted a special
handler method on it that always sorted the stay objects in "EndDate"
order.  I also needed to display all this info in a Template::Toolkit
template.

My Moose config for the "StayHistory" object ended up like this in the
parent class:

...
has 'StayHistory' => (               #
Moose::Meta::Attribute::Native::Trait::Array
   traits  => ['Array'],                 # of
Omni2::Control::OWS::HotelReservation objects
   is      => 'ro',
   isa     => 'ArrayRef[Object]',
   default => sub { [] },
   handles => {
      all_stays    => 'elements',
      add_stay     => 'push',
      map_stays    => 'map',
      filter_stay  => 'grep',
      find_stay    => 'first',
      get_stay     => 'get',
      join_stays   => 'join',
      count_stays  => 'count',
      has_stays    => 'count',
      has_no_stays => 'is_empty',
      sorted_stays => [ sort => sub { $_[1]->EndDate cmp $_[0]->EndDate } ],
   },
);
...

Here's my actual StayHistory Moose attributes, any of which can be sorted on
using the above method:

package Omni2::Control::OWS::StayHistory;
use Moose;
has '_twig'              => (is => 'rw', isa => 'Object', required => 1);  #
XML::Twig::Elt
has 'site'                => (is => 'rw', isa => 'Str', default=>'OM');
has 'UniqueID'         => (is => 'rw', isa => 'Str');
has 'StartDate'        => (is => 'rw', isa => 'Str');
has 'EndDate'         => (is => 'rw', isa => 'Str');
has 'hotelCode'       => (is => 'rw', isa => 'Str');
has 'Base'              => (is => 'rw', isa => 'Str');
has 'Total'               => (is => 'rw', isa => 'Str');
has 'currencyCode'  => (is => 'rw', isa => 'Str');
has 'ADULT'            => (is => 'rw', isa => 'Str');
has 'CHILD'               => (is => 'rw', isa => 'Str');
...

All I had to do was add a FOREACH in TT and use the "sorted_stays" method
above:
...
    [% FOREACH row IN sg.sorted_stays %]
       <tr
onMouseover="this.bgColor='#FFFFFF'"onMouseout="this.bgColor='#F7EDD3'">
          <td>OM</td>
          <td>[% row.UniqueID %]</td>
          <td>[% row.hotelCode %]</td>
          <td>[% row.StartDate %]</td>
          <td>[% row.EndDate %]</td>
          <td>[% row.ADULT %]</td>
          <td>[% row.CHILD %]</td>
          <td>[% row.Base %]</td>
          <td>[% row.Total %]</td>
          <td>[% row.currencyCode %]</td>
       </tr>
    [% END %]
...

Easy!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/omaha-pm/attachments/20110513/8e1d12a4/attachment.html>


More information about the Omaha-pm mailing list