def observable_copy(value, name, instance):
    """Return an observable container for HasProperties notifications

    This method creates a new container class to allow HasProperties
    instances to :code:`observe_mutations`. It returns a copy of the
    input value as this new class.

    The output class behaves identically to the input value's original
    class, except when it is used as a property on a HasProperties
    instance. In that case, it notifies the HasProperties instance of
    any mutations or operations.
    """

    container_class = value.__class__
    if container_class in OBSERVABLE_REGISTRY:
        observable_class = OBSERVABLE_REGISTRY[container_class]
    elif container_class in OBSERVABLE_REGISTRY.values():
        observable_class = container_class
    else:
        observable_class = add_properties_callbacks(
            type(container_class)(
                str('Observable{}'.format(container_class.__name__)),
                (container_class,),
                MUTATOR_CATEGORIES,
            )
        )
        OBSERVABLE_REGISTRY[container_class] = observable_class
    value = observable_class(value)
    value._name = name
    value._instance = instance
    return value
Return an observable container for HasProperties notifications

    This method creates a new container class to allow HasProperties
    instances to :code:`observe_mutations`. It returns a copy of the
    input value as this new class.

    The output class behaves identically to the input value's original
    class, except when it is used as a property on a HasProperties
    instance. In that case, it notifies the HasProperties instance of
    any mutations or operations.