Andrei Botalov
Andrei Botalov

Reputation: 21096

Can I include/extend a module but mark all included/extended methods as private?

Say, I have a class A and a module B. I'd want to include/extend B into A but mark included/extended methods as private (so they won't be accessible to callers of A but will be accessible inside methods of A).

How can I include B into A but mark all included methods as private?

Upvotes: 5

Views: 183

Answers (1)

Arie Xiao
Arie Xiao

Reputation: 14082

Include and then explicitly make all included methods private?

class A
  include B
  private *B.instance_methods
  extend B
  class << self
    private *B.instance_methods
  end
end

You can monkey patch Module to add private_include and private_extend:

class Module
  def private_include *modules
    class_eval do
      self.send(:include, *modules)
      modules.each do |mod|
        self.send(:private, *mod.instance_methods)
      end
    end
  end

  def private_extend *modules
    singleton = class << self; self end
    singleton.instance_eval do
      self.send(:include, *modules)
      modules.each do |mod|
        self.send(:private, *mod.instance_methods)
      end
    end
  end
end

Upvotes: 6

Related Questions