Método de interceptação em Ruby

Como interceptar todas as chamadas para um método.
Considere que você tem uma aula como esta:

class MyService
def do_something
p
"i'm doing something very interesting"
end
end

E você deseja executar algo antes e depois da execução do método do_something. Como você pode fazer isso sem tocar na implementação atual?

Reabra a classe, defina um apelido para fazer algo e reescreva para fazer algo extra.
Como isso:

MyService.class_eval do
alias :do_something_new :do_something

def do_something
p
"i'm ready to do something"
do_something_new

p
"i did something interesting, isn't it?"
end
end

Agora, se você chamar do_something, terá:

service = MyService.new
service
.do_something
>> "i'm ready to do something"
>> "i'm doing something very interesting"
>> "i did something interesting, isn't it?"