lib/artoo/delegator.rb
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, :name, :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