Application development through reuse: the ITHACA tools environment