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