add NewFromReader()