I've been thinking a lot about interfaces recently. In a talk by Andrew Kelley, he says, The more logic you move into the interface, the less flexible the interface is. This is a fundamental tradeoff. The very nature of logic being runtime or compile time known is exactly what makes it respectively less or more friendly to the cpu, optimizer, and maintenance burden. Key observation: understand the deal your making with laws of physics: don't relinquish code performance and ease of static analysis unless your gaining code reuseability in return. A broader point about abstractions. The myth of zero-cost abstraction: There are two types of cost: intellectual control or statistical control. Some languages provide statistical control: