Class instance into included module


#1

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’


#2

On Jun 26, 10:00 am, Galevsky G. removed_email_address@domain.invalid wrote:

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

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 ?

Is Module#included what you want, perhaps?
http://ruby-doc.org/core/classes/Module.html#M001683


#3

On Jun 26, 1:00 pm, Galevsky G. removed_email_address@domain.invalid wrote:

method_HelloWorld.call if iwant
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.


#4

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

Gal’


#5

Trans wrote:

On Jun 26, 1:00 pm, Galevsky G. removed_email_address@domain.invalid wrote:

method_HelloWorld.call if iwant
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.

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’


#6

Robert D. wrote:

On 6/26/07, Galevsky gal removed_email_address@domain.invalid wrote:

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 :slight_smile:

Cheers
Robert

for fun :o)

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’


#7

On 6/26/07, Galevsky gal removed_email_address@domain.invalid wrote:

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 :slight_smile:

Cheers
Robert


#8

On 6/26/07, Galevsky gal removed_email_address@domain.invalid wrote:

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 :wink:

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


#9

Robert D. wrote:

> > Hmm I am quite sure Mixin will do the trick, why should we let you > have all the fun ;) > def self.extended other

You got it !!!

Many thanks my friend ;o)

Gal’