A good question. In Clojure, the idiomatic way to do the good part of OO is to use defrecord. Records created in this way do not encapsulate data. The data is immutable, and is directly accessible via public fields or map keyword lookup. Some other interesting differences from most OO: You *must* program to protocols (interfaces)--records cannot implement methods that are not part of a protocol. And implementation inheritance is forbidden. Defrecord supports a very iterative approach to development. You can start with simple functions and maps and then gradually discover protocols and records as your system evolves. When you introduce protocols and records, calling code need not change at all. All too often, data encapsulation protects your data from being used and reused, by creating an incompatible micro-language per domain entity. This is folly.