Class instance into included module

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'

···

--
Posted via http://www.ruby-forum.com/.

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

<snip>

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? class Module - RDoc Documentation

···

On Jun 26, 10:00 am, Galevsky Gal <galev...@gmail.com> wrote:

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.

···

On Jun 26, 1:00 pm, Galevsky Gal <galev...@gmail.com> wrote:

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 ?

Trans 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'

···

On Jun 26, 1:00 pm, Galevsky Gal <galev...@gmail.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

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

Gal'

···

--
Posted via http://www.ruby-forum.com/.

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

···

On 6/26/07, Galevsky gal <galevsky@gmail.com> wrote:

--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

Robert Dober wrote:

···

On 6/26/07, Galevsky gal <galevsky@gmail.com> 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'

--
Posted via http://www.ruby-forum.com/\.

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

···

On 6/26/07, Galevsky gal <galevsky@gmail.com> wrote:
--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

Robert Dober wrote:

<snip>

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

<snip>

    def self.extended other

You got it !!!

Many thanks my friend ;o)

Gal'

···

--
Posted via http://www.ruby-forum.com/\.