public function equals( $value, bool $strict = false ) : bool
   {

      if ( null === $value )
      {
         return false;
      }

      if ( $value instanceof MailAddress )
      {
         return
            ( $value->_userPart === $this->_userPart )
            &&
            ( ( (string) $value->_domainPart ) === ( (string) $this->_domainPart ) );
      }

      if ( $strict )
      {
         return false;
      }

      $val = null;

      if ( \is_string( $value ) )
      {
         if ( false !== ( $val = MailAddress::Parse( $value ) ) )
         {
            return
               ( $val->_userPart === $this->_userPart )
               &&
               ( ( (string) $val->_domainPart ) === ( (string) $this->_domainPart ) );
         }
         return false;
      }

      if ( $value instanceof Domain )
      {
         return ( ( (string) $value ) === ( (string) $this->_domainPart ) );
      }

      try
      {
         $typeInfo = new Type( $value );
         if ( ! $typeInfo->hasAssociatedString() )
         {
            return false;
         }
      }
      catch ( \Throwable $ex ) { unset ( $ex ); return false; }

      if ( false === ( $val = MailAddress::Parse( $typeInfo->getStringValue(), false, false, true ) ) )
      {
         return false;
      }

      return
         ( $val->_userPart === $this->_userPart )
         &&
         ( ( (string) $val->_domainPart ) === ( (string) $this->_domainPart ) );

   }