Test addition
Step: test go green

Add Money::plus
Test Bank responsible for conversion

Introduce concept of Bank which is responsible for currency conversion
Step: test go green

Introduce class Bank, implements reduce method
Test refactoring

Move addition test from DollarTest to MoneyTest
Test conversion of additions

The Bank should be able to reduce a Money object to a different currency
Test plus returns Sum object

Fokus on addition first, conversion second.
Introduce concept of Sum objects to be returned by plus operation.
Test plus returns Sum object

Fokus on addition first, conversion second.
Introduce concept of Sum objects to be returned by plus operation.
Step: introduce interface Expression

To handle different kinds of Money and Sum objects equally by the bank,
an abstract concept is required. The addition of Money object is an
expression, so Money and Sum both implements the interface expression.
Step: test go green

Implement reduce for Sum objects in Bank
Test money conversion

Bank should be able to reduce Money objects, too.
Step: test go green

Bank reduces Money objects
Step: refactoring

Sum is responsible for addition, not Bank
Step: refactoring

Bank should not care for Money or Sum, just reduces the expression
Step: reduce duplication

Move reduce() to interface Expression, Bank no longer cares for
concrete class
Test conversion to different currency

Bank handle conversion by exchange rates
Step: make test compile

Bank handles exchange rates
Step: depenceny inversion

Expressions get responsible for reducing operations, depending on Bank
objects
Step: test go green

Bank offer rates for conversion, Money takes responsibility for
conversion calculation
Step: reduce duplication

Bank uses exchange rate table