applied dependency inversion