Model-Envoy
view release on metacpan or search on metacpan
lib/Model/Envoy/Storage/DBIC.pm view on Meta::CPAN
next if $no_rel && exists $relationships{$attr};
if ( blessed $db_result->$attr && $db_result->$attr->isa('DBIx::Class::ResultSet') ) {
my $attribute = $model_class->meta->find_attribute_by_name($attr);
my $class_attr = $attribute->meta->find_attribute_by_name('moose_class');
my $factory = $class_attr ? $class_attr->get_value($attribute) : undef;
$factory ||= ( $attribute->type_constraint->name =~ / (?:ArrayRef|Maybe) \[ (.+?) \] /x )[0];
if ( $factory ) {
$data->{$attr} = [ map { $factory->build( $_, 1 ) } $db_result->$attr ];
}
}
else {
$data->{$attr} = $db_result->$attr;
}
}
return $data;
}
sub _db_save_relationship {
my ( $self, $attr ) = @_;
my $dbic_result = $self->_dbic_result;
my $name = $attr->name;
my $type = $attr->meta->get_attribute('rel')->get_value($attr);
my $value = $self->model->$name;
if ( $type eq 'many_to_many' ) {
my $setter = 'set_' . $name;
my $records = $self->_value_to_db( $value );
$dbic_result->$setter( $self->_value_to_db( $value ) );
for ( my $i=0; $i < @$value; $i++ ) {
$value->[$i]->get_storage('DBIC')->update_model($records->[$i]);
}
}
elsif ( $type eq 'has_many' ) {
foreach my $model ( @$value ) {
my $result = $self->_value_to_db( $model );
# update_or_create_related can be noisy due to
# https://rt.cpan.org/Public/Bug/Display.html?id=104839
my $data = { $result->get_columns };
$result = $dbic_result->update_or_create_related( $name => {
map { $_ => $data->{$_} }
grep { defined $data->{$_} }
keys %$data
} );
$model->get_storage('DBIC')->update_model($result);
}
}
}
sub update_model {
my ( $self, $dbic_result ) = @_;
$self->model->update( $self->_data_for_model( ref $self->model, $dbic_result ) );
}
sub delete {
my ( $self ) = @_;
if ( $self->_dbic_result->in_storage ) {
$self->_dbic_result->delete;
}
return;
}
sub in_storage {
my ( $self ) = @_;
return $self->_dbic_result->in_storage;
}
class_has '_cached_dbic_attrs' => (
is => 'rw',
isa => 'HashRef',
default => sub { {} },
);
sub _dbic_attrs {
my ( $self, $model ) = @_;
$model //= $self->model;
my $model_class = ref $model;
$model_class ||= $model;
if ( ! $self->_cached_dbic_attrs->{ $model_class } ) {
$self->_cached_dbic_attrs->{ $model_class } = [
grep { $_->does('DBIC') }
$model->meta->get_all_attributes
];
}
return $self->_cached_dbic_attrs->{ $model_class }
}
sub _dbic_columns {
my ( $self, $model ) = @_;
$model //= $self->model;
return [
grep { $_->does('DBIC') && ! $_->is_relationship }
$model->meta->get_all_attributes
];
}
sub _dbic_relationships {
my ( $self, $model ) = @_;
( run in 0.555 second using v1.01-cache-2.11-cpan-437f7b0c052 )