Я создаю плагин, который позволит разработчику добавлять в класс различные функции с простым объявлением в определении класса (по шаблону normal act_as).
Например, код, потребляющий плагин, может выглядеть как
class YourClass
consumes_my_plugin option1: :value1, specific_method_to_use: :your_method
end
Возникает вопрос, потому что я хочу, чтобы ошибка проверяла, что значение, указанное для параметра: specific_method_to_use, существует как метод, но способ, как правило, организовывается и загружается, метод еще не существует.
Код в моем плагине выглядит примерно так:
module MyPlugin
extend ActiveSupport::Concern
module ClassMethods
def consumes_my_plugin(options = {})
raise ArgumentError.new("#{options[:specific_method_to_use]} is not defined") if options[:specific_method_to_use].present? && !self.respond_to?(options[:specific_method_to_use])
end
end
end
Это будет работать:
class YourClass
def your_method; true; end
consumes_my_plugin option1: :value1, specific_method_to_use: :your_method
end
Но так большинство людей пишут код, и это не будет:
class YourClass
consumes_my_plugin option1: :value1, specific_method_to_use: :your_method
def your_method; true; end
end
Как я могу терпеть неудачу при загрузке YourClass? Я хочу, чтобы это ошибка, а не во время выполнения с помощью NoMethodError. Могу ли я отложить выполнение строки, которая вызывает ArgumentError до загрузки всего класса, или сделать что-то еще умное для достижения этого?