class_docstr: A transparent environment Wrapper that works with any manifestation of :class:`~maze.core.env.base_env.BaseEnv`.
  It is intended as drop-in replacement for gym.core.Wrapper.
  
  Gym Wrappers elegantly expose methods and attributes of all nested envs. However wrapping destroys the class
  hierarchy, querying the base classes is not straight-forward. This environment wrapper fixes the behaviour
  of isinstance() for arbitrarily nested wrappers.
  
  Suppose we want to check the base class:
  
      class MyGymWrapper(Wrapper[gym.Env]):
          ...
  
      # construct an env and wrap it
      env = MyEnv()
      env = MyGymWrapper(env)
  
      # this assertion fails
      assert isinstance(env, MyEnv) == True
  
  TypingWrapper makes `isinstance()` work as intuitively expected:
  
      # this time use MyWrapper, which is derived from this Wrapper class
      env = MyEnv()
      env = MyWrapper(env)
  
      # now the assertions hold
      assert isinstance(env, MyEnv) == True
      assert isinstance(env, MyWrapper) == True
  
  
  Note:
  
  gym.core.Wrapper assumes the existence of certain attributes (action_space, observation_space, reward_range,
  metadata) and duplicates these attributes. This behaviour is unnecessary, because __getattr__ makes these
  members of the inner environment transparently available anyway.
class_docstr_tok: ["A","transparent","environment","Wrapper","that","works","with","any","manifestation","of",":","class",":","`","~maze.core.env.base_env.BaseEnv","`",".","It","is","intended","as","drop-in","replacement","for","gym.core.Wrapper",".","Gym","Wrappers","elegantly","expose","methods","and","attributes","of","all","nested","envs",".","However","wrapping","destroys","the","class","hierarchy",",","querying","the","base","classes","is","not","straight-forward",".","This","environment","wrapper","fixes","the","behaviour","of","isinstance","(",")","for","arbitrarily","nested","wrappers",".","Suppose","we","want","to","check","the","base","class",":","class","MyGymWrapper","(","Wrapper","[","gym.Env","]",")",":","...","#","construct","an","env","and","wrap","it","env","=","MyEnv","(",")","env","=","MyGymWrapper","(","env",")","#","this","assertion","fails","assert","isinstance","(","env",",","MyEnv",")","==","True","TypingWrapper","makes","`","isinstance","(",")","`","work","as","intuitively","expected",":","#","this","time","use","MyWrapper",",","which","is","derived","from","this","Wrapper","class","env","=","MyEnv","(",")","env","=","MyWrapper","(","env",")","#","now","the","assertions","hold","assert","isinstance","(","env",",","MyEnv",")","==","True","assert","isinstance","(","env",",","MyWrapper",")","==","True","Note",":","gym.core.Wrapper","assumes","the","existence","of","certain","attributes","(","action_space",",","observation_space",",","reward_range",",","metadata",")","and","duplicates","these","attributes",".","This","behaviour","is","unnecessary",",","because","__getattr__","makes","these","members","of","the","inner","environment","transparently","available","anyway","."]
docstr: implementation of :class:`~maze.core.env.simulated_env_mixin.SimulatedEnvMixin`.
  
  Note: implementing this method is required for stateful environment wrappers.
code: def clone_from(self, env: EnvType) -> None:
      """implementation of :class:`~maze.core.env.simulated_env_mixin.SimulatedEnvMixin`.
  
      Note: implementing this method is required for stateful environment wrappers.
      """
      raise NotImplementedError
  
imports: from abc import abstractmethod, ABC
  from typing import Generator, TypeVar, Generic, Type, Union, Dict, Tuple, Any, Optional
  from maze.core.annotations import override
  from maze.core.env.action_conversion import ActionType
  from maze.core.env.base_env import BaseEnv
  from maze.core.env.environment_context import EnvironmentContext
  from maze.core.env.maze_action import MazeActionType
  from maze.core.env.maze_state import MazeStateType
  from maze.core.env.simulated_env_mixin import SimulatedEnvMixin
label_desc: Use image node_id 10 for calling the Wrapper obj's underlying member method code with example usage: obj.clone_from(env) without return types