added factory abstract