Как добавить динамический метод к классу через модуль?

Добрый день. Задача есть модуль код которого подмешивается в различные классы и содержит базовые функции, но в зависимости от класса в данном модуле должны появляться дополнительные методы.
Пример, который не работает:
module SuperAbility
	define_method(:basic) do
		puts 'i can some basic action'
	end

	@@additional_ability ||= :action
	define_method(@@additional_ability) do
		puts "i can make action: #{__method__}"
	end
end

class Cow
	@@additional_ability = :mooo
	include SuperAbility
end

class Dragon
	@@additional_ability = :fire
	include SuperAbility
end

cow = Cow.new
cow.basic
cow.mooo

drag = Dragon.new
drag.basic
drag.fire

Желательно провернуть не загромождая код, желательно без @@ и @, можно использовать attr. Интересует именно с модулем.
Подскажите пожалуйста
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
require "active_support/concern"

module HasAbilities
  extend ActiveSupport::Concern

  class_methods do
    def has_ablilities(*args, **options)
      args.each do |name|
        define_method(:"#{name}") do |value|
          puts "i can make action: #{name}"
        end
      end
    end    
  end
end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы