Class instance into included module

G

Galevsky Gal

Hi all,

here is my problem: I would like to handle class instances into a module
included by the class. This case is illustrated below:


module Mod
instanceOfClas = ???
method_HelloWorld = instanceOfClas.method('helloWorld')

# do something with the method that could be:
method_HelloWorld.call if iwant
end


class Clas
include Mod

def helloWorld
"Hello world !"
end
end

Do you have any idea ? I cannot get my instance using self since self
means the module itself. How can I make a .call onto *parent* class
method ?

Many thanks for your support,

Gal'
 
T

Trans

Hi all,

here is my problem: I would like to handle class instances into a module
included by the class. This case is illustrated below:

module Mod
instanceOfClas = ???
method_HelloWorld = instanceOfClas.method('helloWorld')

# do something with the method that could be:
method_HelloWorld.call if iwant
end

class Clas
include Mod

def helloWorld
"Hello world !"
end
end

Do you have any idea ? I cannot get my instance using self since self
means the module itself. How can I make a .call onto *parent* class
method ?

The way you have it paradoxical b/c "method_HelloWorld.call if iwant"
is happening before an instance is ever created. BUt if you just men
accessing Clas, then just put that:

method_HelloWorld = Clas.instance_method('helloWorld')

However, Ruby has some limitations, in that a method needs to be bound
to an instance. And binding is restricted to subclasses of the type of
class the method was taken from. Unfortunate that. But usually one can
find a way to manage. In your case you should ask "what am I trying to
call an instance method outside of an instance? Maybe it should be a
module method, which the instance can call upon instead.

T.
 
G

Galevsky gal

Trans said:
The way you have it paradoxical b/c "method_HelloWorld.call if iwant"
is happening before an instance is ever created. BUt if you just men
accessing Clas, then just put that:

method_HelloWorld = Clas.instance_method('helloWorld')

However, Ruby has some limitations, in that a method needs to be bound
to an instance. And binding is restricted to subclasses of the type of
class the method was taken from. Unfortunate that. But usually one can
find a way to manage. In your case you should ask "what am I trying to
call an instance method outside of an instance? Maybe it should be a
module method, which the instance can call upon instead.

T.

Thanks for your posts guys ;o)

Well, I am writting a light unit test framework, like Junit for java.

So, I have a TestModule module that deals with Tests objects, assertions
and so on. The behaviour I want is:

Take a class:

Class AClass
def method1
"hello"
end
end

To unit-test it, I would like to just need to write that:

Class TestAClass
def TestMethod1
assume(AClass.new.method,"hello")
end

include TestModule
end


To do that, my TestModule should be....


module TestModule

class TestManager
# handle a tests register, launches all the methods, handles the
results, display info and so on

def register(method)
@register << method
end

def launch
@register.each{ |test|
test.call
}
end

def testsSucceed?
# handle lots stuff with assume() calls executed during the launch
...
end
end


# find all the methods of TestAClass that have 'Test' in their name,
and add them into the register handled by the TestManager

mgr = TestManager.new
testing_instance = #here is my pb and I 'd like to get a TestAClass
instance
testing_instance.methods.each{ |method|
if !(method =~ /Test/).nil?
mgr.register(testing_instance.method(method))
end
}
puts "launch All the registered tests"
mgr.launch

end


I give you a shortened version but the necessary part to understand what
I would like to do.

Thanks for your attention,

Gal'
 
G

Galevsky gal

But what I think I'll do is make TestModule a class, and my TestAClass
class will inherit from TestModule.

Gal'
 
R

Robert Dober

If I am not mistaken Test::Unit does instantiate an object of all
classes that extend Test::Unit::TestCase ( by exploring ObjectSpace in
an et_exit handler ) than calls setup,x,teardown for all x starting
with test.

Maybe you can adopt something from this approach actually what you
said above is basically the same, right?

Just out of curiosity, are you unhappy with Test::Unit or are you
doing this for fun -- which is a *very good reason* BTW :)

Cheers
Robert
 
G

Galevsky gal

Robert said:
If I am not mistaken Test::Unit does instantiate an object of all
classes that extend Test::Unit::TestCase ( by exploring ObjectSpace in
an et_exit handler ) than calls setup,x,teardown for all x starting
with test.

Maybe you can adopt something from this approach actually what you
said above is basically the same, right?

Just out of curiosity, are you unhappy with Test::Unit or are you
doing this for fun -- which is a *very good reason* BTW :)

Cheers
Robert

for fun :eek:)

I do it now with a class extension instead of module inclusion due to
limitations, even if mixin best suits the needs INMHO.

Many thanks, folks !

Gal'
 
R

Robert Dober

I do it now with a class extension instead of module inclusion due to
limitations, even if mixin best suits the needs INMHO.

Hmm I am quite sure Mixin will do the trick, why should we let you
have all the fun ;)


module Tester
def self.extended other
registry =
other.instance_methods.select{|name|/^test/===name}.map{|mth|
other.instance_method mth}
class << other; self end.send :define_method, :run_tests do
| msg |
puts "running #{msg}"
registry.each do |mth|
mth.bind(other.new).call
end
end
end
end

class TestWhatever
def test_a; puts "I am tested" end
extend Tester
end

class TestSomethingElse
def test_b; puts "Me too" end
extend Tester
end

TestWhatever.run_tests :whatever
TestSomethingElse.run_tests :something

Robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top