Reusing Object Oriented Design: An Algebraic Approach