  In this paper we describe how to build software architectures as a
composition of state machines, using ideas and principles from the field of
Domain-Driven Design. By definition, our approach is modular, allowing one to
compose independent subcomponents to create bigger systems, and representable,
allowing the implementation of a system to be kept in sync with its graphical
representation.
  In addition to the design itself we introduce the Crem library, which
provides a concrete state machine implementation that is both compositional and
representable, Crem uses Haskell's advanced type-level features to allow users
to specify allowed and forbidden state transitions, and to encode complex state
machine -- and therefore domain-specific -- properties. Moreover, since Crem's
state machines are representable, Crem can automatically generate graphical
representations of systems from their domain implementations.
