Class: ExactTargetSDK::APIObject
- Inherits:
-
Object
- Object
- ExactTargetSDK::APIObject
- Includes:
- ActiveModel::Validations, ActiveModel::Validations::Callbacks
- Defined in:
- lib/exact_target_sdk/api_object.rb
Overview
Parent class of all ExactTarget API objects (listed here: docs.code.exacttarget.com/020_Web_Service_Guide/Objects). Provides class-level declarations, validation, and rendering that makes modeling each object easy.
Direct Known Subclasses
Attribute, ContentArea, FilterPart, Subscriber, TriggeredSend, TriggeredSendDefinition
Class Method Summary collapse
-
.array_property(name) ⇒ Object
Declares a property as an array of values.
-
.int_property(name, required = false) ⇒ Object
Same as #property, adding validation the the provided value is an integer.
-
.properties ⇒ Object
Returns an array of all registered properties.
-
.property(name, required = false) ⇒ Object
Declares a property of this object, optionally requiring it upon validation.
- .type_name ⇒ Object
Instance Method Summary collapse
-
#initialize(properties = {}) ⇒ APIObject
constructor
By default, any properties may be passed and set.
-
#render!(xml) ⇒ Object
By default, runs validation and executes #render_properties!.
-
#render_properties!(xml) ⇒ Object
By default, loops through all registered properties, and renders each that has been explicitly set.
- #render_property!(property_name, property_value, xml) ⇒ Object
-
#type_name ⇒ Object
By default, returns the name of the class.
Constructor Details
#initialize(properties = {}) ⇒ APIObject
By default, any properties may be passed and set.
May be overridden.
90 91 92 93 94 |
# File 'lib/exact_target_sdk/api_object.rb', line 90 def initialize(properties = {}) properties.each do |key, value| self.send "#{key}=", value end end |
Class Method Details
.array_property(name) ⇒ Object
Declares a property as an array of values.
Provides a getter and setter for this property. The getter will always return an array (not null), so the client may simply append to this property.
Note that once the property has been either read or written to, it will be rendered.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/exact_target_sdk/api_object.rb', line 44 def array_property(name) # TODO: type validation would be nice name = name.to_s class_eval <<-__EOF__ def #{name} @_set_#{name} = true @#{name} ||= [] end def #{name}=(value) @_set_#{name} = true @#{name} = value end __EOF__ register_property!(name) end |
.int_property(name, required = false) ⇒ Object
Same as #property, adding validation the the provided value is an integer.
62 63 64 65 |
# File 'lib/exact_target_sdk/api_object.rb', line 62 def int_property(name, required = false) property(name, required) validates name.to_sym, :numericality => { :allow_nil => true, :only_integer => true } end |
.properties ⇒ Object
Returns an array of all registered properties.
68 69 70 |
# File 'lib/exact_target_sdk/api_object.rb', line 68 def properties @properties || [] end |
.property(name, required = false) ⇒ Object
Declares a property of this object, optionally requiring it upon validation.
Provides a getter and setter for this property, keeping track of whether or not it has been set and registering it for rendering.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/exact_target_sdk/api_object.rb', line 21 def property(name, required = false) name = name.to_s attr_reader name.to_sym class_eval <<-__EOF__ def #{name}=(value) @_set_#{name} = true @#{name} = value end __EOF__ if required validates name.to_sym, :presence => true end register_property!(name) end |
.type_name ⇒ Object
72 73 74 |
# File 'lib/exact_target_sdk/api_object.rb', line 72 def type_name name.split('::').last end |
Instance Method Details
#render!(xml) ⇒ Object
By default, runs validation and executes #render_properties!.
If overridden, the child class should check wehter or not the object is valid, and then render the object. In general, the render_properties! method should be overridden instead.
108 109 110 111 |
# File 'lib/exact_target_sdk/api_object.rb', line 108 def render!(xml) raise(InvalidAPIObject, self) if invalid? render_properties!(xml) end |
#render_properties!(xml) ⇒ Object
By default, loops through all registered properties, and renders each that has been explicitly set.
May be overridden.
117 118 119 120 121 122 123 |
# File 'lib/exact_target_sdk/api_object.rb', line 117 def render_properties!(xml) self.class.properties.each do |property| next unless instance_variable_get("@_set_#{property}") property_value = self.send(property) render_property!(property, property_value, xml) end end |
#render_property!(property_name, property_value, xml) ⇒ Object
125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/exact_target_sdk/api_object.rb', line 125 def render_property!(property_name, property_value, xml) if property_value.is_a?(APIObject) xml.__send__(property_name, { "xsi:type" => property_value.type_name } ) do property_value.render!(xml) end elsif property_value.is_a?(Array) property_value.each do |current| render_property!(property_name, current, xml) end else xml.__send__(property_name, property_value.to_s) end end |
#type_name ⇒ Object
By default, returns the name of the class.
May be overridden.
99 100 101 |
# File 'lib/exact_target_sdk/api_object.rb', line 99 def type_name self.class.type_name end |