def attribute(name, options = {})
class_eval "def \#{name}\nattributes[:\#{name}]\nend\n", __FILE__, __LINE__
case options[:type]
when :boolean
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = case new_\#{name}\nwhen true,'true'\ntrue\nwhen false,'false'\nfalse\nend\nend\n", __FILE__, __LINE__
when :float
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = new_\#{name}.to_f\nend\n", __FILE__, __LINE__
when :integer
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = new_\#{name}.to_i\nend\n", __FILE__, __LINE__
when :string
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = new_\#{name}.to_s\nend\n", __FILE__, __LINE__
when :time
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = if new_\#{name}.nil? || new_\#{name} == \"\" || new_\#{name}.is_a?(Time)\nnew_\#{name}\nelse\nTime.parse(new_\#{name})\nend\nend\n", __FILE__, __LINE__
when :array
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = [*new_\#{name}]\nend\n", __FILE__, __LINE__
else
if squash = options[:squash]
class_eval "def \#{name}=(new_data)\nif new_data.is_a?(Hash)\nif new_data.has_key?(:'\#{squash}')\nattributes[:\#{name}] = new_data[:'\#{squash}']\nelsif new_data.has_key?(\"\#{squash}\")\nattributes[:\#{name}] = new_data[\"\#{squash}\"]\nelse\nattributes[:\#{name}] = [ new_data ]\nend\nelse\nattributes[:\#{name}] = new_data\nend\nend\n", __FILE__, __LINE__
else
class_eval "def \#{name}=(new_\#{name})\nattributes[:\#{name}] = new_\#{name}\nend\n", __FILE__, __LINE__
end
end
@attributes ||= []
@attributes |= [name]
for new_alias in [*options[:aliases]]
aliases[new_alias] = name
end
end