public Rental ProvideRental(IClient client, Bike bike, UnitOfTime unitOfTime) { if (!bike.IsAvailable()) { throw new BikeIsNotAvailableException("Bike is not available"); } RentalModality rentalModality; switch (unitOfTime) { case UnitOfTime.Hour: rentalModality = this.CurrentRentalByHourModality; break; case UnitOfTime.Day: rentalModality = this.CurrentRentalByDayModality; break; case UnitOfTime.Week: rentalModality = this.CurrentRentalByWeekModality; break; default: throw new UnitOfTimeIsNotValidException("Unit of time is not valid"); } Rental rental = new Rental(client, new RentalBeginning(this), bike, rentalModality); bike.ChangeState(BikeState.In_Use); bike.Rental = rental; client.AddRental(rental); return(rental); }