*! version 1.0.2  05aug2010
program define spreg, eclass
	version 11.1

	if replay() {
		if `"`e(cmd)'"' != "spreg" {
			error 301
		}
		Replay `0'
		exit
	}
	Estimate `0'

	ereturn local cmdline `"spreg `0'"'

end

program define Estimate, eclass
	version 11.1

	gettoken method 0 : 0

	syntax varlist(numeric) [if] [in] [,		///
		id(varname numeric) HETeroskedastic * ]

	if "`method'" == "ml" {

		if "`heteroskedastic'" != "" {
			di "{err}option {inp}heteroskedastic {err}not "	///
				"allowed with {inp}ml {err}estimator"
			exit 198
		}

		cap noi _spreg_ml `0'
		local rc = c(rc)

		// drop tempnames used by Mata
		foreach m of local matanames {
			cap mata: mata drop `m'
		}

		if `rc' exit `rc'
	}
	else if "`method'" == "gs2sls" {
		// _spreg_gs2sls calls spivreg, which drops tempnames
		_spreg_gs2sls `0'
	}
	else {
		di "{err}estimator {cmd:`method'} invalid"
		exit 498
	}

end

program define Replay
	version 11.1

	syntax [, * ]

	_get_diopts diopts, `options'

	_coef_table_header
	_coef_table, `options'

end

exit