package DBIx::Custom::Order; use Object::Simple -base; use overload 'bool' => sub {1}, '""' => sub { shift->to_string }, fallback => 1; has orders => sub { [] }; sub prepend { unshift @{shift->orders}, @_ } sub to_string { my $self = shift; my $exists = {}; my @orders; foreach my $order (@{$self->orders}) { next unless defined $order; $order =~ s/^\s+//; $order =~ s/\s+$//; my ($column, $direction) = split /\s+/, $order; push @orders, $order unless $exists->{$column}; $exists->{$column} = 1; } return '' unless @orders; return 'order by ' . join(', ', @orders); } 1; =head1 NAME DBIx::Custom::Order - Order by EXPERIMENTAL =head1 SYNOPSIS # Result my $order = DBIx::Custom::Order->new; $order->prepend('title', 'author desc'); my $order_by = "$order"; =head1 ATTRIBUTES =head2 C my $orders = $result->orders; $result = $result->orders(\%orders); Parts of order by clause =head1 METHODS L inherits all methods from L and implements the following new ones. =head2 C $order->prepend('title', 'author desc'); Prepend order parts to C. =head2 C my $order_by = $order->to_string; Create order by clause. If column name is duplicated, First one is used. C override stringification. so you can write the follwoing way. my $order_by = "$order"; =cut