Я хочу иметь возможность иметь методы в модуле, которые не доступны классу, который включает этот модуль.В следующем примере:
class Foo
include Bar
def do_stuff
common_method_name
end
end
module Bar
def do_stuff
common_method_name
end
private
def common_method_name
#blah blah
end
end
Я хочу, чтобы Foo.new.do_stuff взорвался, потому что он пытается получить доступ к методу, который модуль пытается скрыть от него.Однако в приведенном выше коде Foo.new.do_stuff будет работать нормально: (
Есть ли способ достичь того, что я хочу сделать в Ruby?
ОБНОВЛЕНИЕ - Реальный код
class Place < ActiveRecord::Base
include RecursiveTreeQueries
belongs_to :parent, {:class_name => "Place"}
has_many :children, {:class_name => 'Place', :foreign_key => "parent_id"}
end
module RecursiveTreeQueries
def self_and_descendants
model_table = self.class.arel_table
temp_table = Arel::Table.new :temp
r = Arel::SelectManager.new(self.class.arel_engine).from(model_table).project(model_table.columns).join(temp_table).on('true').where(model_table[:parent_id].eq(temp_table[:id]))
nr = Place.scoped.where(:id => id)
q = Arel::SelectManager.new(self.class.arel_engine)
as = Arel::Nodes::As.new temp_table, nr.union(r)
arel = Arel::SelectManager.new(self.class.arel_engine).with(:recursive,as).from(temp_table).project(temp_table[:id])
self.class.where(model_table[:id].in(arel))
end
def self_and_ascendants
model_table = self.class.arel_table
temp_table = Arel::Table.new :temp
r = Arel::SelectManager.new(self.class.arel_engine).from(model_table).project(model_table.columns).join(temp_table).on('true').where(temp_table[:parent_id].eq(model_table[:id]))
nr = Place.scoped.where(:id => id)
q = Arel::SelectManager.new(self.class.arel_engine)
as = Arel::Nodes::As.new temp_table, nr.union(r)
arel = Arel::SelectManager.new(self.class.arel_engine).with(:recursive,as).from(temp_table).project(temp_table[:id])
self.class.where(model_table[:id].in(arel))
end
end
Ясно, что этот код взломан и вызван серьезным рефакторингом, и цель моего вопроса - выяснить, есть ли способ безнаказанно провести рефакторинг этого модуля от случайной перезаписи какого-либо метода на ActiveRecord ::База или любой другой модуль, включенный в Place.rb.