DBIx-ObjectMapper
view release on metacpan or search on metacpan
lib/DBIx/ObjectMapper/Mapper/Instance.pm view on Meta::CPAN
}
else {
my $prop = $class_mapper->attributes->property_info($name);
if( my $getter = $prop->getter ) {
return $self->instance->$getter();
}
else {
return wantarray
? ( $self->instance->{ $prop->name || $name } )
: $self->instance->{ $prop->name || $name };
}
}
}
sub set_val {
my ( $self, $name, $val ) = @_;
return unless $self->instance; ## maybe in global destruction.
local $call = 1;
my $class_mapper = $self->instance->__class_mapper__;
if( my $setter = $class_mapper->accessors->generic_setter ) {
$self->instance->$setter($name => $val);
}
else {
my $prop = $class_mapper->attributes->property_info($name);
if( my $setter = $prop->setter ) {
$self->instance->$setter($val);
}
else {
$self->instance->{$prop->name || $name} = $val;
}
}
return $val;
}
sub is_modified {
my $self = shift;
my $is_modified = $self->{is_modified};
return $is_modified unless $self->instance; ## maybe in global destruction.
my $class_mapper = $self->instance->__class_mapper__;
my $modified_data = $self->modified_data;
for my $prop_name ( $class_mapper->attributes->property_names ) {
my $prop = $class_mapper->attributes->property_info($prop_name);
my $col = $prop->name || $prop_name;
my $val = $self->get_val($prop_name);
next unless $prop->type eq 'column' and ref $val;
if( $self->unit_of_work->change_checker->is_changed( $val ) ) {
$modified_data->{$prop_name} = $val;
$is_modified = 1;
}
}
return $is_modified;
}
sub modified_data { $_[0]->{modified_data} }
sub update {
my ( $self ) = @_;
confess 'it need to be "persistent" status.' unless $self->is_persistent;
my $reduce_data = $self->reducing;
my $modified_data = $self->modified_data;
my $uniq_cond = $self->identity_condition;
my $class_mapper = $self->instance->__class_mapper__;
my $result;
try {
my @after_cascade;
for my $prop_name ( $class_mapper->attributes->property_names ) {
my $prop = $class_mapper->attributes->property_info($prop_name);
next unless $prop->type eq 'relation';
if (ref( $prop->{isa} ) eq
'DBIx::ObjectMapper::Relation::BelongsTo' )
{
if ( $prop->{isa}->is_cascade_save_update() ) {
$prop->{isa}->cascade_update($self);
}
if( $modified_data->{$prop_name} ) {
$prop->{isa}->set_val_from_object(
$self,
$self->get_val($prop_name),
);
}
}
elsif ( $prop->{isa}->is_cascade_save_update() ) {
push @after_cascade, $prop;
}
}
my $new_val;
if( keys %$modified_data ) {
my %mod_data;
for ( keys %$modified_data ) {
my $prop = $class_mapper->attributes->property_info($_);
$mod_data{$prop->name} = $modified_data->{$_};
}
$result = $class_mapper->update( \%mod_data, $uniq_cond );
$new_val = DBIx::ObjectMapper::Utils::merge_hashref(
$reduce_data,
$modified_data
);
}
for my $c ( @after_cascade ) {
$c->{isa}->cascade_update( $self );
}
$self->_release_many_to_many_event;
$self->_modify($new_val) if $new_val;
} catch {
$self->change_status('detached');
confess $_[0];
};
$self->{is_modified} = 0;
( run in 0.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )