  High-level reversible programming languages are few and far between and in
general offer only rudimentary abstractions from the details of the underlying
machine. Modern programming languages offer a wide array of language constructs
and paradigms to facilitate the design of abstract interfaces, but we currently
have a very limited understanding of the applicability of such features for
reversible programming languages.
  We introduce the first reversible object-oriented programming language,
ROOPL, with support for user-defined data types, class inheritance and
subtype-polymorphism. The language extends the design of existing reversible
imperative languages and it allows for effective implementation on reversible
machines.
  We provide a formalization of the language semantics, the type system and we
demonstrate the computational universality of the language by implementing a
reversible Turing machine simulator. ROOPL statements are locally invertible at
no extra cost to program size or computational complexity and the language
provides direct access to the inverse semantics of each class method.
  We describe the techniques required for a garbage-free translation from ROOPL
to the reversible assembly language PISA and provide a full implementation of
said techniques. Our results indicate that core language features for
object-oriented programming carries over to the field of reversible computing
in some capacity.
