Module: Uniword::Wordprocessingml::RunProperties::Merging

Included in:
Uniword::Wordprocessingml::RunProperties
Defined in:
lib/uniword/wordprocessingml/run_properties/merging.rb

Overview

Merge semantics for RunProperties.

Provides style-inheritance merging where override properties take precedence over base properties. Uses the model's declared attributes via read_attribute/write_attribute — fully model-driven.

Instance Method Summary collapse

Instance Method Details

#merged_over(base) ⇒ RunProperties

Merge with another RunProperties, using self as override.

For each declared attribute: if self has a non-default value, use it; otherwise use the other's value.

Parameters:

Returns:



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/uniword/wordprocessingml/run_properties/merging.rb', line 19

def merged_over(base)
  merged = RunProperties.new

  self.class.attributes.each_key do |attr_name|
    override_val = read_attribute(attr_name)
    base_val = base.read_attribute(attr_name)

    use_override = if override_val.is_a?(Lutaml::Model::Serializable)
                     override_val.class.attributes.any? do |k, _|
                       !override_val.using_default?(k)
                     end
                   else
                     !override_val.nil?
                   end

    value = use_override ? override_val : base_val
    next unless value

    merged.write_attribute(attr_name, value)
  end

  merged
end