lib/active_zuora/fields/field.rb
module ActiveZuora
class Field
attr_accessor :name, :zuora_name, :default, :namespace
def initialize(name, namespace, options={})
@name = name.to_s
@namespace = namespace
@zuora_name = options[:zuora_name] || @name.camelize
@default = options[:default]
end
def type_cast(value)
value
end
def define_instance_methods(zuora_class)
# We store this into a variable so we can use it in our
# class eval below.
field_name = name
# Add dirty helpers
# The value will still be stored in an instance
# variable with the name of the field.
# But we'll define extra writer methods so that we
# can handle any input from savon.
# Savon just calls underscore on the element names,
# but our fields allow for any combination
# of field name and Zuora name.
# This is especially useful for custom fields which
# are named like CustomField__c. You might choose
# to make this field :custom_field, and therefore
# we'll need a writer for :custom_field, :custom_field_c,
# and I threw in a :CustomField__c just for good measure.
writers = [field_name, zuora_name, zuora_name.underscore].uniq
zuora_class.class_eval do
# Define the methods on an included module, so we can override
# them using super.
generated_attribute_methods.module_eval do
# Getter
attr_reader field_name
# Boolean check.
define_method "#{field_name}?" do
!!send(field_name)
end
# Writers
writers.each do |writer_name|
define_method "#{writer_name}=" do |value|
write_attribute(field_name, value)
end
end
end
# Dirty attribute helpers.
define_attribute_methods [field_name]
end
end
def build_xml(xml, soap, value, options={})
qualifier = soap.namespace_by_uri(namespace)
nil_strategy = options[:nil_strategy] || :omit
# The extra qualifiers attribute needs to be passed in
# in case the field is another complexType that needs
# to be namespaced.
if !value.nil? || nil_strategy == :whitespace
xml.tag!(qualifier, zuora_name.to_sym, value.to_s)
elsif nil_strategy == :fields_to_null
xml.tag!(qualifier, :fieldsToNull, zuora_name.to_sym)
end
end
def clear_changed_attributes(value)
# If the value of this field has attribute changes to clear,
# override this function.
end
end
end