e038c37 12 years ago
1 contributor
89 lines | 1.718kb
package DBIx::Custom::Next::Order;
use Object::Simple -base;
use overload
  'bool'   => sub {1},
  '""'     => sub { shift->to_string },
  fallback => 1;

has 'dbi',
    orders => sub { [] };

sub prepend {
    my $self = shift;
    
    for my $order (reverse @_) {
        unshift @{$self->orders}, $order;
    }
    
    return $self;
}

sub to_string {
    my $self = shift;
    
    my $exists = {};
    my @orders;
    for 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::Next::Order - Order by

=head1 SYNOPSIS

    # Result
    my $order = DBIx::Custom::Next::Order->new;
    $order->prepend('title', 'author desc');
    my $order_by = "$order";
    
=head1 ATTRIBUTES

=head2 C<dbi>

    my $dbi = $order->dbi;
    $order = $order->dbi($dbi);

L<DBIx::Custom::Next> object.

=head2 C<orders>

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

Parts of order by clause

=head1 METHODS

L<DBIx::Custom::Next::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