def self.property(property_name, options = {})
property_name = property_name.to_sym
self.properties << property_name
if options[:default] or self.defaults[property_name]
self.defaults[property_name] = options[:default]
end
unless instance_methods.map { |m| m.to_s }.include?("#{property_name}=")
class_eval "def \#{property_name}\n_regular_reader(\#{property_name.to_s.inspect})\nend\n\ndef \#{property_name}=(value)\n_regular_writer(\#{property_name.to_s.inspect}, value)\nend\n"
end
if defined? @subclasses
@subclasses.each { |klass| klass.property(property_name, options) }
end
end