class Selfies::SelfInit

Generates an accessor or reader for each passed variable

Public Class Methods

access_variables(class_name, accessor, variable_names) click to toggle source
# File lib/selfies/self_init.rb, line 36
def self.access_variables(class_name, accessor, variable_names)
  class_name.send(
    (accessor ? :attr_accessor : :attr_reader),
    *variable_names
  )
end
argument_guard(all_variables, arguments) click to toggle source
# File lib/selfies/self_init.rb, line 43
def self.argument_guard(all_variables, arguments)
  raise_argumnet_for(arguments) unless correct_argument_count?(all_variables, arguments)
end
correct_argument_count?(all_variables, arguments) click to toggle source
# File lib/selfies/self_init.rb, line 47
def self.correct_argument_count?(all_variables, arguments)
  expected, given = arguments
  final_variable = all_variables.last
  correct_argument_count = given == expected
  if final_variable.is_a? Hash
    correct_argument_count ||= given == expected - 1
  elsif final_variable == :args
    at_least = all_variables[0..all_variables.index(:args)].count
    correct_argument_count ||= given >= at_least
  end

  correct_argument_count
end
decouple(variable) click to toggle source
# File lib/selfies/self_init.rb, line 61
def self.decouple(variable)
  return [variable, nil] unless variable.is_a? Hash

  variable.keys + variable.values
end
generate(class_name, accessor, *variables) click to toggle source
# File lib/selfies/self_init.rb, line 6
def self.generate(class_name, accessor, *variables)
  return false unless variables.any?

  class_name.class_eval do
    variable_names = SelfInit.variable_names(variables)

    SelfInit.access_variables(class_name, accessor, variable_names)

    define_method(:initialize) do |*args|
      SelfInit.argument_guard(variables, [variable_names.count, args.count])

      variables.each_with_index do |variable, index|
        variable_name, default = SelfInit.decouple(variable)

        instance_variable_set(
          "@#{variable_name}", SelfInit.get_value(variable_name, args, index) || default
        )
      end
    end
  end
end
get_value(variable_name, args, index) click to toggle source
# File lib/selfies/self_init.rb, line 28
def self.get_value(variable_name, args, index)
  if variable_name == :args
    args[index..-1]
  else
    args[index]
  end
end
raise_argumnet_for(arguments) click to toggle source
# File lib/selfies/self_init.rb, line 73
def self.raise_argumnet_for(arguments)
  expected, given = arguments
  raise(ArgumentError, "wrong number of arguments (given #{given}, expected #{expected})")
end
variable_names(variables) click to toggle source
# File lib/selfies/self_init.rb, line 67
def self.variable_names(variables)
  variables.collect do |variable|
    variable.is_a?(Hash) ? variable.keys.first : variable
  end
end