Ruby: Mixin, который добавляет методы динамического экземпляра, имена которых создаются с использованием метода класса

У меня есть следующее:

module Thing
  def self.included(base)
    base.send :extend, ClassMethods
  end

  module ClassMethods
    attr_reader :things

    def has_things(*args)
      options = args.extract_options! # Ruby on Rails: pops the last arg if it's a Hash

      # Get a list of the things (Symbols only)
      @things = args.select { |p| p.is_a?(Symbol) }

      include InstanceMethods
    end
  end

  module InstanceMethods
    self.class.things.each do |thing_name| # !!! Problem is here, explaination below
      define_method "foo_for_thing_#{thing_name}" do
        "bar for thing #{thing_name}"
      end
    end
  end
end

В другом классе, который подмешивает модуль Thing:

class Group
  has_things :one, :two, :option => "something"
end

При вызове has_things внутри класса я хотел бы иметь доступные динамические методы экземпляров "foo_for_thing_one" и "foo_for_thing_two". Например:

@group = Group.new
@group.foo_for_thing_one # => "bar for thing one"
@group.foo_for_thing_two # => "bar for thing two"

Однако я получаю следующую ошибку:

`<module:InstanceMethods>': undefined method `things' for Module:Class (NoMethodError)

Я понимаю, что "self" в указанной выше проблемной строке (первая строка модуля InstanceMethods) относится к модулю InstanceMethods.

Как мне сослаться на метод класса «вещи» (который возвращает [: one,: two] в этом примере), поэтому я Может ли цикл проходить и создавать динамические методы экземпляра для каждого? Спасибо. Или, если у вас есть другие предложения по выполнению этой задачи, дайте мне знать.

6
задан robertwbradford 6 April 2011 в 21:39
поделиться