def a_random_method_not_defined_in_a_class puts self.class # outputs ExampleClass puts @a_private_member # works end class ExampleClass def initialize(a_private_member) @a_private_member = a_private_member end def a_method a_random_method_not_defined_in_a_class end end # This calls a_random_method_not_defined_in_a_class like a private method of ExampleClass's ExampleClass.new("I'm a private member leaked to an outside method!").a_method # This is because top-level methods are actually privte methods from Obejct puts Object.private_method_defined?(:a_random_method_not_defined_in_a_class) # true # And classes inherit from Object by default puts ExampleClass.ancestors.include?(Object) # true # Tested with # * ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14] # * ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin15] # * ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15] # * ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16] # * ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15] # using this: # for RUBY_VERSION in $(rvm list strings); do rvm use $RUBY_VERSION; ruby --version; ruby encapsulation-problem.rb; done