Use a custom matcher for entity attributes

* entities are expected to respond to the accessor for each attribute
* entities shouldn't respond to the attribute setter if it has been marked as
  private (this pattern has emerged in the codebase)