On Wednesday 29 July 2009 12:34:30 Ch Ba wrote:
> So I'm trying to figure out how I can allow an end user to decide which
> modules to mixin to a instance of a class, but I'm not sure if it's
> possible. An example of what I would like.
>
> module Thing
>   @bar = 5
> end
>
> class Foo
>   def initialize
>     @bar = 0
>     @foo = 2
>   end
> end
>
> class FooBar < Foo
>   def initialize(*modules)
>     @bar = 1
>     modules.each do |module_name|
>       eval("include #{module_name.to_s.capitalize}")
>     end
>   end
> end
>
> test = FooBar.new(:thing)
>
> In the previous example, test would be an instance of FooBar, and it's
> @bar would be 5 (from the module Thing), and it's @foo would be 2, from
> it's superclass. Is that possible? The previous returns a nomethoderror
> for "include" in the instance of test. And it might have several other
> errors since I just typed it up.

module Thing
  def bar
    5
  end
end

class Foo
  attr_reader :bar
  attr_reader :foo
  def initialize
    @bar = 0
    @foo = 2
  end
end

class FooBar < Foo
  def initialize(*modules)
    super()
    @bar = 1
    modules.each do |module_name|
        klass = Kernel.const_get(module_name)
        extend klass
    end
  end
end

test = FooBar.new(:Thing)
puts test.bar
puts test.foo

Not exactly what you are looking for, but close.