'**True** if we match against the given destination, **False** otherwise. If
the address or port is omitted then this will check if we\'re allowed to
exit to any instances of the defined address or port.
:param str address: IPv4 or IPv6 address (with or without brackets)
:param int port: port number
:param bool strict: if the address or port is excluded then check if we can
exit to **all** instances of the defined address or port
:returns: **bool** indicating if we match against this destination
:raises: **ValueError** if provided with a malformed address or port'

def is_match(self, address=None, port=None, strict=False):

    if (address is not None):
        address_type = self.get_address_type()
        if stem.util.connection.is_valid_ipv4_address(address):
            if (address_type == AddressType.IPv6):
                return False
        elif stem.util.connection.is_valid_ipv6_address(address, allow_brackets=True):
            if (address_type == AddressType.IPv4):
                return False
            address = address.lstrip('[').rstrip(']')
        else:
            raise ValueError(("'%s'    isn't    a    valid    IPv4    or    IPv6    address" % address))
    if ((port is not None) and (not stem.util.connection.is_valid_port(port))):
        raise ValueError(("'%s'    isn't    a    valid    port" % port))
    fuzzy_match = False
    if (not self.is_address_wildcard()):
        if (address is None):
            fuzzy_match = True
        else:
            comparison_addr_bin = int(stem.util.connection._get_address_binary(address), 2)
            comparison_addr_bin &= self._get_mask_bin()
            if (self._get_address_bin() != comparison_addr_bin):
                return False
    if (not self.is_port_wildcard()):
        if (port is None):
            fuzzy_match = True
        elif ((port < self.min_port) or (port > self.max_port)):
            return False
    if fuzzy_match:
        return (strict != self.is_accept)
    else:
        return True
