Feature Base Object Management & Task Oriented Programming
2005-12-13を読んで、元コードを実行せずに妄想で書いてみるテスト(すいません)。
module ManagedObject @@classes = [] @@features = {} @@all_objects = [] @@objects = {} def self.extended(mod) @@classes << mod super end def features(*args) @@features[self] = args end def self.create(klass, *args, &block) unless @@classes.member?(klass) raise ArgumentError, "#{klass} is not managed class" end obj = klass.new(*args, &block) @@all_objects << obj @@features[klass].each do |feature| (@@objects[feature] ||= []) << obj end obj end def self.objects(*args) if args.empty? @@all_objects else @@all_objects & (args.map do |arg| @@objects[arg] end.inject do |a, b| a | b # a & b end) end end end class A extend ManagedObject features :x, :y end class B extend ManagedObject features :y, :z end a = ManagedObject.create(A) b = ManagedObject.create(B) p(ManagedObject.objects) p(ManagedObject.objects(:x)) p(ManagedObject.objects(:y)) p(ManagedObject.objects(:y, :z)) p(ManagedObject.objects(:z, :x))