class Tensai::Util::Initializer

@private

Include in classes to insert boilerplate constructor, dry-types typecheck and getters

Attributes

args[R]

Public Class Methods

new(**args) click to toggle source
# File lib/tensai/util/initializer.rb, line 13
def initialize(**args)
  @args = args
end

Public Instance Methods

included(klass) click to toggle source
# File lib/tensai/util/initializer.rb, line 17
def included(klass) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  this_class_args = args
  all_args = all_args_for(klass)

  klass.instance_eval do
    define_method :__check_argument_type do |argument, value|
      type = all_args[argument]
      if type.default? && value.nil?
        instance_variable_set("@#{argument}".to_sym, type[])
      else
        type[value]
      end
    end

    define_method :after_initialize, -> {}

    attr_reader(*this_class_args.keys)
  end

  klass.class_eval InitializeMethod.new(all_args).code, __FILE__, __LINE__ + 11
end

Private Instance Methods

all_args_for(klass) click to toggle source
# File lib/tensai/util/initializer.rb, line 41
def all_args_for(klass)
  parent_initializers = klass.ancestors.select { |a| a.is_a? Initializer }
  parent_initializers.map(&:args)
                     .reduce(args) { |result, parent_args| parent_args.merge result }
end