Extend an object using string as module name?

hello,

is this a proper way to do it:

name = 'MyModule'
o = Object.new
o.extend(Module.const_get(name))

are there better ways?

thanks
konstantin

this will fail for "ModuleA::ModuleB". for that you need something like:

···

On Fri, 9 Dec 2005, ako... wrote:

hello,

is this a proper way to do it:

name = 'MyModule'
o = Object.new
o.extend(Module.const_get(name))

are there better ways?

     #
     # creates a class by class name
     #
       def klass_stamp(hierachy, *a, &b)
#--{{{
         ancestors = hierachy.split(%r/::/)
         parent = Object
         while((child = ancestors.shift))
           klass = parent.const_get child
           parent = klass
         end
         klass::new(*a, &b)
#--}}}
       end

this will work for

   m = klass_stamp "A::b::C::Module"
   o = Object::new
   o.extend m

it's in alib.rb btw.

hth.

-a
--

ara [dot] t [dot] howard [at] noaa [dot] gov
all happiness comes from the desire for others to be happy. all misery
comes from the desire for oneself to be happy.
-- bodhicaryavatara

===============================================================================

I don't know if this is the proper way, but you could just eval the name:

name = 'MyModule'
o = Object.new
o.extend( eval name )

Or alternatively:

eval("o.extend #{name}")

···

On Thu, 08 Dec 2005 18:37:43 -0800, ako... wrote:

hello,

is this a proper way to do it:

name = 'MyModule'
o = Object.new
o.extend(Module.const_get(name))

--
Ross Bamford - rosco@roscopeco.remove.co.uk
"\e[1;31mL"

require 'facet/kernel/constant'

  name = 'MyModule'
  o = Object.new
  o.extend(constant(name))

T.

this will fail for "ModuleA::ModuleB". for that you need something like:

    #
    # creates a class by class name
    #
      def klass_stamp(hierachy, *a, &b)
#--{{{
        ancestors = hierachy.split(%r/::/)
        parent = Object
        while((child = ancestors.shift))
          klass = parent.const_get child
          parent = klass
        end
        klass::new(*a, &b)
#--}}}
      end

def klass_stamp(name, *a, &b)
  name.split(/::/).inject(Object){|s,x| s.const_get(x)}.new(*a,&b)
end

class A; class B; def foo; "A::B#foo" end end end
klass_stamp("A::B").foo # => "A::B#foo"

this will work for

  m = klass_stamp "A::b::C::Module"

# ^
# that would try to instantiate the module
    m = "A::b::C::Module".split(/::/).inject(Object){|s,x| s.const_get(x)}

  o = Object::new
  o.extend m

PS: have you seen http://eigenclass.org/hiki.rb?Usable+Ruby+folding+for+Vim ?
It might be of interest to you if you often use manual markers for
methods...

···

On Fri, Dec 09, 2005 at 12:50:40PM +0900, ara.t.howard@noaa.gov wrote:

--
Mauricio Fernandez

we have dueling libraries tom! :wink:

guess the fact that we are both writing these function over and over means
they are useful.

cheers.

-a

···

On Fri, 9 Dec 2005, Trans wrote:

require 'facet/kernel/constant'

name = 'MyModule'
o = Object.new
o.extend(constant(name))

T.

--

ara [dot] t [dot] howard [at] noaa [dot] gov
all happiness comes from the desire for others to be happy. all misery
comes from the desire for oneself to be happy.
-- bodhicaryavatara

===============================================================================