'Strict attribute type checking to make sure we get what we expect from
all the callers
:param action: URL where the form is sent
:param inputs: A list with the names of the form parameters
:param attributes: The form tag attributes as seen in the HTML
:param hosted_at_url: The URL where the form appeared
:return: True if all attributes match our requirements, otherwise an
exception is raised'

def verify_data_types(self, action, inputs, attributes, hosted_at_url, method):

    if (action is not None):
        if (not isinstance(action, re._pattern_type)):
            raise ValueError(FORM_ID_FORMAT_ERROR)
    if (inputs is not None):
        if (not isinstance(inputs, list)):
            raise ValueError(FORM_ID_FORMAT_ERROR)
        for input_name in inputs:
            if (not isinstance(input_name, basestring)):
                raise ValueError(FORM_ID_FORMAT_ERROR)
    if (attributes is not None):
        if (not isinstance(attributes, dict)):
            raise ValueError(FORM_ID_FORMAT_ERROR)
        for (k, v) in attributes.iteritems():
            if (not isinstance(k, basestring)):
                raise ValueError(FORM_ID_FORMAT_ERROR)
            if (not isinstance(v, basestring)):
                raise ValueError(FORM_ID_FORMAT_ERROR)
    if (hosted_at_url is not None):
        if (not isinstance(hosted_at_url, re._pattern_type)):
            raise ValueError(FORM_ID_FORMAT_ERROR)
    if (method is not None):
        if (not isinstance(method, basestring)):
            raise ValueError(FORM_ID_FORMAT_ERROR)
    return True
