note description: "This is the {ACCOUNT}." author: "Edward Langley" date: "$Date$" revision: "$Revision$" class ACCOUNT create open, make feature balance: INTEGER owner: PERSON minimum_balance: INTEGER = 1000 transactions: LINKED_LIST [TRANSACTION] open (who: STRING initial: INTEGER) local person: PERSON do create person.make (who) make(person, initial) end print_transactions do from transactions.start until transactions.off loop transactions.item.show print ("%N") transactions.forth end end deposit (sum: INTEGER) require sum > 0 do add (sum) add_transaction ("deposit", sum) ensure balance = old balance + sum end withdraw (sum: INTEGER) require sum > 0 sum <= balance - minimum_balance do add (-sum) add_transaction ("withdrawal", -sum) ensure balance = old balance - sum end may_withdraw (sum: INTEGER): BOOLEAN do Result := (balance >= sum + minimum_balance) end feature {NONE} add_transaction (type: STRING amount: INTEGER) local transaction: TRANSACTION do create transaction.make (type, amount) transactions.put_front (transaction) end add (sum: INTEGER) do balance := balance + sum end make (person: PERSON initial: INTEGER) require initial >= minimum_balance do create transactions.make balance := initial owner := person end invariant balance >= minimum_balance end