Здравствуйте, сегодня наткнулся на интересный Ruby гем Contracts, как он работает и его исходный код можно посмотреть тут. И у меня появился вопрос, как это гем достает имя следующего после Contract ... => ... метода, исходный код проекта не дал мне ответов (возможно я не там искал).
Ответ
Cредствами мета-программирования гем вмешивается в процесс определения каждого из инстанс-методов класса.
Обратите внимание на файл lib/contracts/decorators.rb в нем переопределен метод method_added(), который вызывается, когда вы определяете метод при помощи конструкции def
def method_added(name)
MethodHandler.new(name, false, self).handle
super
end
Метод принимает параметр name с именем определяемого метода, вы сначала выполняете контракт и лишь затем вызываете оригинальный метод super, который осуществляет определение метода. Если контракт вызовет исключение (raise) - до определения метода дело даже не дойдет. Если контракт действительный или его нет, то Module#method_added просто штатно продолжит свою работу.
Комментариев нет:
Отправить комментарий