we probably also want a mechanism for reading from an in-memory string for testing purposes if for nothing else.  File under 'nice to have, but non-blocking.'