# Entities
An entity is the core logic of a component.
One entity's data is contained in a single, individual event stream. An entity collects any important information from the events in the entity's stream.
An entity has a corresponding projection, which is used to copy data from the events to the entity object, either by setting the entity's attributes or by invoking its methods.
The data that an entity has collected is also used in handler code to determine whether a command should be processed.
# Entities Have No Dependencies
An entity is a data object. It's methods pertain to its data attributes.
Entities have no connascence of infrastructural concerns, like storage, messaging and messages. Infrastructural concerns are the domain of design elements that surround the entities, such as handlers, which span messaging and entities, and projections, which span the event stream application data storage model and entities.
It's the interplay of entities with the elements that are immediately adjacent to entities that is the nexus of a component's business logic implementation.
# Entities are State Machines
The principle purpose of an entity is to act as the state machine implementation that is the core of an autonomous service. A service itself is an implementation of a state machine, and the entity is the most central module of the design.
The various state transitions that an entity tracks are recorded as events. The projection of an entity's event stream is how the state machine is substantiated with its data.
# Example Entity
class Account
include Schema::DataStructure
attribute :id, String
attribute :customer_id, String
attribute :balance, Numeric, default: -> { 0 }
attribute :opened_time, Time
attribute :closed_time, Time
def open?
!opened_time.nil?
end
def closed?
!closed_time.nil?
end
def deposit(amount)
self.balance += amount
end
def withdraw(amount)
self.balance -= amount
end
def sufficient_funds?(amount)
balance >= amount
end
end