"OK, what do you want next?" I asked Sam.
"A double cappuccino with latte," he replied eagerly.
"I meant for the system," I said.
"Oh, I'd like to get the charge system running, so I can bill customers monthly rather than for each rental. That will avoid leaving a lot of cash lying around the store. I also want to be able to offer discounts to frequent renters," Sam rambled on.
"OK," I said, "that sounds like two things. Which one do you want first?"
"Let's start with the charging part," he replied.
"We have at least two halves to that part: determining how much to bill the customer and then actually doing the billing. The determination part seems simpler: total up completed rentals and any late fees to compute a bill. The second part requires a bit more work. You need to sign up with an Internet-based credit card handler. That's another external interface, but a much more interesting one. You can't just test against that database willy-nilly. You don't want to charge customers for things they haven't bought," I stated.
"We need a new class. The one-line definition of this class is 'A charge to a customer for rentals during a period of time.' What do you want to call this class: Invoice or Bill?" I asked.
"I have a brother named Bill. So let's call it Invoice or else I'll get confused," he answered.
Here is the class that Sam and I created:
class Invoice Customer the_customer InvoiceDetail the_detail Dollar total submit_for_payment( ) create_invoice_detail( ...