Methods and classes should explicitly require any collaborating objects they need in order to function correctly
high level modules should not depend on low level modules; both should depend on abstractions.
Write code to respond to external events, such as from an existing framework