+my %_skip_fields_when_cloning = map { ($_ => 1) } qw(itime mtime);
+
+sub clone_and_reset {
+ my($self) = shift;
+ my $class = ref $self;
+ my $cloning = Rose::DB::Object::Constants::STATE_CLONING();
+ local $self->{$cloning} = 1;
+
+ my $meta = $class->meta;
+ my @accessors = $meta->column_accessor_method_names;
+ my @mutators = $meta->column_mutator_method_names;
+ my @column_names =
+ grep { $_->[0] && $_->[1] && !$_skip_fields_when_cloning{ $_->[0] } }
+ pairwise { no warnings qw(once); [ $a, $b] } @accessors, @mutators;
+
+ my $clone = $class->new(map { my $method = $_->[0]; ($_->[1] => $self->$method) } @column_names);
+
+ # Blank all primary and unique key columns
+ my @keys = (
+ $meta->primary_key_column_mutator_names,
+ map { my $uk = $_; map { $meta->column_mutator_method_name($_) } ($uk->columns) } ($meta->unique_keys)
+ );
+
+ $clone->$_(undef) for @keys;
+
+ # Also copy db object, if any
+ $clone->db($self->{db}) if $self->{db};
+
+ return $clone;
+}
+
+sub presenter {
+ my ($self) = @_;
+
+ my $class = ref $self;
+ $class =~ s{^SL::DB::}{};
+ $class = "SL::Presenter::" . ($db_to_presenter_mapping{$class} // $class);
+
+ return SL::DB::Helper::Presenter->new($class, $self);
+}
+
+sub as_debug_info {
+ my ($self) = @_;
+
+ return {
+ map {
+ my $column_name = $_->name;
+ my $value = $self->$column_name;
+ $value = !defined($value) ? undef : "${value}";
+ ($_ => $value)
+ } $self->meta->columns
+ };
+}
+