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")
| [reply] [Watch: Dir/Any] |
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.) | [reply] [Watch: Dir/Any] [d/l] |
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();
/prakash | [reply] [Watch: Dir/Any] [d/l] |
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
-- Brovnik | [reply] [Watch: Dir/Any] [d/l] |
sub tiebless {
my %x;
tie %x,shift;
return bless \%x,shift;
}
| [reply] [Watch: Dir/Any] [d/l] |