bb19f0597ee496e01688f8c99aead4c6a58818a5
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Collection / Role / Order.pm
1 package Reaction::UI::ViewPort::Collection::Role::Order;
2
3 use Reaction::Role;
4
5 use namespace::clean -except => [ qw(meta) ];
6
7
8 has order_by      => (isa => 'Str', is => 'rw', trigger_adopt('order_by'), clearer => 'clear_order_by');
9 has order_by_desc => (isa => 'Int', is => 'rw', trigger_adopt('order_by'), lazy_build => 1);
10 sub _build_order_by_desc { 0 };
11 sub adopt_order_by {
12   shift->clear_current_collection;
13 };
14
15 after clear_order_by => sub {
16   my ($self) = @_;
17   $self->order_by_desc(0);
18   $self->clear_current_collection;
19 };
20
21 around _build_current_collection => sub {
22   my $orig = shift;
23   my ($self) = @_;
24   my $collection = $orig->(@_);
25   my %attrs;
26
27   #XXX DBICism that needs to be fixed
28   if ($self->has_order_by) {
29     $attrs{order_by} = $self->order_by;
30     $attrs{order_by} .= ' DESC' if ($self->order_by_desc);
31   }
32
33   return $collection->where(undef, \%attrs);
34 };
35
36 around accept_events => sub { ('order_by', 'order_by_desc', shift->(@_)); };
37
38
39
40 1;