class MotionBlender::Collector

Attributes

interpreters[RW]
requires[RW]
source[RW]

Public Class Methods

acceptable?(source) click to toggle source
# File lib/motion_blender/collector.rb, line 20
def acceptable? source
  !source.type.block? ||
    (source.children.first.code != 'MotionBlender.raketime')
end
interpreters() click to toggle source
# File lib/motion_blender/collector.rb, line 7
def interpreters
  @interpreters ||= []
end
new(source) click to toggle source
# File lib/motion_blender/collector.rb, line 34
def initialize source
  @source = source
  @interpreters = self.class.interpreters.map do |interpreter|
    [interpreter.key, interpreter.new(self)]
  end.to_h
  @requires = []
end
refinements() click to toggle source
# File lib/motion_blender/collector.rb, line 25
def refinements
  @refinements ||= Hash.new do |hash, key|
    hash[key] = Module.new { key.prepend self }
  end
end
register(interpreter) click to toggle source
# File lib/motion_blender/collector.rb, line 11
def register interpreter
  interpreters << interpreter
  interpreter
end
requirable?(source) click to toggle source
# File lib/motion_blender/collector.rb, line 16
def requirable? source
  interpreters.each_with_object(source).any?(&:requirable?)
end

Public Instance Methods

collect_requires() click to toggle source
# File lib/motion_blender/collector.rb, line 42
def collect_requires
  obj = evaluating_object
  if obj.is_a? Module
    with_refinements do
      obj.module_eval(source.code, source.file, source.line)
    end
  else
    with_refinements do
      obj.instance_eval(source.code, source.file, source.line)
    end
  end
  requires
end

Private Instance Methods

apply_refinements() click to toggle source
# File lib/motion_blender/collector.rb, line 81
def apply_refinements
  interpreters.each do |_, interpreter|
    refinements[interpreter.receiver].module_eval do
      define_method interpreter.method do |*args, &proc|
        interpreter.object = self
        interpreter.interpret(*args, &proc)
      end
    end
  end
end
clear_refinements() click to toggle source
# File lib/motion_blender/collector.rb, line 92
def clear_refinements
  refinements.each do |_, mod|
    mod.module_eval do
      instance_methods.each do |m|
        remove_method m
      end
    end
  end
end
evaluating_object() click to toggle source
# File lib/motion_blender/collector.rb, line 60
def evaluating_object
  obj = Object.new
  constants = @source.global_constants.select do |c|
    Object.const_defined? c.to_sym
  end
  constants.each { |c| obj.instance_eval "#{c} = ::#{c}" }
  if @source.wrapping_modules.present?
    ms = @source.wrapping_modules.map { |p| p.join(' ') }
    s = [*ms, 'self', *Array.new(ms.length, 'end')].join(';')
    obj = obj.instance_eval s
  end
  obj
end
with_refinements() { || ... } click to toggle source
# File lib/motion_blender/collector.rb, line 74
def with_refinements
  apply_refinements
  yield
ensure
  clear_refinements
end