module Gearman::Packet::Sugar

Public Class Methods

type(name, options) click to toggle source
# File lib/gearman/packet/sugar.rb, line 5
def self.type(name, options)
  if Gearman::Packet.const_defined?(name)
    return Gearman::Packet.const_get(name)
  end

  class_ = Class.new do
    extend Sugar

    takes *Array(options[:takes])
    number Integer(options[:number])

    def inspect
      info = argument_names.map do |argument_name|
        "#{argument_name}=#{public_send(argument_name)}"
      end

      if info.any?
        "#<#{self.class.name} #{info.join(' ')}>"
      else
        "#<#{self.class.name}>"
      end
    end

    def ==(other)
      quack = other.respond_to?(:arguments) && other.respond_to?(:number)

      if quack
        arguments == other.arguments && number == other.number
      else
        false
      end
    end
    alias :eql? :==

  end

  Gearman::Packet.const_set(name, class_)
end

Public Instance Methods

==(other) click to toggle source
# File lib/gearman/packet/sugar.rb, line 28
def ==(other)
  quack = other.respond_to?(:arguments) && other.respond_to?(:number)

  if quack
    arguments == other.arguments && number == other.number
  else
    false
  end
end
inspect() click to toggle source
# File lib/gearman/packet/sugar.rb, line 16
def inspect
  info = argument_names.map do |argument_name|
    "#{argument_name}=#{public_send(argument_name)}"
  end

  if info.any?
    "#<#{self.class.name} #{info.join(' ')}>"
  else
    "#<#{self.class.name}>"
  end
end
number(n) click to toggle source
# File lib/gearman/packet/sugar.rb, line 93
def number(n)
  define_method(:number) do
    self.class.const_get('NUMBER')
  end

  self.const_set('NUMBER', n)
end
takes(*arguments) click to toggle source
# File lib/gearman/packet/sugar.rb, line 44
def takes(*arguments)
  define_method(:initialize) do |attributes_or_arguments = []|
    __sugar_set = ->(argument, value) do
      ivar = "@#{argument}"

      instance_variable_set(ivar, value)
    end

    if attributes_or_arguments.is_a?(Hash)
      attributes = attributes_or_arguments
      arguments.each do |argument|
        begin
          value = attributes.fetch(argument.to_sym)
        rescue KeyError
          raise ArgumentError, "expected to be given :#{argument}"
        end

        __sugar_set.(argument, value)
      end
    elsif attributes_or_arguments.is_a?(Array)
      given = attributes_or_arguments

      if given.size != arguments.size
        raise ArgumentError,
          "expected to be given #{arguments.size} arguments"
      end

      arguments.zip(given).each do |argument, value|
        __sugar_set.(argument, value)
      end
    else
      raise ArgumentError,
        "expected either a Hash of attributes or an Array of arguments"
    end
  end

  attr_reader(*arguments)

  define_method(:argument_names) do
    self.class.const_get('ARGUMENTS')
  end

  define_method(:arguments) do
    argument_names.map { |argument_name| public_send(argument_name) }
  end

  self.const_set('ARGUMENTS', arguments)
end