Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Object and tied hash all at once?

by rrwo (Friar)
on Jul 06, 2001 at 23:46 UTC ( [id://94578]=perlquestion: print w/replies, xml ) Need Help??

rrwo has asked for the wisdom of the Perl Monks concerning the following question:

Here's a stumper: is it possible for a variable to be an object and a tied hash (or even array etc.) all at once? For example...

tie my %$hash, Class::Whatever; $hash->{foo} = "bar"; $hash->SomeMethod();

or maybe

my $obj = new Class::Whatever; $obj->{foo} = "bar"; $obj->SomeMethod();

Has this been done before? Could it be done (perhaps twiddling with attributes to say that the object is tied)?

Replies are listed 'Best First'.
(tye)Re: Object and tied hash all at once?
by tye (Sage) on Jul 07, 2001 at 01:39 UTC

    Having done a lot with this in Win32::TieRegistry, I'd advice you to use separate classes for the tied hash and the object. So, for example, have a class My::Module::Hash which is what you tie the hashes to. Then just bless a reference to such a tied hash into the My::Module class.

    You don't strictly have to do it this way, but it removes so much confusion that it is well worth it. Win32::TieRegistry uses the same class for each. It works pretty well but most methods have to check whether they are being called from a blessed ref to a tied hash or directly via an object. The worst case is DESTROY which gets called twice per object because of this and the way that "global destruction" works in current versions of Perl makes it complex to tell what is going on in some cases.

    Perl even supports "self-tied" things, but those get very confusing and more than once this support has been broken such that simple things become infinite loops. So I say avoid that.

            - tye (but my friends call me "Tye")
Re: Object and tied hash all at once?
by btrott (Parson) on Jul 07, 2001 at 00:54 UTC
    Yes, this is possible. Tie::SecureHash is an example of a class that does this.

    In order to get the object and tied hash interface all at once, though, you have to be slightly tricky, and you need to create your object using the object constructor interface, not the tie interface:

    sub new { my $class = shift; tie my %self, $class; bless \%self, $class; }
    That returns a reference to the tied hash, which is also an object that is blessed into $class, which means that you can either use it as a tied hash, *or* call methods on it.

    (NOTE: In the above example, the object is blessed into the tie class, but this is not required.)

Re: Object and tied hash all at once?
by PrakashK (Pilgrim) on Jul 07, 2001 at 00:18 UTC
    Perhaps you already know this, but is 'tied' function what you are looking for?
    tie my %$hash, Class::Whatever; # access the object as hash $hash->{foo} = "bar"; # access the tied object directly tied($hash)->SomeMethod();
Re: Object and tied hash all at once?
by Brovnik (Hermit) on Jul 07, 2001 at 00:43 UTC
    Do you have access to (i.e. are you writing) Class::Whatever ?

    If so, define Class::Whatever as a subclass of Tie::StdHash,

    package Class:whatever; @ISA = (Tie::StdHash)
    you can use the hash capabilities plus whatever else you add to the new class, including e.g. methods.

    Tie::StdHash is part of Tie::Hash

Re: Object and tied hash all at once?
by Anonymous Monk on Jul 07, 2001 at 00:05 UTC
    Try this code
    sub tiebless { my %x; tie %x,shift; return bless \%x,shift; }

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://94578]
Approved by root
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (3)
As of 2024-07-22 10:40 GMT
Find Nodes?
    Voting Booth?

    No recent polls found

    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.