a8d2f19 13 years ago
1 contributor
74 lines | 1.493kb
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<orders>

    my $orders = $result->orders;
    $result = $result->orders(\%orders);

Parts of order by clause

=head1 METHODS

L<DBIx::Custom::Result> inherits all methods from L<Object::Simple>
and implements the following new ones.

=head2 C<prepend>

    $order->prepend('title', 'author desc');

Prepend order parts to C<orders>.

=head2 C<to_string>

    my $order_by = $order->to_string;

Create order by clause. If column name is duplicated, First one is used.
C<to_string> override stringification. so you can write the follwoing way.

    my $order_by = "$order";

=cut