REBOL [
    Title:      "Object Cloner"
    File:       %cloneobj.r
    Email:      timewarp@sirius.com
    Author:     "Erin A. Thomas"
    Date:       30-Jun-2000
    Purpose: {
        Clone objects recursively. This way the objects inside
        are copies instead of references.
    }
    Example: {
        new-object clone make existing-object []
    }
    Category: [util 3]
]

clone: func [
    "Clones all sub objects so there are no multiple references"
    o [object!] "The object to clone"
    /local wrd so
] [
    foreach wrd next first o [
        if object? so: get in o :wrd [(set in o :wrd make so []) (clone so)]
    ]
    return o
]