How to return Option<Self> from a trait

Notice how you can restrict Self the same way you can restrict T in a parameterized type.

trait X where Self: Sized {
  fn parent(&self) -> Option<Self>;
}

#[derive(Clone)]
struct Bar;

impl X for Bar {
  fn parent(&self) -> Option<Bar> {
    return Some(self.clone());
  }
}

#[test]
fn foo() {
  let x = Bar;
  let y = Bar.parent();
}