Good advice for type-directed programming aspect-oriented programming and extensible generic functions