Module: Processing::Proxy

Includes:
Math, MathTool
Defined in:
lib/ruby-processing/app.rb

Overview

This module will get automatically mixed in to any inner class of a Processing::App, in order to mimic Java's inner classes, which have unfettered access to the methods defined in the surrounding class.

Class Method Summary collapse

Class Method Details

.desired_method_names(inner_class) ⇒ Object

Generate a list of method names to proxy for inner classes. Nothing camelCased, nothing __internal__, just the Processing API.


202
203
204
205
206
207
208
209
210
# File 'lib/ruby-processing/app.rb', line 202

def self.desired_method_names(inner_class)
  bad_method = /__/    # Internal JRuby methods.
  unwanted = PApplet.superclass.instance_methods + Object.instance_methods
  unwanted -= %w(width height cursor create_image background size resize)
  methods = Processing::App.public_instance_methods
  methods.reject do |m|
    unwanted.include?(m) || bad_method.match(m) || inner_class.method_defined?(m)
  end
end

.included(inner_class) ⇒ Object

Don't do all of the work unless we have an inner class that needs it.


237
238
239
240
# File 'lib/ruby-processing/app.rb', line 237

def self.included(inner_class)
  proxy_methods(inner_class)
  proxy_constants(inner_class)
end

.proxy_constants(inner_class) ⇒ Object

Proxy the sketch's constants on to the inner classes.


229
230
231
232
233
234
# File 'lib/ruby-processing/app.rb', line 229

def self.proxy_constants(inner_class)
  Processing::App.constants.each do |name|
    next if inner_class.const_defined?(name)
    inner_class.const_set(name, Processing::App.const_get(name))
  end
end

.proxy_methods(inner_class) ⇒ Object

Proxy methods through to the sketch.


213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/ruby-processing/app.rb', line 213

def self.proxy_methods(inner_class)
  code = desired_method_names(inner_class).reduce('') do |rcode, method|
    rcode << "def \#{method}(*args, &block)           # def rect(*args, &block)\nif block_given?                        #   if block_given?\n$app.send :'\#{method}', *args, &block  #   ...\nelse                                   #   else\n$app.\#{method} *args                   #     $app.rect *args\nend                                    #   end\nend                                    # end\n"
  end
  inner_class.class_eval(code)
end