module T::Props::CustomType

def self.checked_serialize(instance)

def self.checked_serialize(instance)
  val = T.cast(instance.class, T::Props::CustomType).serialize(instance)
  unless valid_serialization?(val)
    msg = "#{instance.class} did not serialize to a valid scalar type. It became a: #{val.class}"
    if val.is_a?(Hash)
      msg += "\nIf you want to store a structured Hash, consider using a T::Struct as your type."
    end
    raise TypeError.new(msg)
  end
  val
end

def self.included(_base)

def self.included(_base)
  super
  raise 'Please use "extend", not "include" to attach this module'
end

def self.scalar_type?(val)

def self.scalar_type?(val)
  # We don't need to check for val's included modules in
  # T::Configuration.scalar_types, because T::Configuration.scalar_types
  # are all classes.
  klass = T.let(val.class, T.nilable(Class))
  until klass.nil?
    return true if T::Configuration.scalar_types.include?(klass.to_s)
    klass = klass.superclass
  end
  false
end

def self.valid_serialization?(val)

def self.valid_serialization?(val)
  case val
  when Array
    val.each do |v|
      return false unless scalar_type?(v)
    end
    true
  else
    scalar_type?(val)
  end
end

def deserialize(scalar); end

def deserialize(scalar); end

def instance?(value)

def instance?(value)
  self.===(value)
end

def serialize(instance); end

def serialize(instance); end

def valid?(value)

def valid?(value)
  instance?(value)
end