module Foo def call_foo foo end def call_self_foo self.foo end def call_other_foo(other) other.foo end private # <-- change this to protected and see what changes def foo puts 'Foo#foo got called' end end class Bar include Foo def bar_call_foo foo end def bar_call_self_foo self.foo end def bar_call_other_foo(other) other.foo end end class NotFoo protected def foo puts 'NotFoo#foo got called' end end Bar.new.call_foo Bar.new.call_self_foo Bar.new.call_other_foo(Bar.new) rescue puts $!.message Bar.new.call_other_foo(NotFoo.new) rescue puts $!.message