<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def define_constrained_subtype(prefix, base, blockednames, clsdict=None):
 """ Define a subtype which blocks a list of methods. @param prefix: The subtype name prefix. This is prepended to the base type name. This convention is baked in for API consistency. @param base: The base type to derive from. @param blockednames: A list of method name strings. All of these will be blocked. @param clsdict: None or a dict which will be modified to become the subtype class dict. @return: The new subtype. @raise: OverwriteError - If clsdict contains an entry in blockednames. """

    name = prefix + base.__name__

    clsdict = clsdict or {}

    doc = clsdict.get('__doc__', '')
    doc = 'An {} extension of {}.\n{}'.format(prefix, base.__name__, doc)
    clsdict['__doc__'] = doc

    setitem_without_overwrite(
        clsdict,
        'get_blocked_method_names',
        lambda self: iter(blockednames),
    )

    for bname in blockednames:
        setitem_without_overwrite(
            clsdict,
            bname,
            ConstraintError.block(getattr(base, bname)),
        )

    return type(name, (base,), clsdict)