Some late night metaprogramming

class Module

Note: view is public, private, protected, or nil.

def def_methods(view=nil, &block)
@defmethods ||= DefMethods.new(self, view)
@defmethods.instance_eval(&block)
end

class DefMethods
private *instance_methods.select{ |m| m !~ /^(__|instance_eval)/ }

def initialize(base, view=nil)
  @base = base
  @view = view
end

def method_missing(s, *a, &b)
  @base.__send__(:define_method, s, &b)
  @base.__send__(@view, s) if @view
end

end

end

Example

class X

def_methods(:public) do

world = "World!"

hello do
  "Hello"
end

hello_world do
  hello + ' ' + world
end

end

end

x = X.new
puts x.hello_world