Object-oriented languages have opinions about how best to arrange code. These opinions lead OO to naturally offer certain _affordances_. Just as round doorknobs expect to be grasped and rotated, OO expects messages, polymorphism, loose-coupling and factories. The key to creating intuitive and maintainable OO applications is to understand and embrace these built-in affordances.