On 4/8/06, Nick Ing-Simmons <[EMAIL PROTECTED]> wrote:
>
> Ok, just checking that you didn't need access to VARIABLE for your
> "state" case to work.

no.  State variable as tied is vastly inferior to externally scoped and
initialized native variable, but the package for it would look something like

package TiedState;

my %value;

sub TIESCALAR{
      my ($pack, $initializer) = @_;
      my @callerdata = caller;
      exists [EMAIL PROTECTED]
           or [EMAIL PROTECTED] = $initializer;
      bless \(join $;, @callerdata);
};

sub FETCH{
      return $value{${$_[0]}}
};

sub STORE{
      $value{${$_[0]}} = $_[1];
};

sub clear{
      delete $value{${$_[0]}};
};

__END__

=pod

tie a state variable like

   sub some_routine_with_state{
            tie my $statevar => TiedState => 'red';
            ...
   };

and the first time it is seen it gets assigned the initializer value,
after that it works like a normal scalar variable.  important:
each TiedState definition needs to be on its own line of code
due to the details of the implementation.

To clear a state variable so it will be reinitialized the next time
it gets tied, call the C<clear> method on the underlying reference:

      tied($statevar)->clear;

This package is a demonstration of how to implement a state variable
using perltie.  For production use, it is reccommended to prefer
an "externally initialized lexical" like so:

   { my $statevar = 'red';
   sub some_routine_with_state{
            ...
   };
   }; # closes lexical scope for $statevar

I don't indent for scopes that are provided for variable visibility
restrictions only,
so I always put the declarations on the same line with their opening brace and
comment their closing brace.

=cut

------- end of file ------

Would anyone want this on CPAN? And if so what should it be named?

--
David L Nicol
Should the bike shed have bunks?  Or maybe cots?

Reply via email to