# misc util functions
#

package Perlbal::Util;
use strict;
use warnings;
no  warnings qw(deprecated);

sub durl {
    my ($txt) = @_;
    $txt =~ tr/+/ /;
    $txt =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    return $txt;
}

=head2 C< rebless >

Safely re-bless a locked (use fields) hash into another package. Note
that for our convenience elsewhere the set of allowable keys for the
reblessed hash will be the union of the keys allowed by its old package
and those allowed for the package into which it is blessed.

=cut

BEGIN {
    if ($] >= 5.010) {
        eval q{
            use Hash::Util qw(legal_ref_keys unlock_ref_keys lock_ref_keys)
        };
        *rebless = sub {
            my ($obj, $pkg) = @_;
            my @keys = legal_ref_keys($obj);
            unlock_ref_keys($obj);
            bless $obj, $pkg;
            lock_ref_keys($obj, @keys,
                          legal_ref_keys(fields::new($pkg)));
            return $obj;
        };
    }
    else {
        *rebless = sub {
            my ($obj, $pkg) = @_;
            return bless $obj, $pkg;
        };
    }
}

1;

# Local Variables:
# mode: perl
# c-basic-indent: 4
# indent-tabs-mode: nil
# End:
