mostly refactored back to polymorphic - need to handle string literals again