code: def make_view(controller, context, data):
      # type: (Controller, Context, Any) -> Any
      
      if isinstance(data, BlockModel):
          # Make an Block View
          view = _make_view_subclass(Block, controller, context, data)
      elif isinstance(data, AttributeModel):
          # Make an Attribute View
          view = Attribute(controller, context, data)
      elif isinstance(data, MethodModel):
          # Make a Method View
          view = Method(controller, context, data)
      elif isinstance(data, Model):
          # Make a generic View
          view = _make_view_subclass(View, controller, context, data)
      elif isinstance(data, dict):
          # Make a dict of Views
          d = OrderedDict()
          for k, v in data.items():
              d[k] = make_view(controller, context, v)
          view = d
      elif isinstance(data, list):
          # Need to recurse down
          view = [make_view(controller, context, x) for x in data]
      else:
          # Just return the data unwrapped as it should be immutable
          view = data
      return view
docs: Make a View subclass containing properties specific for given data
  
      Args:
          controller (Controller): The child controller that hosts the data
          context (Context): The context the parent has made that the View should
              use for manipulating the data
          data (Model): The actual data that context will be manipulating
  
      Returns:
          View: A View subclass instance that provides a user-focused API to
              the given data