use warnings;
use base qw( DBIx::Class );
-use List::Util 'first';
-use namespace::clean;
-
=head1 NAME
DBIx::Class::Ordered - Modify the position of objects in an ordered list.
=cut
-__PACKAGE__->mk_classdata( 'position_column' => 'position' );
+__PACKAGE__->mk_classaccessor( 'position_column' => 'position' );
=head2 grouping_column
=cut
-__PACKAGE__->mk_classdata( 'grouping_column' );
+__PACKAGE__->mk_group_accessors( inherited => 'grouping_column' );
=head2 null_position_value
=cut
-__PACKAGE__->mk_classdata( 'null_position_value' => 0 );
+__PACKAGE__->mk_classaccessor( 'null_position_value' => 0 );
=head2 siblings
my $position_column = $self->position_column;
+ my $rsrc = $self->result_source;
+
my $is_txn;
- if ($is_txn = $self->result_source->schema->storage->transaction_depth) {
+ if ($is_txn = $rsrc->schema->storage->transaction_depth) {
# Reload position state from storage
# The thinking here is that if we are in a transaction, it is
# *more likely* the object went out of sync due to resultset
$self->store_column(
$position_column,
- ( $self->result_source
- ->resultset
+ ( $rsrc->resultset
->search($self->_storage_ident_condition, { rows => 1, columns => $position_column })
->cursor
->next
return 0;
}
- my $guard = $is_txn ? undef : $self->result_source->schema->txn_scope_guard;
+ my $guard = $is_txn ? undef : $rsrc->schema->txn_scope_guard;
my ($direction, @between);
if ( $from_position < $to_position ) {
my $new_pos_val = $self->_position_value ($to_position); # record this before the shift
# we need to null-position the moved row if the position column is part of a constraint
- if (grep { $_ eq $position_column } ( map { @$_ } (values %{{ $self->result_source->unique_constraints }} ) ) ) {
+ if (grep { $_ eq $position_column } ( map { @$_ } (values %{{ $rsrc->unique_constraints }} ) ) ) {
$self->_ordered_internal_update({ $position_column => $self->null_position_value });
}
if (! keys %$changed_ordering_cols) {
return $self->next::method( undef, @_ );
}
- elsif (defined first { exists $changed_ordering_cols->{$_} } @group_columns ) {
+ elsif (grep { exists $changed_ordering_cols->{$_} } @group_columns ) {
$self->move_to_group(
# since the columns are already re-set the _grouping_clause is correct
# move_to_group() knows how to get the original storage values
# add the current position/group to the things we track old values for
sub _track_storage_value {
my ($self, $col) = @_;
- return $self->next::method($col) || defined first { $_ eq $col } ($self->position_column, $self->_grouping_columns);
+ return (
+ $self->next::method($col)
+ ||
+ grep { $_ eq $col } ($self->position_column, $self->_grouping_columns)
+ );
}
=head1 METHODS FOR EXTENDING ORDERED
=cut
-__PACKAGE__->mk_classdata( '_initial_position_value' => 1 );
+__PACKAGE__->mk_classaccessor( '_initial_position_value' => 1 );
=head2 _next_position_value
local $rsrc->schema->{_ORDERED_INTERNAL_UPDATE} = 1;
my @pcols = $rsrc->primary_columns;
if (
- first { $_ eq $position_column } ( map { @$_ } (values %{{ $rsrc->unique_constraints }} ) )
+ grep { $_ eq $position_column } ( map { @$_ } (values %{{ $rsrc->unique_constraints }} ) )
) {
my $clean_rs = $rsrc->resultset;