class T::ImmutableStruct

def self.inherited(subclass)

def self.inherited(subclass)
  super(subclass)
  T::Private::ClassUtils.replace_method(subclass.singleton_class, :inherited) do |s|
    super(s)
    raise "#{self.name} is a subclass of T::ImmutableStruct and cannot be subclassed"
  end
end

def self.prop(name, cls, rules={})

def self.prop(name, cls, rules={})
  return super if (cls.is_a?(Hash) && cls[:immutable]) || rules[:immutable]
  raise "Cannot use `prop` in #{self.name} because it is an immutable struct. Use `const` instead"
end

def initialize(hash={})

def initialize(hash={})
  super
  freeze
end

def with(changed_props)

def with(changed_props)
  raise "Cannot use `with` in #{self.class.name} because it is an immutable struct"
end