+  # And lastly recursive mode
+  if ($params{recursive}) {
+    # don't use rose retrieval here. too slow.
+    # instead use recursive sql to get all the linked record_links entrys, and retrieve the objects from there
+    my $query = <<"";
+      WITH RECURSIVE record_links_rec_${wanted}(id, from_table, from_id, to_table, to_id, depth, path, cycle) AS (
+        SELECT id, from_table, from_id, to_table, to_id,
+          1, ARRAY[id], false
+        FROM record_links
+        WHERE ${myself}_id = ? and ${myself}_table = ?
+      UNION ALL
+        SELECT rl.id, rl.from_table, rl.from_id, rl.to_table, rl.to_id,
+          rlr.depth + 1, path || rl.id, rl.id = ANY(path)
+        FROM record_links rl, record_links_rec_${wanted} rlr
+        WHERE rlr.${wanted}_id = rl.${myself}_id AND rlr.${wanted}_table = rl.${myself}_table AND NOT cycle
+      )
+      SELECT DISTINCT ON (${wanted}_table, ${wanted}_id)
+        id, from_table, from_id, to_table, to_id, path, depth FROM record_links_rec_${wanted}
+      WHERE NOT cycle
+      ORDER BY ${wanted}_table, ${wanted}_id, depth ASC;
+
+    my $links     = selectall_hashref_query($::form, $::form->get_standard_dbh, $query, $self->id, $self->meta->table);
+    my $link_objs = SL::DB::Manager::RecordLink->get_all(query => [ id => [ map { $_->{id} } @$links ] ]);
+    my @objects = map { $get_objects->($_) } @$link_objs;
+
+    if ($params{save_path}) {
+       my %links_by_id = map { $_->{id} => $_ } @$links;
+       for (@objects) {
+         $_->{_record_link_path}  = $links_by_id{$_->{_record_link}->id}->{path};
+         $_->{_record_link_depth} = $links_by_id{$_->{_record_link}->id}->{depth};
+       }
+    }
+
+    return \@objects;
+  }