Practical API Design: Confessions of a Java Framework Architect