<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_view(controller, context, data):
 # type: (Controller, Context, Any) -> Any """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 """

    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