REBOL [
    Title: "Pack"
    Date: 3-Jul-2002
    Name: Pack
    Version: 1.0.0
    File: %Pack.r
    Author: "Andrew Martin"
    Purpose: "Self-extracting file packer & unpacker."
    Email: Al.Bri@xtra.co.nz
    Web: http://valley.150m.com
    Category: [util compress 5]
]

make object! [
    Unpacker: [
        Rebol [
            Name: 'Unpacker
            Title: "Self-extracting file unpacker."
            Date: (now)
            ]
        Unpack: func [Pack [block!]][
            parse Pack [
                any [
                    set File file! set Data binary! (
                        make paren! [write/binary File decompress Data]
                        )
                    | set File file! (
                        make paren! [make-dir/deep File]
                        )
                    ]
                end
                ]
            ]
        Unpack  ; 'Case goes here.
        ]
    Pack-Directory: function [Directory [file!]][Files Case][
        Files: recursive-read Directory
        Case: make block! 1 + (2 * length? Files)
        append Case Directory
        foreach File Files [
            append Case Directory/:File
            if not dir? Directory/:File [
                append Case compress read/binary Directory/:File
                ]
            ]
        Case
        ]
    set 'Pack func [File [file!]][
        append/only compose/deep Unpacker either dir? File [
            Pack-Directory File
            ][
            reduce [File compress read/binary File]
            ]
        ]
    ]