module Processing::Proxy

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.

Public Class Methods

desired_method_names(inner_class) click to toggle source

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

# 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) click to toggle source

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

# 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) click to toggle source

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

# 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) click to toggle source

Proxy methods through to the sketch.

# 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 << <<-EOS
        def #{method}(*args, &block)           # def rect(*args, &block)
        if block_given?                        #   if block_given?
        $app.send :'#{method}', *args, &block  #   ...
        else                                   #   else
        $app.#{method} *args                   #     $app.rect *args
        end                                    #   end
        end                                    # end
        EOS
      end
      inner_class.class_eval(code)
    end