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))