Drupal as a Content Management Framework, and via its wider contrib ecosystem, offers module developers a wide and, lets face it, confusing array of options.
How do you properly architect a Drupal module so that:
1. You take best advantage of the various APIs and tools that Drupal and contrib modules such as Views, Entity API, Rules, Ctools, etc offer.
2. You allow your module users to effectively build upon what you are doing so that they can cooperate with you and help your module grow.
3. You cater to both the developers that will be using your module and end users that don't want to install 20 dependencies and configuring 10 different items in order to get your module to work.
We will try and answer these questions basing them on our own experience with building the Rooms module for hotel bookings and by looking at choices other popular modules have taken in providing functionality to users.
Along the way there will be stories of Drupal glory and stories of Drupal #fail - all in there to help us make better modules!