Sha256: 3f3ea44dfa0387d0022722a17be2120a8c00591a3aef0038c03ae93d9b60930e

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

require 'xommelier/xml/element'

module Xommelier
  module Xml
    class Element
      module DSL
        def element(name, options = {})
          self.elements[name] = DEFAULT_ELEMENT_OPTIONS.merge(options)
          define_element_accessors(name)
        end

        def attribute(name, options = {})
          self.attributes[name] = DEFAULT_OPTIONS.merge(options)
          define_attribute_accessors(name)
        end

        def text(options = {})
          define_text_accessors
        end

        private

        def define_text_accessors
          define_method(:text)  {         @text ||= ''  }
          define_method(:text=) { |value| @text = value }
        end

        def define_element_accessors(name)
          case elements[name][:count]
          when :one, :may
            define_method(name)       {         @elements[name]         }
            define_method("#{name}=") { |value| @elements[name] = value }
          when :many
            define_method(name)       {
              @elements[name] ||= []
            }
            define_method("#{name}=") do |value|
              @elements[name] ||= []
              @elements[name] += Array(value)
            end
          end
        end

        def define_attribute_accessors(name)
          define_method(name)       {         @attributes[name]         }
          define_method("#{name}=") { |value| @attributes[name] = value }
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
xommelier-0.0.1 lib/xommelier/xml/element/dsl.rb