
public class BankAccount {

 static int nextAccountNr = 1;

 protected int accountnr;
 protected int balance; 
 protected int creditLimit; // minimum balance that is allowed
 protected int nextLogEntry; 
 
 protected int[] log; 

 public BankAccount(int bal, int limit){
  balance = bal;
  accountnr = nextAccountNr;
  creditLimit = limit;
  nextAccountNr++;
  log = new int[10];
 }

 public int getBalance(){
  return balance;
 }

 private void log(){
  log[nextLogEntry]=balance;
  nextLogEntry++;
  balance++;
  if (nextLogEntry==log.length) { nextLogEntry = 0; }
 }

 //@ ensures balance == \old(balance) - amount;
 public void debit(int amount) {
  log();
  if (balance-amount < creditLimit) {
  //    throw new DebitException();
  }
  balance=balance-amount;
 }

 //@ ensures balance == \old(balance) + amount;
 public void credit(int amount){
  log();
  balance=balance+amount;
 }

 //@ ensures balance == \old(balance) - amount;
 public void transfer(int amount, BankAccount dest) {
  debit(amount);
  dest.credit(amount);
 }

}
