class Module # Show a modules nesting in module namespaces. # # A::B::C.nesting #=> [ A, A::B ] # # CREDIT: Trans def nesting n = [] name.split(/::/).inject(self) do |mod, name| c = mod.const_get(name) ; n << c ; c end return n end # Returns the module's container module. # # module Example # class Demo # end # end # # Example::Demo.modspace #=> Example # # See also Module#basename. # # CREDIT: Trans def modspace space = name[ 0...(name.rindex( '::' ) || 0)] space.empty? ? Object : eval(space) end # Returns the root name of the module/class. # # module Example # class Demo # end # end # # Demo.name #=> "Example::Demo" # Demo.basename #=> "Demo" # # For anonymous modules this will provide a basename # based on Module#inspect. # # m = Module.new # m.inspect #=> "#" # m.basename #=> "Module_0xb7bb0434" # # CREDIT: Trans def basename if name and not name.empty? name.gsub(/^.*::/, '') else nil #inspect.gsub('#<','').gsub('>','').sub(':', '_') end end # Returns the name of module's container module. # # module Example # class Demo # end # end # # Demo.name #=> "Example::Demo" # Demo.spacename #=> "Example" # # This used to be called +dirname+. # # See also Module#basename. # # CREDIT: Trans def spacename name[0...(name.rindex('::') || 0)] #name.gsub(/::[^:]*$/, '') end end