Maeder's paper is still up to date after 27 years.
An example of object oriented programming in Mathematica is notebook programming.
Notebook attributes can be edited with the option inspector.
Notebook style follows a class organization. Instancing works by choosing style, in front end menu Format > Edit style sheet. Subclass creation works by editing a style sheet.
Before associations, options are already a good support of object oriented programming. They are extensively used for graphics objects.
The problem of OOP in Mathematica is some sort of contradiction with functional programming. In functional programming, we don't like hidden or private states and side effects but they are necessary for graphics and useful for notebooks, because our generally slow brains perceive those illusive objects so fast.
Lisp is another functional language that has developed an object system, see Common Lisp Object System on Wikipedia. At first sight, it looks familiar, like pattern matching. The same path in Mathematica seems possible.