initial factory implementation