+sub is_for_column {
+ my( $self, $object, $name, $value ) = @_;
+ return
+ $object->can($name)
+ && !(
+ $object->result_source->has_relationship($name)
+ && ref( $value )
+ )
+ && (
+ $object->result_source->has_column($name)
+ || !$object->can( 'set_' . $name )
+ )
+}
+
+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;
+}
+
+