module M1 def f(m); super :M1; end end module M2 def f(m); super :M2; end end class C def f(m); end end class D < C def f(m); super :D; end include M1 end class E < D def f(m); super :E; end include M2 end E.new.f(:top) __END__ # Classes module M1 def f : (:D) -> nil end module M2 def f : (:E) -> nil end class C def f : (:M1) -> nil end class D < C include M1 def f : (:M2) -> nil end class E < D include M2 def f : (:top) -> nil end