sub _extract_proxy { my $args = shift; my %main_step_data; for my $pf ( @proxy_fields ) { next if !exists $args->{$pf}; $main_step_data{$pf} = delete $args->{$pf} } return \%main_step_data; } around new => sub { my ($orig, $class) = (shift, shift); my $args = @_ > 1 ? {@_} : shift // {}; my $main_step = _extract_proxy($args); my $self = $class->$orig($args); $self->main_step_row($self->new_related( steps => $main_step, )); return $self; }; around insert => sub { my ($orig, $self) = @_; my $msr = $self->main_step_row; $self->main_step_row(undef); $self->$orig(); $msr->insert(); $self->update({'main_step_row' => $msr }); }; around update => sub { my ($orig, $self) = (shift, shift); my $args = @_ > 1 ? {@_} : shift; my $main_step_data = _extract_proxy( $args ); $main_step_data->{name} = q{}; $self->$orig($args); $self->main_step_row->$orig($main_step_data); return $self; };