Hi all,

I just ran into this situation: There's a module which uses DL to 
provide calls into a dynamic library. Now, I'd like to make these 
functions of the dyn. lib. available via DRb. (If I remember correctly, 
I somewhere read that "include ModuleThatUsesDL" is not a good idea to 
do, if that module uses DL in turn.)

With the code below, I get this error message:

-------------------------------------------------
(druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1419:in 
`check_insecure_method': undefined method `a_method' called for 
#<TheProxy:0x2911e98> (NameError)
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1461:in 
`check_insecure_method'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1466:in 
`setup_message'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1435:in 
`perform'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1512:in 
`main_loop'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1508:in 
`loop'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1508:in 
`main_loop'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1504:in 
`start'
	from (druby://localhost:42000) c:/ruby/lib/ruby/1.8/drb/drb.rb:1504:in 
`main_loop'
	 ... 6 levels...
	from (druby://localhost:42000) F:/tmp/the_proxy.rb:24
	from F:/tmp/the_client.rb:10
	from F:/tmp/the_client.rb:9:in `times'
	from F:/tmp/the_client.rb:9
-------------------------------------------------


So the question is: How can I get this to work?
I would be grateful for information about this.

And here's the boiled down code:



# The Module (uses DL in real life)
# Filename: 'the_module.rb'
module TheModule
   def a_method
     "result"
   end
end
-------------------------------------------------


# The Proxy (provide access to the Module methods)
# Filename: 'the_proxy.rb'
require 'drb'
require 'English'
require 'the_module'

class TheProxy

   # I seem to recall that doing this is bad in case
   # the module uses DL (but where did I read that?)
   # include TheModule

   def method_missing( meth_name, *arguments )
     call_it = "#{ meth_name.to_s }( #{arguments.join( ', ' )} )"
     if TheModule.respond_to? meth_name
       TheModule.instance_eval( call_it )
     else
       raise NoMethodError, "Can't handle method '#{ call_it }'", caller
     end
   end

end

if $PROGRAM_NAME == __FILE__

   proxy = TheProxy.new

   DRb.start_service( "druby://localhost:42000", proxy )
   DRb.thread.join

end
-------------------------------------------------


# The client which uses the Module via the Proxy
# Filename: 'the_client.rb'
require 'drb'

$stdout.sync = true

DRb.start_service

proxy = DRbObject.new( nil, "druby://localhost:42000" )

5.times do
   puts proxy.a_method
   sleep 0.5
end
-------------------------------------------------



Happy rubying

Stephan