Cleaning up PHP object constructors I have this annoying problem in PHP with faking overloading constructors.  I understand the concept, but the code I produce feels kind of ugly. It isn't a lot of code, just bad code. Any ideas on how to make this sane?

/**
 * Instantiate Fencer object from user meta database.
 *
 * If fencer data does not exist in database and USFA ID is provided,
 * it will automatically update from API
 *
 * If USFA ID is not provided, will throw exception
 *
 * If API data is provided, a user ID must also be provided
 * that way we can save the data from the API to the user.
 *
 * @param int|null $user_id
 * @param string|null $usfa_id
 * @param array|null $raw_data
 *
 * @throws InvalidArgumentException
 *  1. If the user does not exist and USFA ID not provided
 *  2. Raw API data is provided, but not a User ID to save it to
 */
private function __construct( $user_id = null, $usfa_id = null, $raw_data = null ) {
    if ( $raw_data === null ) {
        if ( null === $user_id ) {
            $user_id = self::get_user_id_from_usfa_id( $usfa_id );
        }

        $this-&gt;wp_id = $user_id;

        $fencerdata = get_user_meta( $user_id, 'fence_plus_fencer_data', true );

        if ( ! empty( $fencerdata ) ) {
            foreach ( $fencerdata as $key =&gt; $data ) {
                call_user_func( array( $this, 'set_' . $key ), $data );
                // set all properties by calling internal setters based on fencer user meta data key
            }
        }
        else if ( $usfa_id != null ) {
            $this-&gt;usfa_id = $usfa_id;
            $this-&gt;update();
            $this-&gt;save();
        }
        else {
            throw new InvalidArgumentException( "Fencer data does not exist. Instantiate with USFA ID", 1 );
        }
    }
    else {
        if ( null == $user_id ) {
            throw new InvalidArgumentException( "User ID must be provided when instantiating with raw API data", 2 );
        }

        $this-&gt;wp_id = $user_id;
        $this-&gt;process_api_data( array( $raw_data ) );
        $this-&gt;interpret_data();
        $this-&gt;save();
    }
}
It is a bad idea for a constructor to contain non-trivial code. 
Constructors should assign values to fields or another simple actions.
If you need complex initialization, you should use factory object or factory method