Module: XmlLaborabrechnungsdaten::MemberContainer::ClassMethods

Defined in:
lib/xml_laborabrechnungsdaten/member_container.rb

Instance Method Summary collapse

Instance Method Details

#after_initialize(&block) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/xml_laborabrechnungsdaten/member_container.rb', line 69

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) ⇒ Object

Parameters:

  • member_name (String)
  • type (Array<Class>, Class) (defaults to: nil)
  • default (Object) (defaults to: nil)
  • optional (TrueClass, FalseClass) (defaults to: false)

    When true, omits tag rather than rendering an empty tag on nil

  • transform_value (Proc) (defaults to: nil)

    A Proc which is called with the input value to perform type conversion.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/xml_laborabrechnungsdaten/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.nil?
    after_initialize do
      value =
        if default.respond_to?(:call)
          default.call
        else
          begin
            default.dup
          rescue TypeError
            default
          end
        end

      send(setter_name, value)
    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