class AutoAttrInit::AssignParams

Public Class Methods

new(object) click to toggle source

@param object [Object]

# File lib/auto_attr_init/assign_params.rb, line 8
def initialize object
  @object = object
end

Public Instance Methods

assign(args, params) click to toggle source

@param args [Array] @param params [Array] [param type, param name, default value | nil][] @return [Hash] { param name => value }

# File lib/auto_attr_init/assign_params.rb, line 15
def assign args, params
  param_args = {}
  key_params, params =
    *params.partition{|param| [:key, :keyrest].include? param[0] }
  unless key_params.empty?
    key_args = args.last.is_a?(Hash) ? args.pop : {}
    param_args = param_args.merge assign_key_params(key_args, key_params)
  end
  if params.any?{|param| param[0] == :rest }
    param_args = param_args.merge assign_rest_params(args, params)
  else
    param_args = param_args.merge assign_req_params(args, params)
  end
  param_args
end

Private Instance Methods

assign_key_params(key_args, params) click to toggle source

@param key_args [Hash] { param name => value } @param params [Array] [:key|:keyrest, param name, default value|nil][] @return [Hash] { param name => value }

# File lib/auto_attr_init/assign_params.rb, line 73
def assign_key_params key_args, params
  param_args = {}
  params.select{|param| param[0] == :key }.
    each do |param|
      type, name, value = *param
      param_args[name] =
        key_args.has_key?(name) ?
        key_args[name] :
        @object.instance_eval(value)
    end
  if keyrest_param = params.find{|param| param[0] == :keyrest }
    keyrest_arg = {}
    key_args.each do |name, value|
      keyrest_arg[name] = value unless param_args.has_key?(name)
    end
    param_args[keyrest_param[1]] = keyrest_arg
  end
  param_args
end
assign_req_params(args, params) click to toggle source

req paramとopt paramのみ存在すると仮定して、paramsをassignする。 @param args [Array] value[] @param param [Array] [:req|:opt, param name, default value|nil][] @return [Hash] { param name => value }

# File lib/auto_attr_init/assign_params.rb, line 55
def assign_req_params args, params
  param_args = {}
  params.each_with_index do |param, i|
    type, name, value = *param
    param_args[name] =
      case type
      when :req
        args[i]
      when :opt
        args[i] || @object.instance_eval(value)
      end
  end
  param_args
end
assign_rest_params(args, params) click to toggle source

@param args [Array] value[] @param param [Array] [:req|:opt, param name, default value|nil][] @return [Hash] { param name => value }

# File lib/auto_attr_init/assign_params.rb, line 35
def assign_rest_params args, params
  param_args = {}
  rest_index = params.find_index{|param| param[0] == :rest }
  param_args =
    param_args.merge assign_req_params(
                       args[0 .. (rest_index - 1)],
                       params[0 .. (rest_index - 1)])
  param_args =
    param_args.merge assign_req_params(
                       args[(params.length - args.length) .. -1],
                       params[(rest_index + 1) .. -1])
  param_args[params[rest_index][1]] =
    args[rest_index .. (args.length - params.length + 1)]
  param_args
end