class Hashie::Dash

def self.property(property_name, options = {})


existing Dash.
property, to raise an error if a value is unset in a new or
* :required - Specify the value as required for this

Dash.
to be returned before a value is set on the property in a new
* :default - Specify a default value for this property,

as follows:
Defines a property on the Dash. Options are
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
  unless instance_methods.map { |m| m.to_s }.include?("#{property_name}=")
    define_method(property_name) { |&block| self.[](property_name, &block) }
    property_assignment = property_name.to_s.concat('=').to_sym
    define_method(property_assignment) { |value| self.[]=(property_name, value) }
  end
  if defined? @subclasses
    @subclasses.each { |klass| klass.property(property_name, options) }
  end
  required_properties << property_name if options.delete(:required)
end