module XMLable::Mixins::ElementsStorage

ElementsStorage module contains the logic to store XML elements

Public Class Methods

included(base) click to toggle source
# File lib/xmlable/mixins/elements_storage.rb, line 7
def self.included(base)
  base.send(:extend, ClassMethods)
end

Public Instance Methods

[](key) click to toggle source

Get element object by its key

@param [String] key element key

@return [XMLable::Mixins::Object, nil]

Calls superclass method
# File lib/xmlable/mixins/elements_storage.rb, line 106
def [](key)
  h = __has_element_handler?(key)
  h ? __element_object_get(h) : super
end
[]=(key, val) click to toggle source

Set element value

@param [String] key element key @param [Object] val new value

@return [XMLable::Mixins::Object, nil]

Calls superclass method
# File lib/xmlable/mixins/elements_storage.rb, line 119
def []=(key, val)
  h = __has_element_handler?(key)
  h ? __element_object_set(h, val) : super
end
__element_object_get(h) click to toggle source

Get element object

@param [XMLable::Handlers::Element, XMLable::Handlers::Elements, XMLable::Handlers::ElementNone] h

@api private

@return [XMLable::Mixins::Object]

# File lib/xmlable/mixins/elements_storage.rb, line 147
def __element_object_get(h)
  unless __elements.key?(h.key)
    if h.single?
      __set_element(nil, tag: h.tag, namespace: h.namespace_prefix)
    else
      __initialize_elements_container(h)
    end
  end
  ret = __elements[h.key]
  h.single? ? ret.first : ret
end
__element_object_initialize(h, val) click to toggle source

Set element object value

@param [XMLable::Handlers::Element, XMLable::Handlers::Elements, XMLable::Handlers::ElementNone] h @param [Object] val

@api private

# File lib/xmlable/mixins/elements_storage.rb, line 181
def __element_object_initialize(h, val)
  obj = __element_object_get(h)

  val = { '__content' => val } unless val.respond_to?(:each)
  if h.single?
    obj.__initialize_with(val)
  else
    val.map { |v| obj.new(v) }
  end
end
__element_object_set(h, val) click to toggle source

Set element object value

@param [XMLable::Handlers::Element, XMLable::Handlers::Elements, XMLable::Handlers::ElementNone] h @param [Object] val

@api private

@return [XMLable::Mixins::Object]

# File lib/xmlable/mixins/elements_storage.rb, line 169
def __element_object_set(h, val)
  __element_object_get(h).__overwrite_content(val)
end
__elements() click to toggle source

Elements which current object holds

@api private

@return [Hash(String => Array<XMLable::Mixins::Object>)]

# File lib/xmlable/mixins/elements_storage.rb, line 52
def __elements
  @__elements ||= {}
end
__elements_handlers() click to toggle source

Elements handlers storage

@api private

@return [XMLable::Handlers::Storage]

# File lib/xmlable/mixins/elements_storage.rb, line 86
def __elements_handlers
  @__elements_handler ||= self.class.__elements_handlers.clone
end
__empty?() click to toggle source

Is this object empty?

@api private

@return [Boolean]

Calls superclass method
# File lib/xmlable/mixins/elements_storage.rb, line 63
def __empty?
  return false unless super
  __elements.values.all?(&:__empty?)
end
__has_element_handler?(key) click to toggle source

Find element handler by its key

@param [Symbol, String] key

@api private

@return [XMLable::Handlers::Element, XMLable::Handlers::ElementNone, nil]

# File lib/xmlable/mixins/elements_storage.rb, line 133
def __has_element_handler?(key)
  key = key.to_s.gsub(/[=!]$/, '')
  __elements_handlers.storage.find { |h| h.method_name == key }
end
__initialize_elements_container(h) click to toggle source

Initialize elements container

@param [XMLable::Handlers::Element, XMLable::Handlers::Elements, XMLable::Handlers::ElementNone] h

@api private

@return [XMLable::Mixins::Container]

# File lib/xmlable/mixins/elements_storage.rb, line 41
def __initialize_elements_container(h)
  __elements[h.key] ||= h.container_for_xml_element(__node)
end
__set_element(el, opts = {}) click to toggle source

Set element from XML Node

@param [Symbol] name tag name @param [Nokogiri::XML::Element, nil] el

@api private

# File lib/xmlable/mixins/elements_storage.rb, line 19
def __set_element(el, opts = {})
  unless el.is_a?(Nokogiri::XML::Element)
    el = Nokogiri::XML::Element.new(opts[:tag], @__node)
    @__node << el
    if opts[:namespace]
      el.namespace = el.namespace_scopes.find { |n| n.prefix == opts[:namespace] }
    end
  end
  h = __elements_handlers.for_xml_object(el)
  el.instance_variable_set(:@__handler, h)
  __initialize_elements_container(h) << h.from_xml_element(el)
end
key?(key) click to toggle source

Does this object contain element with given key?

@return [XMLable::Mixins::Object, false]

Calls superclass method
# File lib/xmlable/mixins/elements_storage.rb, line 95
def key?(key)
  super || __has_element_handler?(key)
end
method_missing(name, *args, &blocks) click to toggle source
Calls superclass method
# File lib/xmlable/mixins/elements_storage.rb, line 68
def method_missing(name, *args, &blocks)
  h = __has_element_handler?(name)
  return super unless h

  if name.to_s.end_with?('=')
    __element_object_set(h, args.first)
  else
    __element_object_get(h)
  end
end