Module: Processing::Proxy

Includes:
Math
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 the list of method names that we’d like to proxy for inner classes. Nothing camelCased, nothing __internal__, just the Processing API.



202
203
204
205
206
207
208
# 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 { |m| unwanted.include?(m) || bad_method.match(m) || inner_class.method_defined?(m) }
end

.included(inner_class) ⇒ Object

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



235
236
237
238
# File 'lib/ruby-processing/app.rb', line 235

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.



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

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.



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

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