Class: ClassRoom::Client

Inherits:
BlankSlate show all
Defined in:
lib/classroom.rb

Overview

Provides methods for the client side

Defined Under Namespace

Classes: ProxyObject

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(drb_url) ⇒ Client

Set up the DRbObject referring to the ClassRoom server



148
149
150
151
# File 'lib/classroom.rb', line 148

def initialize(drb_url)
  @drb_url = drb_url.gsub('classroom:', 'druby:')
  (@@drb ||= {})[@drb_url] = DRbObject.new(nil, @drb_url)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object

Passes through calls for non-local methods to the DRb server



154
155
156
# File 'lib/classroom.rb', line 154

def method_missing(method, *args)
  @@drb[@drb_url].send(method, *args)
end

Class Method Details

.get_drb(drb_url) ⇒ Object



143
144
145
# File 'lib/classroom.rb', line 143

def self.get_drb(drb_url)
  @@drb[drb_url]
end

Instance Method Details

#load_class(*classes) ⇒ Object

Load a class (or all classes, if :all is specified) from the ClassRoom server to be used locally



165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/classroom.rb', line 165

def load_class(*classes)
  return nil unless classes
  classes = self.classes if classes.first == :all
  classes.each do |class_name|
    eval(%Q{
      class #{class_name} < ClassRoom::Client::ProxyObject
      end
      #{class_name}.class_name = :\"#{class_name}\"
      #{class_name}.drb = ClassRoom::Client::get_drb('#{@drb_url}')
    }, TOPLEVEL_BINDING)
  end
end

#load_non_present_classesObject

Load all classes on the ClassRoom server that do not already exist locally (not fully tested yet!)



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/classroom.rb', line 180

def load_non_present_classes
  classes = self.classes
  classes.each do |class_name|
    eval %Q{
      unless defined?(#{class_name})
        class #{class_name} < ClassRoom::Client::ProxyObject
        end
      end
    }, TOPLEVEL_BINDING
    eval %Q{
      begin
      #{class_name}.drb = @drb
      rescue
      end
    }, TOPLEVEL_BINDING
    eval %Q{
      begin
      #{class_name}.class_name = :\"#{class_name}\"
      rescue
      end
    }, TOPLEVEL_BINDING
  end
end

#remote_class(class_name) ⇒ Object

Returns a proxy object referring to the remote class required



159
160
161
# File 'lib/classroom.rb', line 159

def remote_class(class_name)
  ClassRoom::Client::ProxyObject.new(@drb, class_name)
end