Look at content_item__new or content_revision__new in the content repository code. content_item__new originally took 18 arguements, so it was necessary to overload it a few times to cover all of the required cases. content_revision__new originally had less than 16 arguements, but it has been overloaded several times just for the sake of convenience. Both functions should give you a good idea of what needs to be done.