REBOL [
    Title: "Clone"
    Date: 3-Jul-2002
    Name: Clone
    Version: 1.0.0
    File: %Clone.r
    Author: "Andrew Martin"
    Purpose: "Clone objects by copying objects inside."
    Email: Al.Bri@xtra.co.nz
    Web: http://valley.150m.com
    Category: [util 4]
    Acknowledgements: "Erin A. Thomas"
    Example: [
    New_object: Clone Original_Object []
]
    Bug!: [
    Clone destroys 'bind information during copy/deep of block!s!!!!
]
]

Clone: function [
    {Clones all sub-objects and hashes, so there are no multiple references.}
    [catch]
    Object [object!] "The object to clone."
    Block [block!] "Extra code for this object."
    ][
    Cloned Member
    ][
    throw-on-error [
        Cloned: make Object Block
        foreach Word next first Object [
            Member: get in Cloned :Word
            if same? :Member get in Object :Word [
                set in Cloned :Word either object? :Member [
                    Clone :Member []
                    ][
                    either any [
                        series? :Member
                        port? :Member
                        bitset? :Member
                        ][
                        copy/deep :Member
                        ][
                        :Member
                        ]
                    ]
                ]
            ]
        Cloned
        ]
    ]