Сделать делегированные методы частными

Я делегирую несколько методов, а также хочу, чтобы все они были закрытыми.

class Walrus
  delegate :+, :to => :bubbles

  def bubbles
    0
  end
end

Я мог бы сказать private :+, но я должен был бы сделать это для каждого метода. Есть ли способ вернуть список делегированных методов или делегировать создание частных методов?

Ответ 1

Monkey patch Module, чтобы добавить вспомогательный метод, точно так же, как ActionSupport pack:

class Module
  def private_delegate *methods
    self.delegate *methods
    methods.each do |m|
      unless m.is_a? Hash
        private(m)
      end
    end
  end
end

# then
class Walrus
  private_delegate :+, :to => :bubbles

  def bubbles
    0
  end
end

Ответ 2

Поскольку delegate возвращает список переданных символов, вы можете связать вызовы метода следующим образом:

private *delegate(:foo, :bar, :to => :baz)