bpo-44353: Refactor typing.NewType into callable class (GH-27250) (#27258)

(cherry picked from commit 965dd76e9060e27e2253ba8c8d21a142b178720d)

Co-authored-by: Yurii Karabas <1998uriyyo@gmail.com>
diff --git a/Lib/typing.py b/Lib/typing.py
index cb70394..1606de9 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1373,6 +1373,12 @@ def _no_init(self, *args, **kwargs):
     if type(self)._is_protocol:
         raise TypeError('Protocols cannot be instantiated')
 
+def _callee(depth=2, default=None):
+    try:
+        return sys._getframe(depth).f_globals['__name__']
+    except (AttributeError, ValueError):  # For platforms without _getframe()
+        return default
+
 
 def _allow_reckless_class_checks(depth=3):
     """Allow instance and class checks for special stdlib modules.
@@ -2349,7 +2355,7 @@ class body be required.
 TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
 
 
-def NewType(name, tp):
+class NewType:
     """NewType creates simple unique types with almost zero
     runtime overhead. NewType(name, tp) is considered a subtype of tp
     by static type checkers. At runtime, NewType(name, tp) returns
@@ -2368,12 +2374,23 @@ def name_by_id(user_id: UserId) -> str:
         num = UserId(5) + 1     # type: int
     """
 
-    def new_type(x):
+    def __init__(self, name, tp):
+        self.__name__ = name
+        self.__qualname__ = name
+        self.__module__ = _callee(default='typing')
+        self.__supertype__ = tp
+
+    def __repr__(self):
+        return f'{self.__module__}.{self.__qualname__}'
+
+    def __call__(self, x):
         return x
 
-    new_type.__name__ = name
-    new_type.__supertype__ = tp
-    return new_type
+    def __or__(self, other):
+        return Union[self, other]
+
+    def __ror__(self, other):
+        return Union[other, self]
 
 
 # Python-version-specific alias (Python 2: unicode; Python 3: str)