class TypedOperation::Base

def attribute(name, type, special = nil, reader: :public, writer: :public, positional: false, default: nil)

def attribute(name, type, special = nil, reader: :public, writer: :public, positional: false, default: nil)
  super(name, type, special, reader:, writer: false, positional:, default:)
end

def with(...)

def with(...)
  # copy to new operation with new attrs
  self.class.new(**attributes.merge(...))
end