Module: XMLable::Mixins::AttributesStorage
- Defined in:
- lib/xmlable/mixins/attributes_storage.rb
Overview
AttributesStorage module contains the logic for object that able to
store XML attributes
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
Instance Method Summary collapse
-
#[](key) ⇒ XMLable::Mixins::Object?
Get attribute object by its key.
-
#[]=(key, val) ⇒ XMLable::Mixins::Object?
Set attribute value.
-
#__attribute_object_get(h) ⇒ XMLable::Mixins::Object
private
Get attribute object.
-
#__attribute_object_initialize(h, value) ⇒ Object
private
Initialize attribute object with value.
-
#__attribute_object_set(h, val) ⇒ Object
private
Set attribute object value.
-
#__attributes ⇒ Hash(String => Array<XMLable::Mixins::Object>)
private
Attributes which current object holds.
-
#__attributes_handlers ⇒ XMLable::Handlers::Storage
Attributes handlers storage.
-
#__empty? ⇒ Hash(String => Array<XMLable::Mixins::Object>)
private
Is this object empty?.
-
#__has_attribute_handler?(key) ⇒ XMLable::Handlers::Attribute, ...
private
Find attribute handler by its key.
-
#__set_attribute(att, opts = {}) ⇒ Object
private
Set XML attribute.
-
#key?(key) ⇒ XMLable::Mixins::Object, false
Does this object contain attribute with given key?.
- #method_missing(name, *args, &block) ⇒ Object
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 58 def method_missing(name, *args, &block) h = __has_attribute_handler?(name) return super unless h if name.to_s.end_with?('=') __attribute_object_set(h, args.first) else __attribute_object_get(h) end end |
Class Method Details
.included(base) ⇒ Object
8 9 10 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 8 def self.included(base) base.send(:extend, ClassMethods) end |
Instance Method Details
#[](key) ⇒ XMLable::Mixins::Object?
Get attribute object by its key
85 86 87 88 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 85 def [](key) h = __has_attribute_handler?(key) h ? __attribute_object_get(h) : super end |
#[]=(key, val) ⇒ XMLable::Mixins::Object?
Set attribute value
98 99 100 101 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 98 def []=(key, val) h = __has_attribute_handler?(key) h ? __attribute_object_set(h, val) : super end |
#__attribute_object_get(h) ⇒ XMLable::Mixins::Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Get attribute object
126 127 128 129 130 131 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 126 def __attribute_object_get(h) unless __attributes.key?(h.key) __set_attribute(nil, tag: h.tag, namespace: h.namespace_prefix) end __attributes[h.key] end |
#__attribute_object_initialize(h, value) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Initialize attribute object with value
153 154 155 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 153 def __attribute_object_initialize(h, value) __attribute_object_get(h).__overwrite_value(value) end |
#__attribute_object_set(h, val) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set attribute object value
141 142 143 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 141 def __attribute_object_set(h, val) __attribute_object_get(h).__overwrite_value(val) end |
#__attributes ⇒ Hash(String => Array<XMLable::Mixins::Object>)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Attributes which current object holds
42 43 44 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 42 def __attributes @__attributes ||= {} end |
#__attributes_handlers ⇒ XMLable::Handlers::Storage
Attributes handlers storage
162 163 164 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 162 def __attributes_handlers @__attributes_handler ||= self.class.__attributes_handlers.clone end |
#__empty? ⇒ Hash(String => Array<XMLable::Mixins::Object>)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is this object empty?
53 54 55 56 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 53 def __empty? return false unless super __attributes.values.all?(&:__empty?) end |
#__has_attribute_handler?(key) ⇒ XMLable::Handlers::Attribute, ...
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Find attribute handler by its key
112 113 114 115 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 112 def __has_attribute_handler?(key) key = key.to_s.gsub(/[=!]$/, '') __attributes_handlers.storage.find { |h| h.method_name == key } end |
#__set_attribute(att, opts = {}) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set XML attribute
22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 22 def __set_attribute(att, opts = {}) unless att @__node[opts[:tag]] = att att = @__node.attributes[opts[:tag]] if opts[:namespace] att.namespace = att.namespace_scopes.find { |n| n.prefix == opts[:namespace] } end end h = __attributes_handlers.for_xml_object(att) att.instance_variable_set(:@__handler, h) __attributes[h.key] = h.from_xml_attribute(att) end |
#key?(key) ⇒ XMLable::Mixins::Object, false
Does this object contain attribute with given key?
74 75 76 |
# File 'lib/xmlable/mixins/attributes_storage.rb', line 74 def key?(key) super || __has_attribute_handler?(key) end |