require 'delegate' class Module # Include a module via a specified namespace. # # module T # def t ; "HERE" ; end # end # # class X # include_as :test => T # def t ; test.t ; end # end # # X.new.t #=> "HERE" # def include_as( h ) h.each{ |name, mod| s = self c = Class.new(SimpleDelegator) { include mod define_method(:initialize) { |s| super(s) } } class_eval { define_method( name ) { instance_variable_set( "@#{name}", instance_variable_get( "@#{name}" ) || c.new(s) ) } } } end end # _____ _ # |_ _|__ ___| |_ # | |/ _ \/ __| __| # | | __/\__ \ |_ # |_|\___||___/\__| # =begin test require 'test/unit' class TCModule < Test::Unit::TestCase module MockModule def mm; 77; end end class MockObject include_as :mod => MockModule end def test_include_as m = MockObject.new assert_equal( 77, m.mod.mm ) end end =end # devlopment testing =begin if __FILE__ == $0 # test module T def t ; p self ; end def r ; p self ; end def q ; super ; end end class N def q ; puts "ho" ; end end class X < N include_as :test => T def n ; p test ; end def m ; test.t ; end def o ; test.r ; end end x = X.new x.n x.m x.o x.q end =end