package DBIx::Custom::Order; use Object::Simple -base; use DBIx::Custom::Util '_deprecate'; use overload 'bool' => sub {1}, '""' => sub { shift->to_string }, fallback => 1; has 'dbi', orders => sub { [] }; sub prepend { my $self = shift; for my $order (reverse @_) { if (ref $order eq 'ARRAY') { _deprecate('0.24', "prepend method receiving array reference is DEPRECATED! " . "use q method to quote column name."); my $column = shift @$order; $column = $self->dbi->q($column) if defined $column; my $derection = shift @$order; $order = $column; $order .= " $derection" if $derection; } 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::Order - Order by clause =head1 SYNOPSIS # Result my $order = DBIx::Custom::Order->new; $order->prepend('title', 'author desc'); my $order_by = "$order"; =head1 ATTRIBUTES =head2 dbi my $dbi = $order->dbi; $order = $order->dbi($dbi); L object. =head2 orders 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 prepend $order->prepend('title', 'author desc'); Prepend order parts to C. =head2 to_string 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