Any way to determine which object called a method?
dynamic-languages, introspection, messaging, ruby
Solution
As an option, there is a `binding_of_caller` gem that allows you to execute code in context of any caller on the call stack (caller, caller's caller and so on). It's useful for inspecting (read do anything at any position on the call stack) call stack in development, as used in `better_errors`.
Objects of class `Binding` encapsulate the execution context at some particular place in the code and retain this context for future use.
– http://www.ruby-doc.org/core-2.1.4/Binding.html
Should I mention, this technique should only be used for debugging, fun or educational purposes, because it violates principles of OOP really badly. Mostly because of `eval`.
Let's prepare stuff:
require 'binding_of_caller' # I assume, you installed this gem already?
Get the immediate (closest on stack, hence `0`) caller instance:
binding.of_caller(0).eval('self')
...or even an immediate calling method:
binding.of_caller(0).eval('__method__')
If you need to get higher up the call stack, use numbers other than `0` for getting a caller's binding.
Awfully hacky. But if you really need this — there you go.
Problem
I'm hoping that Ruby's message-passing infrastructure means there might be some clever trick for this. How do I determine the calling object -- which object called the method I'm currently in?