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.
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 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 |
# File 'lib/softlayer/DynamicAttribute.rb', line 100 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
145 146 147 |
# File 'lib/softlayer/DynamicAttribute.rb', line 145 def sl_dynamic_attr_definition(attribute_name) @attribute_definitions[attribute_name] end |