(The accommodation mixin includes basic billing)

This slice of the software

Each week and each occupied room is represented by an instance of
AccommodationInfo in the repository and stores the name of the guest (assumed
to be unique) and the room number where he or she has been
accommodated for the week. Consumption is reported every morning
by the cleaning lady, who also refills the fridge in the room.

This slice is more or less orthogonal to making reservations, but note
that actually accommodating a guest who has reserved a room
requires to move his data from the Repository<IReservationInfo>
to the Repository<IAccommodationInfo>. For this reason, the
AccommodationMixin depends on the ReservationMixin, but
keep in mind that the AccommodationMixin extends Hotel.Base, not
the ReservationMixin. (Look at the diagram above again, if this
confuses you.)

The AccommodationMixin holds an instance of the
Repository<IReservationInfo> and exposes the following simple
methods. They work in analogous manner as their counterparts in
the ReservationMixin:

                  
- bool IsRoomFree (int number)
- int? FindFreeRoom ()                   // returns null if none is found
- IAccommodationInfo Find (string name)  // ditto

(Just as in the reservation mixin, CountAccommodations ()
and ClearAccommodations () are not part of the interface,
because they are support for testing.)

As explained before, an accommodation can be understood as a
reservation for the current week. For this reason, IsRoomFree,
FindFreeRoom and Find don't sport a week-parameter, as their
siblings in the ReservationMixin do.

IsRoomFree has a twist, because it must make sure

AND

(An alternative implementation would set and clear
the corresponding reservation info for the current week
whenever someone is accommodated.)

In code:

    public virtual bool IsRoomFreeOfAccommodation (int number)
    {
      return _accommodationRepository.Find ().Count (accInfo => accInfo.Number == number) == 0;
    }

    public virtual bool IsRoomFree (int number)
    {
      return Base.IsRoomFree (number, Calendar.Week ()) && IsRoomFreeOfAccommodation (number);
    }

FindFreeRoom () and Find ultimately look into the accommodation repository,
what is more or less analogous to the reservation mixin's methods of the same names.

In code:

    public virtual int? FindFreeRoom ()
    {
      for (int iter = 0; iter < Hotel.Base.Hotel.NumberOfRooms; iter++)
      {
        if (IsRoomFree (iter))
        {
          return iter;
        }
      }
      return null;
    }

    public virtual IAccommodationInfo Find (string name)
    {
      return _accommodationRepository.Find ().SingleOrDefault<IAccommodationInfo> (elem => elem.Name == name);
    }

The analogous operations to Reserve and Cancel are
Accommodate and CheckOut. Accommodate giveth, CheckOut taketh,
just like Reserve and Cancel. More deja-vus:

Apart from that, CheckOut returns an amount of money as decimal,
i.e. the Total as computed by the Bill.