require 'contextr' # Horribly slow, proof-of-concept. module NamespaceInjection def method_added(meth) super return if meth.to_s =~ /^_.*_$/ # Don't fud ns = @namespace default.wrap meth do |n| ContextR.with_layers ns.layer do n.call_next end end end end class Class def namespace(name=nil, &block) layer :default unless defined? default @namespace = ns = layer(:"namespace_#{name}") extend NamespaceInjection if block # Claim all methods defined inside to the ns. seen = [] # now this is darn ugly (class << self; self; end).class_eval { _layer(:_ns_hackery_).post(:method_added) { |ne| meth = ne.arguments.first unless seen.include?(meth) || meth.to_s =~ /^_.*_$/ seen << meth ns.claim meth end } } ContextR.with_layers :"_ns_hackery_" do class_eval &block end end end end class Array namespace :foo do def mungle zip(reverse).flatten end end end class Foo namespace :foo def initialize p [1,2,3].mungle end end Foo.new p [1,2,3].mungle rescue p $!