class XMLable::Builder

Builder class builds object that represents XML attribute and values

Attributes

defined_types[R]

@return [Hash]

Public Class Methods

build_attribute(attribute, handler) click to toggle source

Build attribute object from XML attribute

@param [Nogogiri::XML::Attribute] attribute @param [XMLable::Handlers::Base] handler

@return [XMLable::Mixins::Object]

# File lib/xmlable/builder.rb, line 30
def build_attribute(attribute, handler)
  obj = handler.proxy.new({}, attribute, handler)
  populate_attribute(obj, attribute)
end
build_document(document, handler) click to toggle source

Build document object from XML document

@param [Nokogiri::XML::Document] document @param [XMLable::Handlers::Document] handler

@return [XMLable::Mixins::Object]

# File lib/xmlable/builder.rb, line 17
def build_document(document, handler)
  obj = handler.proxy.new({}, document, handler)
  populate_document(obj, document)
end
build_element(node, handler) click to toggle source

Build element object from XML element

@param [Nogogiri::XML::Element] node @param [XMLable::Handlers::Base] handler

@return [XMLable::Mixins::Object]

# File lib/xmlable/builder.rb, line 43
def build_element(node, handler)
  obj = handler.proxy.new({}, node, handler)
  populate_element(obj, node)
end
container_proxy_for(klass) click to toggle source

Get container proxy for the given class

@param [Class] klass

@return [Class]

# File lib/xmlable/builder.rb, line 177
def container_proxy_for(klass)
  Class.new(klass) { include Mixins::Container }
end
define_type(*names, &block) click to toggle source

Define new type

@param [Array<Object>] names type's names(aliases)

@return [Class]

# File lib/xmlable/builder.rb, line 139
def define_type(*names, &block)
  names = names.map { |n| n.is_a?(Symbol) ? n.to_s : n }
  main = names.first
  klass = wrapped_type?(main) ? wrap_type(main, &block) : inherit_type(main, &block)
  names.each { |n| instance.defined_types[n] = klass }
  klass
end
find_type(type) click to toggle source

Find defined type

@param [Object] type

@return [Class] returns found type or define new one if it's not found

# File lib/xmlable/builder.rb, line 96
def find_type(type)
  type = type.to_s if type.is_a?(Symbol)
  klass = instance.defined_types[type]
  klass ? klass : define_type(type)
end
inherit_type(klass, &block) click to toggle source

Inherit type and set additional settings

@param [Class] klass

@return [Class] returns wrapped class

# File lib/xmlable/builder.rb, line 126
def inherit_type(klass, &block)
  Class.new(klass) do
    class_eval(&block) if block_given?
  end
end
new() click to toggle source
# File lib/xmlable/builder.rb, line 185
def initialize
  @defined_types = {}
end
populate_attribute(obj, node) click to toggle source

Populate attribute object

@param [XMLable::Mixins::Object] obj @param [Nogogiri::XML::Attr] node

@return [XMLable::Mixins::Object]

# File lib/xmlable/builder.rb, line 85
def populate_attribute(obj, node)
  obj.tap { |o| o.__set_value(node) }
end
populate_document(obj, node) click to toggle source

Populate document object

@param [XMLable::Mixins::Object] obj @param [Nogogiri::XML::Document] node

@return [XMLable::Mixins::Object]

# File lib/xmlable/builder.rb, line 56
def populate_document(obj, node)
  obj.__set_root(node.root)
  obj
end
populate_element(obj, node) click to toggle source

Populate element object

@param [XMLable::Mixins::Object] obj @param [Nogogiri::XML::Element] node

@return [XMLable::Mixins::Object]

# File lib/xmlable/builder.rb, line 69
def populate_element(obj, node)
  node.namespace_definitions.each { |ns| obj.__set_namespace_definition(ns) }
  node.elements.each { |el| obj.__set_element(el) }
  node.attributes.each { |_, att| obj.__set_attribute(att) }
  obj.__set_content(node)
  obj
end
proxy_for(type) click to toggle source

Get proxy for the given type

@param [Object] type type's name

@return [Class] returns type's proxy class

# File lib/xmlable/builder.rb, line 166
def proxy_for(type)
  find_type(type).dup
end
wrap_type(klass, &block) click to toggle source

Wrap type with additional logic

@param [Class] klass

@return [Class] returns wrapped class

# File lib/xmlable/builder.rb, line 109
def wrap_type(klass, &block)
  Class.new do
    include Mixins::Object
    include Mixins::Wrapper
    include Mixins::Castable
    include Mixins::OptionsStorage
    class_eval(&block) if block_given?
  end
end
wrapped_type?(klass) click to toggle source

Is the given class wrapped?

@return [Boolean]

# File lib/xmlable/builder.rb, line 152
def wrapped_type?(klass)
  return true  if !klass.is_a?(Class)
  return false if klass.ancestors.include?(Mixins::StandaloneElement)
  return false if klass.ancestors.include?(Mixins::StandaloneAttribute)
  true
end