Class: ExactTargetSDK::APIObject

Inherits:
Object
  • Object
show all
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.

Class Method Summary collapse

Instance Method Summary collapse

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

.propertiesObject

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_nameObject



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.

Raises:



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_nameObject

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