Extend an object using string as module name?


#1

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


#2

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?

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

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


#3

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))

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}”)


#4

require ‘facet/kernel/constant’

name = ‘MyModule’
o = Object.new
o.extend(constant(name))

T.


#5

On Fri, Dec 09, 2005 at 12:50:40PM +0900, removed_email_address@domain.invalid wrote:

      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…


#6

On Fri, 9 Dec 2005, Trans wrote:

require ‘facet/kernel/constant’

name = ‘MyModule’
o = Object.new
o.extend(constant(name))

T.

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