+ # Copy custom variables.
+ foreach my $var (@{ $source->cvars_by_config }) {
+ $self->cvar_by_name($var->config->name)->value($var->value);
+ }
+
+ my %paste_template_result;
+
+ # Clone text blocks and pictures.
+ my $clone_and_reset_position = sub {
+ my ($src_obj) = @_;
+ my $cloned = Rose::DB::Object::Helpers::clone_and_reset($src_obj);
+ $cloned->position(undef);
+ return $cloned;
+ };
+
+ my $clone_text_block = sub {
+ my ($text_block) = @_;
+ my $cloned = Rose::DB::Object::Helpers::clone_and_reset($text_block);
+ $cloned->position(undef);
+ $cloned->pictures([ map { $clone_and_reset_position->($_) } @{ $text_block->pictures_sorted } ]);
+ return $cloned;
+ };
+
+ $paste_template_result{text_blocks} = [ map { $clone_text_block->($_) } @{ $source->text_blocks_sorted } ];
+
+ if (!$params->{paste_template}) {
+ $self->text_blocks($paste_template_result{text_blocks});
+ } else {
+ $self->add_text_blocks($paste_template_result{text_blocks});
+ }
+
+ # Clone additional parts.
+ $paste_template_result{parts} = [ map { $clone_and_reset_position->($_) } @{ $source->parts } ];
+ my $accessor = $params->{paste_template} ? "add_parts" : "parts";
+ $self->$accessor($paste_template_result{parts});