class Controller attr_reader :tag def initialize @tag = "Controller" @window = Window.new(self) @window.show hello hello_again end end class Window attr_reader :tag def initialize(controller) @controller = controller end def show @tag = "World" @controller.instance_eval do def hello puts "Hello #{tag}!" # => Hello Controller! end end # Find controller's instance variable that is current self. window = @controller.instance_variables.find { |var| @controller.instance_variable_get(var) == self } # Now we can use the outer self within the instance_eval. @controller.instance_eval(%Q/ def hello_again tag = #{window}.tag puts "Hello #{tag}!" # => Hello World! end /) end end Controller.new