module Artoo # Execution context for top-level robots # DSL methods executed on main are delegated to this class like Sinatra class MainRobot < Robot set :start_work, Proc.new { ! test? } end # Artoo delegation mixin that acts like Sinatra. # Mixing this module into an object causes all # methods to be delegated to the Artoo::MainRobot class. # Used primarily at the top-level. module Delegator def self.delegate(*methods) methods.each do |method_name| define_method(method_name) do |*args, &block| return super(*args, &block) if respond_to? method_name Delegator.target.send(method_name, *args, &block) end private method_name end end delegate :connection, :device, :work, :api, :set, :test?, :cli? class << self attr_accessor :target end self.target = Artoo::MainRobot end # Create a new Artoo robot. The block is evaluated # in the new robot's class scope. def self.new(robot=Robot, options={}, &block) robot = Class.new(robot) robot.class_eval(&block) if block_given? robot end end