auto_generate_validations (DataMapper::Validate::AutoValidate)

    # File lib/dm-validations/auto_validate.rb, line 78
          def auto_generate_validations(property)
            property.options[:auto_validation] = true unless property.options.has_key?(:auto_validation)
            return unless property.options[:auto_validation]

            # a serial property is allowed to be nil too, because the
            # value is set by the storage system
            opts = { :allow_nil => property.nullable? || property.serial? }
            opts[:context] = property.options[:validates] if property.options.has_key?(:validates)

            # presence
            unless opts[:allow_nil]
              # validates_present property.name, opts
              validates_present property.name, options_with_message(opts, property, :presence)
            end

            # length
            if property.type == String
              #len = property.length  # XXX: maybe length should always return a Range, with the min defaulting to 1
              len = property.options.fetch(:length, property.options.fetch(:size, DataMapper::Property::DEFAULT_LENGTH))
              if len.is_a?(Range)
                opts[:within] = len
              else
                opts[:maximum] = len
              end
              # validates_length property.name, opts
              validates_length property.name, options_with_message(opts, property, :length)
            end

            # format
            if property.options.has_key?(:format)
              opts[:with] = property.options[:format]
              # validates_format property.name, opts
              validates_format property.name, options_with_message(opts, property, :format)
            end

            # uniqueness validator
            if property.options.has_key?(:unique)
              value = property.options[:unique]
              if value.is_a?(Array) || value.is_a?(Symbol)
                # validates_is_unique property.name, :scope => Array(value)
                validates_is_unique property.name, options_with_message({:scope => Array(value)}, property, :is_unique)
              elsif value.is_a?(TrueClass)
                # validates_is_unique property.name
                validates_is_unique property.name, options_with_message({}, property, :is_unique)
              end
            end

            # within validator
            if property.options.has_key?(:set)
              validates_within property.name, options_with_message({:set => property.options[:set]}, property, :within)
            end

            # numeric validator
            if Integer == property.type
              opts[:integer_only] = true
              # validates_is_number property.name, opts
              validates_is_number property.name, options_with_message(opts, property, :is_number)
            elsif BigDecimal == property.type || Float == property.type
              opts[:precision] = property.precision
              opts[:scale]     = property.scale
              # validates_is_number property.name, opts
              validates_is_number property.name, options_with_message(opts, property, :is_number)
            else
              # We only need this in the case we don't already
              # have a numeric validator, because otherwise
              # it will cause duplicate validation errors
              unless property.custom?
                # validates_is_primitive property.name, opts
                validates_is_primitive property.name, options_with_message(opts, property, :is_primitive)
              end
            end
          end