+sub _get_columns_by_accessor {
+ my $self = shift;
+ my $source = $self->result_source;
+ my %columns;
+ for my $name ( $source->columns ){
+ my $info = $source->column_info( $name );
+ $info->{name} = $name;
+ $columns{ $info->{accessor} || $name } = $info;
+ }
+ return %columns;
+}
+
+sub _update_relation{
+ my( $self, $name, $updates, $object, $info ) = @_;
+
+ my $related_result = $self->related_resultset( $name )->result_source->resultset;
+ my $resolved = $self->result_source->resolve_condition(
+ $info->{cond}, $name, $object
+ );
+# warn 'resolved: ' . Dumper( $resolved ); use Data::Dumper;
+ $resolved = undef if $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION == $resolved;
+ if( ref $updates->{$name} eq 'ARRAY' ){
+ for my $sub_updates ( @{$updates->{$name}} ) {
+ my $sub_object = $related_result->recursive_update( $sub_updates, $resolved );
+ }
+ }
+ else {
+ my $sub_object = $related_result->recursive_update( $updates->{$name}, $resolved );
+ $object->set_from_related( $name, $sub_object );
+ }
+}
+
+
+sub is_m2m {
+ my( $self, $relation ) = @_;
+ my $rclass = $self->result_class;
+ # DBIx::Class::IntrospectableM2M
+ if( $rclass->can( '_m2m_metadata' ) ){
+ return $rclass->_m2m_metadata->{$relation};
+ }
+ my $object = $self->new({});
+ if ( $object->can($relation) and
+ !$self->result_source->has_relationship($relation) and
+ $object->can( 'set_' . $relation)
+ ){
+ return 1;
+ }
+ return;
+}
+
+sub get_m2m_source {
+ my( $self, $relation ) = @_;
+ my $rclass = $self->result_class;
+ # DBIx::Class::IntrospectableM2M
+ if( $rclass->can( '_m2m_metadata' ) ){
+ return $self->result_source
+ ->related_source(
+ $rclass->_m2m_metadata->{$relation}{relation}
+ )
+ ->related_source(
+ $rclass->_m2m_metadata->{$relation}{foreign_relation}
+ );
+ }
+ my $object = $self->new({});
+ my $r = $object->$relation;
+ return $r->result_source;
+}
+
+