class CheramiClientImpl implements CheramiClient {

    @Override
    public DestinationDescription createDestination(CreateDestinationRequest request)
            throws EntityAlreadyExistsError, BadRequestError, IOException {

        this.throwOnNullRequest(request);
        if (!request.isSetPath()) {
            throw new BadRequestError("request missing 'path' parameter");
        }

        ThriftRequest<createDestination_args> thriftRequest = null;
        ThriftResponse<createDestination_result> thriftResponse = null;
        try {
            thriftRequest = buildThriftRequest("createDestination", new createDestination_args(request));
            thriftResponse = doRemoteCall(thriftRequest);
            createDestination_result result = thriftResponse.getBody(createDestination_result.class);
            if (thriftResponse.getResponseCode() == ResponseCode.OK) {
                return result.getSuccess();
            }
            if (result != null && result.isSetEntityExistsError()) {
                throw result.getEntityExistsError();
            }
            if (result != null && result.isSetRequestError()) {
                throw result.getRequestError();
            }
            throw new IOException("createDestination failed with unknown error:" + result);

        } finally {
            if (thriftResponse != null) {
                thriftResponse.release();
            }
        }
    }

    private  CheramiClientImpl(ClientOptions options);
    protected  CheramiClientImpl(String host, int port, ClientOptions options);
    protected  CheramiClientImpl(String routerFile, ClientOptions options);

}