This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Document offset hack
[perl5.git] / pod / perltie.pod
CommitLineData
cb1a09d0
AD
1=head1 NAME
2
3perltie - how to hide an object class in a simple variable
4
5=head1 SYNOPSIS
6
7 tie VARIABLE, CLASSNAME, LIST
8
6fdf61fb 9 $object = tied VARIABLE
10
cb1a09d0
AD
11 untie VARIABLE
12
13=head1 DESCRIPTION
14
15Prior to release 5.0 of Perl, a programmer could use dbmopen()
5f05dabc 16to connect an on-disk database in the standard Unix dbm(3x)
17format magically to a %HASH in their program. However, their Perl was either
cb1a09d0
AD
18built with one particular dbm library or another, but not both, and
19you couldn't extend this mechanism to other packages or types of variables.
20
21Now you can.
22
23The tie() function binds a variable to a class (package) that will provide
24the implementation for access methods for that variable. Once this magic
25has been performed, accessing a tied variable automatically triggers
5a964f20 26method calls in the proper class. The complexity of the class is
cb1a09d0
AD
27hidden behind magic methods calls. The method names are in ALL CAPS,
28which is a convention that Perl uses to indicate that they're called
29implicitly rather than explicitly--just like the BEGIN() and END()
30functions.
31
32In the tie() call, C<VARIABLE> is the name of the variable to be
33enchanted. C<CLASSNAME> is the name of a class implementing objects of
34the correct type. Any additional arguments in the C<LIST> are passed to
35the appropriate constructor method for that class--meaning TIESCALAR(),
5f05dabc 36TIEARRAY(), TIEHASH(), or TIEHANDLE(). (Typically these are arguments
a7adf1f0 37such as might be passed to the dbminit() function of C.) The object
38returned by the "new" method is also returned by the tie() function,
39which would be useful if you wanted to access other methods in
40C<CLASSNAME>. (You don't actually have to return a reference to a right
5f05dabc 41"type" (e.g., HASH or C<CLASSNAME>) so long as it's a properly blessed
a7adf1f0 42object.) You can also retrieve a reference to the underlying object
43using the tied() function.
cb1a09d0
AD
44
45Unlike dbmopen(), the tie() function will not C<use> or C<require> a module
46for you--you need to do that explicitly yourself.
47
48=head2 Tying Scalars
49
50A class implementing a tied scalar should define the following methods:
301e8125 51TIESCALAR, FETCH, STORE, and possibly UNTIE and/or DESTROY.
cb1a09d0
AD
52
53Let's look at each in turn, using as an example a tie class for
54scalars that allows the user to do something like:
55
56 tie $his_speed, 'Nice', getppid();
57 tie $my_speed, 'Nice', $$;
58
59And now whenever either of those variables is accessed, its current
60system priority is retrieved and returned. If those variables are set,
61then the process's priority is changed!
62
5aabfad6 63We'll use Jarkko Hietaniemi <F<jhi@iki.fi>>'s BSD::Resource class (not
64included) to access the PRIO_PROCESS, PRIO_MIN, and PRIO_MAX constants
65from your system, as well as the getpriority() and setpriority() system
66calls. Here's the preamble of the class.
cb1a09d0
AD
67
68 package Nice;
69 use Carp;
70 use BSD::Resource;
71 use strict;
72 $Nice::DEBUG = 0 unless defined $Nice::DEBUG;
73
74=over
75
76=item TIESCALAR classname, LIST
77
78This is the constructor for the class. That means it is
79expected to return a blessed reference to a new scalar
80(probably anonymous) that it's creating. For example:
81
82 sub TIESCALAR {
83 my $class = shift;
84 my $pid = shift || $$; # 0 means me
85
86 if ($pid !~ /^\d+$/) {
6fdf61fb 87 carp "Nice::Tie::Scalar got non-numeric pid $pid" if $^W;
cb1a09d0
AD
88 return undef;
89 }
90
91 unless (kill 0, $pid) { # EPERM or ERSCH, no doubt
6fdf61fb 92 carp "Nice::Tie::Scalar got bad pid $pid: $!" if $^W;
cb1a09d0
AD
93 return undef;
94 }
95
96 return bless \$pid, $class;
97 }
98
99This tie class has chosen to return an error rather than raising an
100exception if its constructor should fail. While this is how dbmopen() works,
101other classes may well not wish to be so forgiving. It checks the global
102variable C<$^W> to see whether to emit a bit of noise anyway.
103
104=item FETCH this
105
106This method will be triggered every time the tied variable is accessed
107(read). It takes no arguments beyond its self reference, which is the
5f05dabc 108object representing the scalar we're dealing with. Because in this case
109we're using just a SCALAR ref for the tied scalar object, a simple $$self
cb1a09d0
AD
110allows the method to get at the real value stored there. In our example
111below, that real value is the process ID to which we've tied our variable.
112
113 sub FETCH {
114 my $self = shift;
115 confess "wrong type" unless ref $self;
116 croak "usage error" if @_;
117 my $nicety;
118 local($!) = 0;
119 $nicety = getpriority(PRIO_PROCESS, $$self);
120 if ($!) { croak "getpriority failed: $!" }
121 return $nicety;
122 }
123
124This time we've decided to blow up (raise an exception) if the renice
125fails--there's no place for us to return an error otherwise, and it's
126probably the right thing to do.
127
128=item STORE this, value
129
130This method will be triggered every time the tied variable is set
131(assigned). Beyond its self reference, it also expects one (and only one)
132argument--the new value the user is trying to assign.
133
134 sub STORE {
135 my $self = shift;
136 confess "wrong type" unless ref $self;
137 my $new_nicety = shift;
138 croak "usage error" if @_;
139
140 if ($new_nicety < PRIO_MIN) {
141 carp sprintf
142 "WARNING: priority %d less than minimum system priority %d",
143 $new_nicety, PRIO_MIN if $^W;
144 $new_nicety = PRIO_MIN;
145 }
146
147 if ($new_nicety > PRIO_MAX) {
148 carp sprintf
149 "WARNING: priority %d greater than maximum system priority %d",
150 $new_nicety, PRIO_MAX if $^W;
151 $new_nicety = PRIO_MAX;
152 }
153
154 unless (defined setpriority(PRIO_PROCESS, $$self, $new_nicety)) {
155 confess "setpriority failed: $!";
156 }
157 return $new_nicety;
158 }
159
301e8125
NIS
160=item UNTIE this
161
162This method will be triggered when the C<untie> occurs. This can be useful
163if the class needs to know when no further calls will be made. (Except DESTROY
164of course.) See below for more details.
165
cb1a09d0
AD
166=item DESTROY this
167
168This method will be triggered when the tied variable needs to be destructed.
5f05dabc 169As with other object classes, such a method is seldom necessary, because Perl
cb1a09d0
AD
170deallocates its moribund object's memory for you automatically--this isn't
171C++, you know. We'll use a DESTROY method here for debugging purposes only.
172
173 sub DESTROY {
174 my $self = shift;
175 confess "wrong type" unless ref $self;
176 carp "[ Nice::DESTROY pid $$self ]" if $Nice::DEBUG;
177 }
178
179=back
180
181That's about all there is to it. Actually, it's more than all there
5f05dabc 182is to it, because we've done a few nice things here for the sake
cb1a09d0
AD
183of completeness, robustness, and general aesthetics. Simpler
184TIESCALAR classes are certainly possible.
185
186=head2 Tying Arrays
187
188A class implementing a tied ordinary array should define the following
301e8125 189methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps UNTIE and/or DESTROY.
cb1a09d0 190
a60c0954
NIS
191FETCHSIZE and STORESIZE are used to provide C<$#array> and
192equivalent C<scalar(@array)> access.
c47ff5f1 193
01020589
GS
194The methods POP, PUSH, SHIFT, UNSHIFT, SPLICE, DELETE, and EXISTS are
195required if the perl operator with the corresponding (but lowercase) name
196is to operate on the tied array. The B<Tie::Array> class can be used as a
197base class to implement the first five of these in terms of the basic
198methods above. The default implementations of DELETE and EXISTS in
199B<Tie::Array> simply C<croak>.
a60c0954 200
301e8125 201In addition EXTEND will be called when perl would have pre-extended
a60c0954
NIS
202allocation in a real array.
203
204This means that tied arrays are now I<complete>. The example below needs
205upgrading to illustrate this. (The documentation in B<Tie::Array> is more
206complete.)
cb1a09d0
AD
207
208For this discussion, we'll implement an array whose indices are fixed at
209its creation. If you try to access anything beyond those bounds, you'll
a60c0954 210take an exception. For example:
cb1a09d0
AD
211
212 require Bounded_Array;
1f57c600 213 tie @ary, 'Bounded_Array', 2;
cb1a09d0
AD
214 $| = 1;
215 for $i (0 .. 10) {
216 print "setting index $i: ";
217 $ary[$i] = 10 * $i;
218 $ary[$i] = 10 * $i;
219 print "value of elt $i now $ary[$i]\n";
220 }
221
222The preamble code for the class is as follows:
223
224 package Bounded_Array;
225 use Carp;
226 use strict;
227
228=over
229
230=item TIEARRAY classname, LIST
231
232This is the constructor for the class. That means it is expected to
233return a blessed reference through which the new array (probably an
234anonymous ARRAY ref) will be accessed.
235
236In our example, just to show you that you don't I<really> have to return an
237ARRAY reference, we'll choose a HASH reference to represent our object.
238A HASH works out well as a generic record type: the C<{BOUND}> field will
03dc9dad 239store the maximum bound allowed, and the C<{ARRAY}> field will hold the
cb1a09d0
AD
240true ARRAY ref. If someone outside the class tries to dereference the
241object returned (doubtless thinking it an ARRAY ref), they'll blow up.
242This just goes to show you that you should respect an object's privacy.
243
244 sub TIEARRAY {
245 my $class = shift;
246 my $bound = shift;
247 confess "usage: tie(\@ary, 'Bounded_Array', max_subscript)"
248 if @_ || $bound =~ /\D/;
249 return bless {
250 BOUND => $bound,
251 ARRAY => [],
252 }, $class;
253 }
254
255=item FETCH this, index
256
257This method will be triggered every time an individual element the tied array
258is accessed (read). It takes one argument beyond its self reference: the
259index whose value we're trying to fetch.
260
261 sub FETCH {
262 my($self,$idx) = @_;
263 if ($idx > $self->{BOUND}) {
264 confess "Array OOB: $idx > $self->{BOUND}";
265 }
266 return $self->{ARRAY}[$idx];
267 }
268
301e8125 269If a negative array index is used to read from an array, the index
0b931be4 270will be translated to a positive one internally by calling FETCHSIZE
301e8125
NIS
271before being passed to FETCH.
272
cb1a09d0
AD
273As you may have noticed, the name of the FETCH method (et al.) is the same
274for all accesses, even though the constructors differ in names (TIESCALAR
275vs TIEARRAY). While in theory you could have the same class servicing
276several tied types, in practice this becomes cumbersome, and it's easiest
5f05dabc 277to keep them at simply one tie type per class.
cb1a09d0
AD
278
279=item STORE this, index, value
280
281This method will be triggered every time an element in the tied array is set
282(written). It takes two arguments beyond its self reference: the index at
283which we're trying to store something and the value we're trying to put
284there. For example:
285
286 sub STORE {
287 my($self, $idx, $value) = @_;
288 print "[STORE $value at $idx]\n" if _debug;
289 if ($idx > $self->{BOUND} ) {
290 confess "Array OOB: $idx > $self->{BOUND}";
291 }
292 return $self->{ARRAY}[$idx] = $value;
293 }
301e8125
NIS
294
295Negative indexes are treated the same as with FETCH.
296
297=item UNTIE this
298
299Will be called when C<untie> happens. (See below.)
cb1a09d0
AD
300
301=item DESTROY this
302
303This method will be triggered when the tied variable needs to be destructed.
184e9718 304As with the scalar tie class, this is almost never needed in a
cb1a09d0
AD
305language that does its own garbage collection, so this time we'll
306just leave it out.
307
308=back
309
310The code we presented at the top of the tied array class accesses many
311elements of the array, far more than we've set the bounds to. Therefore,
312it will blow up once they try to access beyond the 2nd element of @ary, as
313the following output demonstrates:
314
315 setting index 0: value of elt 0 now 0
316 setting index 1: value of elt 1 now 10
317 setting index 2: value of elt 2 now 20
318 setting index 3: Array OOB: 3 > 2 at Bounded_Array.pm line 39
319 Bounded_Array::FETCH called at testba line 12
320
321=head2 Tying Hashes
322
be3174d2
GS
323Hashes were the first Perl data type to be tied (see dbmopen()). A class
324implementing a tied hash should define the following methods: TIEHASH is
325the constructor. FETCH and STORE access the key and value pairs. EXISTS
326reports whether a key is present in the hash, and DELETE deletes one.
327CLEAR empties the hash by deleting all the key and value pairs. FIRSTKEY
328and NEXTKEY implement the keys() and each() functions to iterate over all
301e8125
NIS
329the keys. UNTIE is called when C<untie> happens, and DESTROY is called when
330the tied variable is garbage collected.
aa689395 331
332If this seems like a lot, then feel free to inherit from merely the
333standard Tie::Hash module for most of your methods, redefining only the
334interesting ones. See L<Tie::Hash> for details.
cb1a09d0
AD
335
336Remember that Perl distinguishes between a key not existing in the hash,
337and the key existing in the hash but having a corresponding value of
338C<undef>. The two possibilities can be tested with the C<exists()> and
339C<defined()> functions.
340
341Here's an example of a somewhat interesting tied hash class: it gives you
5f05dabc 342a hash representing a particular user's dot files. You index into the hash
343with the name of the file (minus the dot) and you get back that dot file's
cb1a09d0
AD
344contents. For example:
345
346 use DotFiles;
1f57c600 347 tie %dot, 'DotFiles';
cb1a09d0
AD
348 if ( $dot{profile} =~ /MANPATH/ ||
349 $dot{login} =~ /MANPATH/ ||
350 $dot{cshrc} =~ /MANPATH/ )
351 {
5f05dabc 352 print "you seem to set your MANPATH\n";
cb1a09d0
AD
353 }
354
355Or here's another sample of using our tied class:
356
1f57c600 357 tie %him, 'DotFiles', 'daemon';
cb1a09d0
AD
358 foreach $f ( keys %him ) {
359 printf "daemon dot file %s is size %d\n",
360 $f, length $him{$f};
361 }
362
363In our tied hash DotFiles example, we use a regular
364hash for the object containing several important
365fields, of which only the C<{LIST}> field will be what the
366user thinks of as the real hash.
367
368=over 5
369
370=item USER
371
372whose dot files this object represents
373
374=item HOME
375
5f05dabc 376where those dot files live
cb1a09d0
AD
377
378=item CLOBBER
379
380whether we should try to change or remove those dot files
381
382=item LIST
383
5f05dabc 384the hash of dot file names and content mappings
cb1a09d0
AD
385
386=back
387
388Here's the start of F<Dotfiles.pm>:
389
390 package DotFiles;
391 use Carp;
392 sub whowasi { (caller(1))[3] . '()' }
393 my $DEBUG = 0;
394 sub debug { $DEBUG = @_ ? shift : 1 }
395
5f05dabc 396For our example, we want to be able to emit debugging info to help in tracing
cb1a09d0
AD
397during development. We keep also one convenience function around
398internally to help print out warnings; whowasi() returns the function name
399that calls it.
400
401Here are the methods for the DotFiles tied hash.
402
403=over
404
405=item TIEHASH classname, LIST
406
407This is the constructor for the class. That means it is expected to
408return a blessed reference through which the new object (probably but not
409necessarily an anonymous hash) will be accessed.
410
411Here's the constructor:
412
413 sub TIEHASH {
414 my $self = shift;
415 my $user = shift || $>;
416 my $dotdir = shift || '';
417 croak "usage: @{[&whowasi]} [USER [DOTDIR]]" if @_;
418 $user = getpwuid($user) if $user =~ /^\d+$/;
419 my $dir = (getpwnam($user))[7]
420 || croak "@{[&whowasi]}: no user $user";
421 $dir .= "/$dotdir" if $dotdir;
422
423 my $node = {
424 USER => $user,
425 HOME => $dir,
426 LIST => {},
427 CLOBBER => 0,
428 };
429
430 opendir(DIR, $dir)
431 || croak "@{[&whowasi]}: can't opendir $dir: $!";
432 foreach $dot ( grep /^\./ && -f "$dir/$_", readdir(DIR)) {
433 $dot =~ s/^\.//;
434 $node->{LIST}{$dot} = undef;
435 }
436 closedir DIR;
437 return bless $node, $self;
438 }
439
440It's probably worth mentioning that if you're going to filetest the
441return values out of a readdir, you'd better prepend the directory
5f05dabc 442in question. Otherwise, because we didn't chdir() there, it would
2ae324a7 443have been testing the wrong file.
cb1a09d0
AD
444
445=item FETCH this, key
446
447This method will be triggered every time an element in the tied hash is
448accessed (read). It takes one argument beyond its self reference: the key
449whose value we're trying to fetch.
450
451Here's the fetch for our DotFiles example.
452
453 sub FETCH {
454 carp &whowasi if $DEBUG;
455 my $self = shift;
456 my $dot = shift;
457 my $dir = $self->{HOME};
458 my $file = "$dir/.$dot";
459
460 unless (exists $self->{LIST}->{$dot} || -f $file) {
461 carp "@{[&whowasi]}: no $dot file" if $DEBUG;
462 return undef;
463 }
464
465 if (defined $self->{LIST}->{$dot}) {
466 return $self->{LIST}->{$dot};
467 } else {
468 return $self->{LIST}->{$dot} = `cat $dir/.$dot`;
469 }
470 }
471
472It was easy to write by having it call the Unix cat(1) command, but it
473would probably be more portable to open the file manually (and somewhat
5f05dabc 474more efficient). Of course, because dot files are a Unixy concept, we're
cb1a09d0
AD
475not that concerned.
476
477=item STORE this, key, value
478
479This method will be triggered every time an element in the tied hash is set
480(written). It takes two arguments beyond its self reference: the index at
481which we're trying to store something, and the value we're trying to put
482there.
483
484Here in our DotFiles example, we'll be careful not to let
485them try to overwrite the file unless they've called the clobber()
486method on the original object reference returned by tie().
487
488 sub STORE {
489 carp &whowasi if $DEBUG;
490 my $self = shift;
491 my $dot = shift;
492 my $value = shift;
493 my $file = $self->{HOME} . "/.$dot";
494 my $user = $self->{USER};
495
496 croak "@{[&whowasi]}: $file not clobberable"
497 unless $self->{CLOBBER};
498
499 open(F, "> $file") || croak "can't open $file: $!";
500 print F $value;
501 close(F);
502 }
503
504If they wanted to clobber something, they might say:
505
506 $ob = tie %daemon_dots, 'daemon';
507 $ob->clobber(1);
508 $daemon_dots{signature} = "A true daemon\n";
509
6fdf61fb 510Another way to lay hands on a reference to the underlying object is to
511use the tied() function, so they might alternately have set clobber
512using:
513
514 tie %daemon_dots, 'daemon';
515 tied(%daemon_dots)->clobber(1);
516
517The clobber method is simply:
cb1a09d0
AD
518
519 sub clobber {
520 my $self = shift;
521 $self->{CLOBBER} = @_ ? shift : 1;
522 }
523
524=item DELETE this, key
525
526This method is triggered when we remove an element from the hash,
527typically by using the delete() function. Again, we'll
528be careful to check whether they really want to clobber files.
529
530 sub DELETE {
531 carp &whowasi if $DEBUG;
532
533 my $self = shift;
534 my $dot = shift;
535 my $file = $self->{HOME} . "/.$dot";
536 croak "@{[&whowasi]}: won't remove file $file"
537 unless $self->{CLOBBER};
538 delete $self->{LIST}->{$dot};
1f57c600 539 my $success = unlink($file);
540 carp "@{[&whowasi]}: can't unlink $file: $!" unless $success;
541 $success;
cb1a09d0
AD
542 }
543
1f57c600 544The value returned by DELETE becomes the return value of the call
545to delete(). If you want to emulate the normal behavior of delete(),
546you should return whatever FETCH would have returned for this key.
547In this example, we have chosen instead to return a value which tells
548the caller whether the file was successfully deleted.
549
cb1a09d0
AD
550=item CLEAR this
551
552This method is triggered when the whole hash is to be cleared, usually by
553assigning the empty list to it.
554
5f05dabc 555In our example, that would remove all the user's dot files! It's such a
cb1a09d0
AD
556dangerous thing that they'll have to set CLOBBER to something higher than
5571 to make it happen.
558
559 sub CLEAR {
560 carp &whowasi if $DEBUG;
561 my $self = shift;
5f05dabc 562 croak "@{[&whowasi]}: won't remove all dot files for $self->{USER}"
cb1a09d0
AD
563 unless $self->{CLOBBER} > 1;
564 my $dot;
565 foreach $dot ( keys %{$self->{LIST}}) {
566 $self->DELETE($dot);
567 }
568 }
569
570=item EXISTS this, key
571
572This method is triggered when the user uses the exists() function
573on a particular hash. In our example, we'll look at the C<{LIST}>
574hash element for this:
575
576 sub EXISTS {
577 carp &whowasi if $DEBUG;
578 my $self = shift;
579 my $dot = shift;
580 return exists $self->{LIST}->{$dot};
581 }
582
583=item FIRSTKEY this
584
585This method will be triggered when the user is going
586to iterate through the hash, such as via a keys() or each()
587call.
588
589 sub FIRSTKEY {
590 carp &whowasi if $DEBUG;
591 my $self = shift;
6fdf61fb 592 my $a = keys %{$self->{LIST}}; # reset each() iterator
cb1a09d0
AD
593 each %{$self->{LIST}}
594 }
595
596=item NEXTKEY this, lastkey
597
598This method gets triggered during a keys() or each() iteration. It has a
599second argument which is the last key that had been accessed. This is
600useful if you're carrying about ordering or calling the iterator from more
601than one sequence, or not really storing things in a hash anywhere.
602
5f05dabc 603For our example, we're using a real hash so we'll do just the simple
604thing, but we'll have to go through the LIST field indirectly.
cb1a09d0
AD
605
606 sub NEXTKEY {
607 carp &whowasi if $DEBUG;
608 my $self = shift;
609 return each %{ $self->{LIST} }
610 }
611
301e8125
NIS
612=item UNTIE this
613
614This is called when C<untie> occurs.
615
cb1a09d0
AD
616=item DESTROY this
617
618This method is triggered when a tied hash is about to go out of
619scope. You don't really need it unless you're trying to add debugging
620or have auxiliary state to clean up. Here's a very simple function:
621
622 sub DESTROY {
623 carp &whowasi if $DEBUG;
624 }
625
626=back
627
1d2dff63
GS
628Note that functions such as keys() and values() may return huge lists
629when used on large objects, like DBM files. You may prefer to use the
630each() function to iterate over such. Example:
cb1a09d0
AD
631
632 # print out history file offsets
633 use NDBM_File;
1f57c600 634 tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
cb1a09d0
AD
635 while (($key,$val) = each %HIST) {
636 print $key, ' = ', unpack('L',$val), "\n";
637 }
638 untie(%HIST);
639
640=head2 Tying FileHandles
641
184e9718 642This is partially implemented now.
a7adf1f0 643
2ae324a7 644A class implementing a tied filehandle should define the following
1d603a67 645methods: TIEHANDLE, at least one of PRINT, PRINTF, WRITE, READLINE, GETC,
301e8125 646READ, and possibly CLOSE, UNTIE and DESTROY. The class can also provide: BINMODE,
4592e6ca
NIS
647OPEN, EOF, FILENO, SEEK, TELL - if the corresponding perl operators are
648used on the handle.
a7adf1f0 649
650It is especially useful when perl is embedded in some other program,
651where output to STDOUT and STDERR may have to be redirected in some
652special way. See nvi and the Apache module for examples.
653
654In our example we're going to create a shouting handle.
655
656 package Shout;
657
658=over
659
660=item TIEHANDLE classname, LIST
661
662This is the constructor for the class. That means it is expected to
184e9718 663return a blessed reference of some sort. The reference can be used to
5f05dabc 664hold some internal information.
a7adf1f0 665
7e1af8bc 666 sub TIEHANDLE { print "<shout>\n"; my $i; bless \$i, shift }
a7adf1f0 667
1d603a67
GB
668=item WRITE this, LIST
669
670This method will be called when the handle is written to via the
671C<syswrite> function.
672
673 sub WRITE {
674 $r = shift;
675 my($buf,$len,$offset) = @_;
676 print "WRITE called, \$buf=$buf, \$len=$len, \$offset=$offset";
677 }
678
a7adf1f0 679=item PRINT this, LIST
680
46fc3d4c 681This method will be triggered every time the tied handle is printed to
682with the C<print()> function.
184e9718 683Beyond its self reference it also expects the list that was passed to
a7adf1f0 684the print function.
685
58f51617
SV
686 sub PRINT { $r = shift; $$r++; print join($,,map(uc($_),@_)),$\ }
687
46fc3d4c 688=item PRINTF this, LIST
689
690This method will be triggered every time the tied handle is printed to
691with the C<printf()> function.
692Beyond its self reference it also expects the format and list that was
693passed to the printf function.
694
695 sub PRINTF {
696 shift;
697 my $fmt = shift;
698 print sprintf($fmt, @_)."\n";
699 }
700
1d603a67 701=item READ this, LIST
2ae324a7 702
703This method will be called when the handle is read from via the C<read>
704or C<sysread> functions.
705
706 sub READ {
889a76e8
GS
707 my $self = shift;
708 my $$bufref = \$_[0];
709 my(undef,$len,$offset) = @_;
710 print "READ called, \$buf=$bufref, \$len=$len, \$offset=$offset";
711 # add to $$bufref, set $len to number of characters read
712 $len;
2ae324a7 713 }
714
58f51617
SV
715=item READLINE this
716
2ae324a7 717This method will be called when the handle is read from via <HANDLE>.
718The method should return undef when there is no more data.
58f51617 719
889a76e8 720 sub READLINE { $r = shift; "READLINE called $$r times\n"; }
a7adf1f0 721
2ae324a7 722=item GETC this
723
724This method will be called when the C<getc> function is called.
725
726 sub GETC { print "Don't GETC, Get Perl"; return "a"; }
727
1d603a67
GB
728=item CLOSE this
729
730This method will be called when the handle is closed via the C<close>
731function.
732
733 sub CLOSE { print "CLOSE called.\n" }
734
301e8125
NIS
735=item UNTIE this
736
737As with the other types of ties, this method will be called when C<untie> happens.
738It may be appropriate to "auto CLOSE" when this occurs.
739
a7adf1f0 740=item DESTROY this
741
742As with the other types of ties, this method will be called when the
743tied handle is about to be destroyed. This is useful for debugging and
744possibly cleaning up.
745
746 sub DESTROY { print "</shout>\n" }
747
748=back
749
750Here's how to use our little example:
751
752 tie(*FOO,'Shout');
753 print FOO "hello\n";
754 $a = 4; $b = 6;
755 print FOO $a, " plus ", $b, " equals ", $a + $b, "\n";
58f51617 756 print <FOO>;
cb1a09d0 757
d7da42b7
JH
758=head2 UNTIE this
759
760You can define for all tie types an UNTIE method that will be called
761at untie().
762
2752eb9f
PM
763=head2 The C<untie> Gotcha
764
765If you intend making use of the object returned from either tie() or
766tied(), and if the tie's target class defines a destructor, there is a
767subtle gotcha you I<must> guard against.
768
769As setup, consider this (admittedly rather contrived) example of a
770tie; all it does is use a file to keep a log of the values assigned to
771a scalar.
772
773 package Remember;
774
775 use strict;
9f1b1f2d 776 use warnings;
2752eb9f
PM
777 use IO::File;
778
779 sub TIESCALAR {
780 my $class = shift;
781 my $filename = shift;
782 my $handle = new IO::File "> $filename"
783 or die "Cannot open $filename: $!\n";
784
785 print $handle "The Start\n";
786 bless {FH => $handle, Value => 0}, $class;
787 }
788
789 sub FETCH {
790 my $self = shift;
791 return $self->{Value};
792 }
793
794 sub STORE {
795 my $self = shift;
796 my $value = shift;
797 my $handle = $self->{FH};
798 print $handle "$value\n";
799 $self->{Value} = $value;
800 }
801
802 sub DESTROY {
803 my $self = shift;
804 my $handle = $self->{FH};
805 print $handle "The End\n";
806 close $handle;
807 }
808
809 1;
810
811Here is an example that makes use of this tie:
812
813 use strict;
814 use Remember;
815
816 my $fred;
817 tie $fred, 'Remember', 'myfile.txt';
818 $fred = 1;
819 $fred = 4;
820 $fred = 5;
821 untie $fred;
822 system "cat myfile.txt";
823
824This is the output when it is executed:
825
826 The Start
827 1
828 4
829 5
830 The End
831
832So far so good. Those of you who have been paying attention will have
833spotted that the tied object hasn't been used so far. So lets add an
834extra method to the Remember class to allow comments to be included in
835the file -- say, something like this:
836
837 sub comment {
838 my $self = shift;
839 my $text = shift;
840 my $handle = $self->{FH};
841 print $handle $text, "\n";
842 }
843
844And here is the previous example modified to use the C<comment> method
845(which requires the tied object):
846
847 use strict;
848 use Remember;
849
850 my ($fred, $x);
851 $x = tie $fred, 'Remember', 'myfile.txt';
852 $fred = 1;
853 $fred = 4;
854 comment $x "changing...";
855 $fred = 5;
856 untie $fred;
857 system "cat myfile.txt";
858
859When this code is executed there is no output. Here's why:
860
861When a variable is tied, it is associated with the object which is the
862return value of the TIESCALAR, TIEARRAY, or TIEHASH function. This
863object normally has only one reference, namely, the implicit reference
864from the tied variable. When untie() is called, that reference is
865destroyed. Then, as in the first example above, the object's
866destructor (DESTROY) is called, which is normal for objects that have
867no more valid references; and thus the file is closed.
868
869In the second example, however, we have stored another reference to
19799a22 870the tied object in $x. That means that when untie() gets called
2752eb9f
PM
871there will still be a valid reference to the object in existence, so
872the destructor is not called at that time, and thus the file is not
873closed. The reason there is no output is because the file buffers
874have not been flushed to disk.
875
876Now that you know what the problem is, what can you do to avoid it?
301e8125
NIS
877Prior to the introduction of the optional UNTIE method the only way
878was the good old C<-w> flag. Which will spot any instances where you call
2752eb9f 879untie() and there are still valid references to the tied object. If
9f1b1f2d
GS
880the second script above this near the top C<use warnings 'untie'>
881or was run with the C<-w> flag, Perl prints this
2752eb9f
PM
882warning message:
883
884 untie attempted while 1 inner references still exist
885
886To get the script to work properly and silence the warning make sure
887there are no valid references to the tied object I<before> untie() is
888called:
889
890 undef $x;
891 untie $fred;
892
301e8125
NIS
893Now that UNTIE exists the class designer can decide which parts of the
894class functionality are really associated with C<untie> and which with
895the object being destroyed. What makes sense for a given class depends
896on whether the inner references are being kept so that non-tie-related
897methods can be called on the object. But in most cases it probably makes
898sense to move the functionality that would have been in DESTROY to the UNTIE
899method.
900
901If the UNTIE method exists then the warning above does not occur. Instead the
902UNTIE method is passed the count of "extra" references and can issue its own
903warning if appropriate. e.g. to replicate the no UNTIE case this method can
904be used:
905
906 sub UNTIE
907 {
908 my ($obj,$count) = @_;
909 carp "untie attempted while $count inner references still exist" if $count;
910 }
911
cb1a09d0
AD
912=head1 SEE ALSO
913
914See L<DB_File> or L<Config> for some interesting tie() implementations.
3d0ae7ba
GS
915A good starting point for many tie() implementations is with one of the
916modules L<Tie::Scalar>, L<Tie::Array>, L<Tie::Hash>, or L<Tie::Handle>.
cb1a09d0
AD
917
918=head1 BUGS
919
c07a80fd 920You cannot easily tie a multilevel data structure (such as a hash of
921hashes) to a dbm file. The first problem is that all but GDBM and
922Berkeley DB have size limitations, but beyond that, you also have problems
923with how references are to be represented on disk. One experimental
5f05dabc 924module that does attempt to address this need partially is the MLDBM
f102b883 925module. Check your nearest CPAN site as described in L<perlmodlib> for
c07a80fd 926source code to MLDBM.
927
e08f2115
GA
928Tied filehandles are still incomplete. sysopen(), truncate(),
929flock(), fcntl(), stat() and -X can't currently be trapped.
930
cb1a09d0
AD
931=head1 AUTHOR
932
933Tom Christiansen
a7adf1f0 934
46fc3d4c 935TIEHANDLE by Sven Verdoolaege <F<skimo@dns.ufsia.ac.be>> and Doug MacEachern <F<dougm@osf.org>>
301e8125
NIS
936
937UNTIE by Nick Ing-Simmons <F<nick@ing-simmons.net>>
938