refactored to use delegated constructors