svenfuchs
9/18/2010 - 12:46 PM

include_anonymous.rb

# Include an anonymous module
#
# Useful for defining a class with a base module. So, instead of:
#
#   class Foo
#     module Base
#       def bar
#         # ...
#       end
#     end
#     include Base
#   end
#
# You can do:
#
#   class Foo
#     include do
#       def bar
#         # ...
#       end
#     end
#   end

Class.class_eval do
  def include(*args, &block)
    block_given? ? super(Module.new(&block)) : super(*args)
  end
end
class IncludeAnonymousTest < Test::Unit::TestCase
  def teardown
    self.class.send(:remove_const, :A)
  end
  
  test 'anonymous include on a class' do
    class A
      include { def foo; 'foo' end }
    end
    assert_equal 'foo', A.new.foo
  end
end