Module: SoftLayer::DynamicAttribute::ClassMethods
- Defined in:
- lib/softlayer/DynamicAttribute.rb
Instance Method Summary collapse
-
#sl_dynamic_attr(attribute_name) {|attribute_definition| ... } ⇒ Object
sl_dynamic_attr declares a new dynamic softlayer attribute and accepts a block in which the should_update? and to_update methods for the attribute are established.
- #sl_dynamic_attr_definition(attribute_name) ⇒ Object
Instance Method Details
#sl_dynamic_attr(attribute_name) {|attribute_definition| ... } ⇒ Object
sl_dynamic_attr declares a new dynamic softlayer attribute and accepts a block in which the should_update? and to_update methods for the attribute are established.
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/softlayer/DynamicAttribute.rb', line 116 def sl_dynamic_attr (attribute_name, &block) attribute_definition = DynamicAttributeDefinition.new(attribute_name) # allow the block to update the attribute definition yield attribute_definition if block_given? # store off the attribute definition where we can find it later @attribute_definitions ||= {}; @attribute_definitions[attribute_name] = attribute_definition; # define a method called "update_<attribute_name>!" which calls the update block # stored in the attribute definition update_symbol = "update_#{attribute_name}!".to_sym define_method(update_symbol, &attribute_definition.update_block) # define a method called "should_update_<attribute_name>?" which calls the # should update block stored in the attribute definition should_update_symbol = "should_update_#{attribute_name}?".to_sym define_method(should_update_symbol, &attribute_definition.should_update_block) # define an instance method of the class this is being # called on which will get the value of the attribute. # # The getter will take one argument "force_update" which # is treated as boolean value. If true, then the getter will # force the attribute to update (by using its "to_update") block. # # If the force variable is false, or not given, then the # getter will call the "should update" block to find out if the # attribute needs to be updated. # getter_name = attribute_name.to_sym value_instance_variable = "@#{attribute_name}".to_sym define_method(getter_name) do |*args| force_update = args[0] || false if force_update || __send__(should_update_symbol) instance_variable_set(value_instance_variable, __send__(update_symbol)) end instance_variable_get(value_instance_variable) end end |
#sl_dynamic_attr_definition(attribute_name) ⇒ Object
161 162 163 |
# File 'lib/softlayer/DynamicAttribute.rb', line 161 def sl_dynamic_attr_definition(attribute_name) @attribute_definitions[attribute_name] end |