classDiagram
  class Ancestor {
    attr : str
    cls_member
    get_value()
    set_value(value)
  }
  class CustomException {
  }
  class DoNothing {
  }
  class DoNothing2 {
  }
  class DoSomething {
    my_int : Optional[int]
    my_int_2 : Optional[int]
    my_string : str
    do_it(new_int: int) int
  }
  class Interface {
    get_value()*
    set_value(value)*
  }
  class NullablePatterns {
    return_nullable_1()* int | None
    return_nullable_2()* Optional[int]
  }
  class PropertyPatterns {
    prop1
    prop2
  }
  class Specialization {
    TYPE : str
    relation
    relation2
    top : str
    from_value(value: int)
    increment_value() None
    transform_value(value: int) int
  }
  Specialization --|> Ancestor
  DoNothing --* Ancestor : cls_member
  DoNothing --* Specialization : relation
  DoNothing2 --o Specialization : relation2
