'Create a new zone.
:param domain: Name of zone, followed by a dot (.) (e.g. example.com.)
:type  domain: ``str``
:param type: Zone type (Only master available). (optional)
:type  type: ``str``
:param ttl: TTL for new records. (optional)
:type  ttl: ``int``
:param extra: Extra attributes (\'mbox\', \'ns\', \'minimum\', \'refresh\',
\'expire\', \'update_acl\', \'xfer\').
(optional)
:type extra: ``dict``
:rtype: :class:`Zone`'

def create_zone(self, domain, type='master', ttl=None, extra=None):

    if (extra is None):
        extra = ZONE_EXTRA_PARAMS_DEFAULT_VALUES
    else:
        extra_fields = ZONE_EXTRA_PARAMS_DEFAULT_VALUES.keys()
        missing = set(extra_fields).difference(set(extra.keys()))
        for field in missing:
            extra[field] = ZONE_EXTRA_PARAMS_DEFAULT_VALUES.get(field)
    schema_params = SCHEMA_BUILDER_MAP.get('create_zone')
    attributes = schema_params.get('attributes')
    schema = api_schema_builder(schema_params.get('urn_nid'), schema_params.get('method'), attributes)
    params = {'apiuser': self.key, 'apikey': self.secret, 'zonename': domain, 'ttl': (ttl or DEFAULT_TTL)}
    params.update(extra)
    urn = schema.getchildren()[0]
    for child in urn:
        key = child.tag.split(':')[2]
        if (key in attributes):
            if isinstance(params.get(key), int):
                child.text = '%d'
            else:
                child.text = '%s'
    skel = ensure_string(tostring(schema))
    req_data = (skel % (self.key, self.secret, domain, extra.get('ns'), extra.get('mbox'), extra.get('refresh'), extra.get('retry'), extra.get('expire'), extra.get('minimum'), (ttl or DEFAULT_TTL), extra.get('xfer'), extra.get('update_acl')))
    action = '/services/dns/createZone.php?'
    params = {}
    headers = {'SOAPAction': 'urn:createZonewsdl#createZone'}
    try:
        self.connection.request(action=action, params=params, data=req_data, method='POST', headers=headers)
    except DurableDNSException:
        e = sys.exc_info()[1]
        if ('Zone    Already    Exist' in e.message):
            raise ZoneAlreadyExistsError(zone_id=domain, driver=self, value=e.message)
        raise e
    zone = self.get_zone(domain)
    return zone
