On Sat, 31 Mar 2007, Nasir Khan wrote:

> Say you have a class definition in a string -
>
> str = <<EOF
> module A
>  class B
>    def b
>      puts "hello"
>    end
> end
> end
> EOF
>
> What is the easiest way to find out the fully qualified name of the class
> there, namely "A::B"
>
> Now I could do a thing like
>
> module EmptyModule
> end
>
> EmptyModule.module_eval(str)
>
> def self.find_class mod
>   mod.constants.each do |str|
>     m = mod.const_get(str)
>       if m.class == Module
>         find_class(m)
>       else
>         cname = m.to_s
>         puts cname.match(/EmptyModule::/).post_match
>         break
>        end
>      end
>  end
>
> and call this method
>
> find_class(EmptyModule)
>
> which prints  "A::B"
>
> This works but it seems too much work to do something simple.
>
> Is there a better/simpler way to do this?
>
> Thanks
> Nasir

harp:~ > cat a.rb
#
# a better const_get
#
   def constant_get(hierachy)
     ancestors = hierachy.split(%r/::/)
     parent = Object
     while((child = ancestors.shift))
       klass = parent.const_get child
       parent = klass
     end
     klass
   end

   c = constant_get 'A::B'



-a
-- 
be kind whenever possible... it is always possible.
- the dalai lama