Addressing software reuse through knowledge-based design