move program specific code into their own repspective classes, update ProgramManager to use ProgramFactory class