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