.\" Automatically generated by Pod::Man v1.34, Pod::Parser v1.13
.\" ========================================================================
.de Sh \" Subsection heading
.de Sp \" Vertical space (when we can't use .PP)
.de Vb \" Begin verbatim text
.de Ve \" End verbatim text
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. | will give a
.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
.\" expand to `' in nroff, nothing in troff, for use with C<>.
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
. tm Index:\\$1\t\\n%\t"\\$2"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. \" simple accents for nroff and troff
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
.\" ========================================================================
.IX Title "Tie::Memoize 3"
.TH Tie::Memoize 3 "2002-06-01" "perl v5.8.0" "Perl Programmers Reference Guide"
Tie::Memoize \- add data to hash when needed
\& tie %hash, 'Tie::Memoize',
\& \e&fetch, # The rest is optional
\& {%ini_value}, {%ini_existence};
This package allows a tied hash to autoload its values on the first access,
and to use the cached value on the following accesses.
Only read-accesses (via fetching the value or \f(CW\*(C`exists\*(C'\fR) result in calls to
the functions; the modify-accesses are performed as on a normal hash.
The required arguments during \f(CW\*(C`tie\*(C'\fR are the hash, the package, and
the reference to the \f(CW\*(C`FETCH\*(C'\fRing function. The optional arguments are
an arbitrary scalar \f(CW$data\fR, the reference to the \f(CW\*(C`EXISTS\*(C'\fR function,
and initial values of the hash and of the existence cache.
Both the \f(CW\*(C`FETCH\*(C'\fRing function and the \f(CW\*(C`EXISTS\*(C'\fR functions have the
same signature: the arguments are \f(CW\*(C`$key, $data\*(C'\fR; \f(CW$data\fR is the same
value as given as argument during \fItie()\fRing. Both functions should
return an empty list if the value does not exist. If \f(CW\*(C`EXISTS\*(C'\fR
function is different from the \f(CW\*(C`FETCH\*(C'\fRing function, it should return
a \s-1TRUE\s0 value on success. The \f(CW\*(C`FETCH\*(C'\fRing function should return the
intended value if the key is valid.
.SH "Inheriting from \fBTie::Memoize\fP"
.IX Header "Inheriting from Tie::Memoize"
The structure of the \fItied()\fR data is an array reference with elements
\& 0: cache of known values
\& 1: cache of known existence of keys
The rest is for internal usage of this package. In particular, if
\&\s-1TIEHASH\s0 is overwritten, it should call \s-1SUPER::TIEHASH\s0.
\& my ($key, $dir) = shift;
\& open my $h, '<', "$dir/$key" or return;
\& local $/; <$h> # slurp it all
\& sub exists { my ($key, $dir) = shift; return -f "$dir/$key" }
\& tie %hash, 'Tie::Memoize', \e&slurp, $directory, \e&exists,
\& { fake_file1 => $content1, fake_file2 => $content2 },
\& { pretend_does_not_exists => 0, known_to_exist => 1 };
This example treats the slightly modified contents of \f(CW$directory\fR as a
hash. The modifications are that the keys \fIfake_file1\fR and
\&\fIfake_file2\fR fetch values \f(CW$content1\fR and \f(CW$content2\fR, and
\&\fIpretend_does_not_exists\fR will never be accessed. Additionally, the
existence of \fIknown_to_exist\fR is never checked (so if it does not
exists when its content is needed, the user of \f(CW%hash\fR may be confused).
\&\s-1FIRSTKEY\s0 and \s-1NEXTKEY\s0 methods go through the keys which were already read,
not all the possible keys of the hash.
Ilya Zakharevich <mailto:perl\-module\-hash\-memoize@ilyaz.org>.