From: ptkwt@...1.aracnet.com (Phil Tomson) Date: 2001-11-27T15:08:00+09:00 Subject: [ruby-talk:26618] How can I make a remote DRbObject aware of new types? I've got a class called Client that runs as a remote dRuby object. Client has a 'run' method which will in turn invoke a 'run' method on the object which is passed in - I want users to be able to define new classes which Client doesn't know about which have run methods. Here's part of Client.rb: class Client attr_writer :clientTimeLimit def initialize @clientTimeLimit=99999 #assume an 'infinite' timelimit end def run(task,*args) result = "" if( task.respond_to?(:run)) result = task.run(args) else puts "task type is: #{task.type}" result = "COULD_NOT_RUN" end result end def remote_require(str) puts "Client::remote_require(#{str})" instance_eval str #also tried class_eval str #and just plain: eval str #but none of these work! end end #class Client if $0 == __FILE__ require 'drb' clientObj = Client.new DRb.start_service('druby://0.0.0.0:9000',clientObj) puts "Client started" DRb.thread.join end ####end Client.rb So I start Client.rb on a remote machine: remote> ruby Client.rb Now, on the local machine I've got a file called Task.rb that defines a Task class and tries to send it to the Client object running on remote: require 'drb' class Task #include DRb::DRbUndumped def initialize end def run(*args) puts "Task::Run - running #{args}" end end if $0 == __FILE__ #require 'drb' DRb.start_service() client = DRbObject.new(nil,'druby://127.0.0.1:9000') #read this file into a string and send it over: requireString = "" File.foreach($0) { |line| requireString << line } client.remote_require(requireString) puts client.run(Task.new, "ftp","xyz","abc") end #end Task.rb So I'm trying to send a Task object to the remote client and of course the remote client knows nothing of Task objects (unless I put a 'require "Task.rb" at the top of Client.rb and ensure that Task.rb is available on tghe remote machine - but I don't want to do that because users might define different classes of their own) so I added that 'remote_require' method to the Client class. I send the contents of Task.rb as a string to the remote client's 'remote_require' method, but it doesn't work, I get: COULD_NOT_RUN printed on the local machine's stdout and: task type is: DRb::DRbUnknown printed on the remote machine's stdout which means that the remote client object knows nothing about the Task class. How can I change Client's remote_require method to make this work? Phil