def define_attribute(attr_name, attr_type, extra_params = {})
      attrs = obtain_class_variable(:@@ooxml_attributes)
      attr_hash = extra_params.merge({ :attr_type => attr_type })
      attr_hash[:accessor] ||= accessorize(attr_name)
      attrs[attr_name.to_s] = attr_hash
      self.send(:attr_accessor, attr_hash[:accessor]) unless attr_hash[:computed]
    end
def define_attribute(attr_name, attr_type, extra_params = {})
      attrs = obtain_class_variable(:@@ooxml_attributes)
      attr_hash = extra_params.merge({ :attr_type => attr_type })
      attr_hash[:accessor] ||= accessorize(attr_name)
      attrs[attr_name.to_s] = attr_hash
      self.send(:attr_accessor, attr_hash[:accessor]) unless attr_hash[:computed]
    end
Defines an attribute of OOXML object.
 === Parameters
 * +attribute_name+ - Name of the element attribute as seen in the source XML. Can be either <tt>"String"</tt> or <tt>:Symbol</tt>
   * Special attibute name <tt>'_'</tt> (underscore) denotes the value of the element rather than attribute.
 * +attribute_type+ - Specifies the conversion type for the attribute when parsing. Available options are:
   * +:int+ - <tt>Integer</tt>
   * +:uint+ - Unsigned <tt>Integer</tt>
   * +:double+ - <tt>Float</tt></u>
   * +:string+ - <tt>String</tt> (no conversion)
   * +:sqref+ - RubyXL::Sqref
   * +:ref+ - RubyXL::Reference
   * +:bool+ - <tt>Boolean</tt> ("1" and "true" convert to +true+, others to +false+)
   * one of +simple_types+ - <tt>String</tt>, plus the list of acceptable values is saved for future validation (not used yet).
 * +extra_parameters+ - Hash of optional parameters as follows:
   * +:accessor+ - Name of the accessor for this attribute to be defined on the object. If not provided, defaults to classidied +attribute_name+.
   * +:default+ - Value this attribute defaults to if not explicitly provided.
   * +:required+ - Whether this attribute is required when writing XML. If the value of the attrinute is not explicitly provided, +:default+ is written instead.
   * +:computed+ - Do not store this attribute on +parse+, but do call the object-provided read accessor on +write_xml+.
 ==== Examples
   define_attribute(:outline, :bool, :default => true)
 A <tt>Boolean</tt> attribute 'outline' with default value +true+ will be accessible by calling +obj.outline+
   define_attribute(:uniqueCount,  :int)
 An <tt>Integer</tt> attribute 'uniqueCount' accessible as +obj.unique_count+
   define_attribute(:_,  :string, :accessor => :expression)
 The value of the element will be accessible as a <tt>String</tt> by calling +obj.expression+
   define_attribute(:errorStyle, %w{ stop warning information }, :default => 'stop',)
 A <tt>String</tt> attribute named 'errorStyle' will be accessible as +obj.error_style+, valid values are <tt>"stop"</tt>, <tt>"warning"</tt>, <tt>"information"</tt>