def METHOD_NAME(
    context: 'Context', hook: ModelMetaclass
) -> (List[dict], List[dict], List[dict], List[dict]):
    """Unpack arguments (args/kwargs/flags/methods) from hook."""
    args = []
    kwargs = []
    flags = []
    methods = []
    # kwargs + flags
    for i in hook.__fields__['function_fields'].default.copy():
        # Consume the arg as what is left will be a method which will deal with later
        hook_field = hook.__fields__['function_dict'].default.pop(i)
        # Skip fields that have a `visible=False` field
        if isinstance(hook_field, ModelField):
            # Methods fields are of type ModelField
            # TODO: Determine this logic
            pass
        else:
            if 'visible' in hook_field and not hook_field['visible']:
                continue
        # Serialize help input
        if isinstance(hook_field, str):
            help_arg = HelpInput(
                name=i, type=type(hook_field).__name__, default=hook_field
            )
        elif isinstance(hook_field, dict):
            if 'type' not in hook_field:
                hook_field['type'] = "unknown"
            try:
                help_arg = HelpInput(name=i, **hook_field)
            except ValidationError as e:
                hook_name = hook.identifier.split('.')[-1]
                if hook_name == '':  # Default hook
                    hook_name = 'default hook'
                raise exceptions.MalformedFunctionFieldException(
                    f"The field '{i}' is malformed. Getting error=\n{e.__str__()}",
                    context=context,
                    function_name=hook_name,
                ) from None
        elif isinstance(hook_field, ModelField):
            # TODO: https://github.com/sudoblockio/tackle/issues/91
            # If enabling inheritance for base vars in to the help, then this will
            # neeed to be active.
            # help_arg = HelpInput(
            #     name=i,
            #     type=hook_field.type_.__name__,
            #     # description=hook_field.d  # TODO: Fix this
            # )
            continue
        else:
            raise NotImplementedError
        if help_arg.type == 'bool':
            flags.append(help_arg.dict())
        else:
            kwargs.append(help_arg.dict())
    # args
    for arg in hook.__fields__['args'].default:
        # Check kwargs
        arg_data = [i for i in kwargs if i['name'] == arg]
        if len(arg_data) == 1:
            arg_data = arg_data[0]
        else:
            # Check flags
            arg_data = [i for i in flags if i['name'] == arg]
            if len(arg_data) == 1:
                arg_data = arg_data[0]
            else:
                raise exceptions.MalformedFunctionFieldException(
                    "The args don't match a key word arg or flag.",
                    # TODO: Fix
                    function_name=hook.__fields__,
                    context=context,
                ) from None
        args.append(arg_data)
    # methods
    for k, v in hook.__fields__['function_dict'].default.items():
        if k.endswith('<-') and k not in ['exec', 'exec<-']:
            methods.append(
                HelpInput(
                    name=k[:-2],
                    type='method',
                    description=v['help'] if 'help' in v else None,
                ).dict()
            )
    return args, kwargs, flags, methods