def attr_field(field, default = nil, predicate = false)
method_id = field.to_s.downcase.gsub(/[-\s]+/, '_')
unless instance_methods.include?(method_id)
if default
define_method(method_id) do
read_attribute field
end
else
define_method(method_id) do
attributes[filter_key(field)] ||= default
end
end
end
writer_id = [method_id,'='].join
unless instance_methods.include?(writer_id)
define_method(writer_id) do |value|
write_attribute field, value
end
end
predicate_id = [method_id, '?'].join
if predicate && !instance_methods.include?(predicate_id)
define_method(predicate_id) do
attribute?(field)
end
has_predicate = ['has_', predicate_id].join
alias_method(has_predicate, predicate_id) unless instance_methods.include?(has_predicate)
end
end