pass around nsdata instead of mutable
private properties instead of ivars