module Xrechnung::MemberContainer::ClassMethods

Public Instance Methods

after_initialize(&block) click to toggle source
# File lib/xrechnung/member_container.rb, line 58
def after_initialize(&block)
  @after_initialize_blocks ||= []
  if block
    @after_initialize_blocks << block
  else
    @after_initialize_blocks
  end
end
member(member_name, type: nil, default: nil, optional: false, transform_value: nil) click to toggle source

@param [String] member_name @param [Array<Class>, Class] type @param [Object] default @param [TrueClass, FalseClass] optional When true, omits tag rather than rendering an empty tag on nil @param [Proc] transform_value A Proc which is called with the input value to perform type conversion.

# File lib/xrechnung/member_container.rb, line 36
def member(member_name, type: nil, default: nil, optional: false, transform_value: nil)
  attr_reader member_name
  setter_name           = :"#{member_name}="
  @members[member_name] = { optional: optional, setter_name: setter_name }

  if default
    after_initialize do
      send(setter_name, default)
    end
  end

  define_method setter_name do |in_value|
    in_value = transform_value.call(in_value) if transform_value

    if type && !in_value.nil? && Array(type).none? { |t| in_value.is_a?(t) }
      raise ArgumentError, "expected #{type} for :#{member_name}, got: #{in_value.class}"
    end

    instance_variable_set :"@#{member_name}", in_value
  end
end