Krok pierwszy, stworzysz ogólny module StatsdDecorator, w którym tworzysz metodę klasy statsd_time, która przyjmuje jako argument inną metodę, po czym używa define_method do stworzenia nowej metody o tej samej nazwie, która robi to samo co ta oryginalna, tyle że wcześniej loguje to co chcesz i zbiera i przesyła statystyki do statsd.
Krok drugi, w klasie właściwej robimy include StatsdDecorator, który pozwala nam definiować metody w taki sposób:
[code]statsd_timer def run(label, opts)
…
end
[/code]
Efekt jest taki, że piszemy kod jak bez statsd, a jak chcemy wysyłać dane do statsd, to puszczamy metodę przez nasz dekorator. Czyli mamy DRY i czytelny kod. Dekorator testujemy osobno.
Oczywiście, nie działa w starych wersjach Ruby, bo def nie zwraca zdefiniowanej metody.