factory argument comes first