def self.property(property_name, options = {})
properties << property_name
if options.key?(:default)
defaults[property_name] = options[:default]
elsif defaults.key?(property_name)
defaults.delete property_name
end
define_getter_for(property_name)
define_setter_for(property_name)
@subclasses.each { |klass| klass.property(property_name, options) } if defined? @subclasses
condition = options.delete(:required)
if condition
message = options.delete(:message) || "is required for #{name}."
required_properties[property_name] = { condition: condition, message: message }
elsif options.key?(:message)
raise ArgumentError, 'The :message option should be used with :required option.'
end
end