1 | package Tie::Handle;
|
---|
2 |
|
---|
3 | use 5.006_001;
|
---|
4 | our $VERSION = '4.1';
|
---|
5 |
|
---|
6 | =head1 NAME
|
---|
7 |
|
---|
8 | Tie::Handle, Tie::StdHandle - base class definitions for tied handles
|
---|
9 |
|
---|
10 | =head1 SYNOPSIS
|
---|
11 |
|
---|
12 | package NewHandle;
|
---|
13 | require Tie::Handle;
|
---|
14 |
|
---|
15 | @ISA = qw(Tie::Handle);
|
---|
16 |
|
---|
17 | sub READ { ... } # Provide a needed method
|
---|
18 | sub TIEHANDLE { ... } # Overrides inherited method
|
---|
19 |
|
---|
20 |
|
---|
21 | package main;
|
---|
22 |
|
---|
23 | tie *FH, 'NewHandle';
|
---|
24 |
|
---|
25 | =head1 DESCRIPTION
|
---|
26 |
|
---|
27 | This module provides some skeletal methods for handle-tying classes. See
|
---|
28 | L<perltie> for a list of the functions required in tying a handle to a package.
|
---|
29 | The basic B<Tie::Handle> package provides a C<new> method, as well as methods
|
---|
30 | C<TIEHANDLE>, C<PRINT>, C<PRINTF> and C<GETC>.
|
---|
31 |
|
---|
32 | For developers wishing to write their own tied-handle classes, the methods
|
---|
33 | are summarized below. The L<perltie> section not only documents these, but
|
---|
34 | has sample code as well:
|
---|
35 |
|
---|
36 | =over 4
|
---|
37 |
|
---|
38 | =item TIEHANDLE classname, LIST
|
---|
39 |
|
---|
40 | The method invoked by the command C<tie *glob, classname>. Associates a new
|
---|
41 | glob instance with the specified class. C<LIST> would represent additional
|
---|
42 | arguments (along the lines of L<AnyDBM_File> and compatriots) needed to
|
---|
43 | complete the association.
|
---|
44 |
|
---|
45 | =item WRITE this, scalar, length, offset
|
---|
46 |
|
---|
47 | Write I<length> bytes of data from I<scalar> starting at I<offset>.
|
---|
48 |
|
---|
49 | =item PRINT this, LIST
|
---|
50 |
|
---|
51 | Print the values in I<LIST>
|
---|
52 |
|
---|
53 | =item PRINTF this, format, LIST
|
---|
54 |
|
---|
55 | Print the values in I<LIST> using I<format>
|
---|
56 |
|
---|
57 | =item READ this, scalar, length, offset
|
---|
58 |
|
---|
59 | Read I<length> bytes of data into I<scalar> starting at I<offset>.
|
---|
60 |
|
---|
61 | =item READLINE this
|
---|
62 |
|
---|
63 | Read a single line
|
---|
64 |
|
---|
65 | =item GETC this
|
---|
66 |
|
---|
67 | Get a single character
|
---|
68 |
|
---|
69 | =item CLOSE this
|
---|
70 |
|
---|
71 | Close the handle
|
---|
72 |
|
---|
73 | =item OPEN this, filename
|
---|
74 |
|
---|
75 | (Re-)open the handle
|
---|
76 |
|
---|
77 | =item BINMODE this
|
---|
78 |
|
---|
79 | Specify content is binary
|
---|
80 |
|
---|
81 | =item EOF this
|
---|
82 |
|
---|
83 | Test for end of file.
|
---|
84 |
|
---|
85 | =item TELL this
|
---|
86 |
|
---|
87 | Return position in the file.
|
---|
88 |
|
---|
89 | =item SEEK this, offset, whence
|
---|
90 |
|
---|
91 | Position the file.
|
---|
92 |
|
---|
93 | Test for end of file.
|
---|
94 |
|
---|
95 | =item DESTROY this
|
---|
96 |
|
---|
97 | Free the storage associated with the tied handle referenced by I<this>.
|
---|
98 | This is rarely needed, as Perl manages its memory quite well. But the
|
---|
99 | option exists, should a class wish to perform specific actions upon the
|
---|
100 | destruction of an instance.
|
---|
101 |
|
---|
102 | =back
|
---|
103 |
|
---|
104 | =head1 MORE INFORMATION
|
---|
105 |
|
---|
106 | The L<perltie> section contains an example of tying handles.
|
---|
107 |
|
---|
108 | =head1 COMPATIBILITY
|
---|
109 |
|
---|
110 | This version of Tie::Handle is neither related to nor compatible with
|
---|
111 | the Tie::Handle (3.0) module available on CPAN. It was due to an
|
---|
112 | accident that two modules with the same name appeared. The namespace
|
---|
113 | clash has been cleared in favor of this module that comes with the
|
---|
114 | perl core in September 2000 and accordingly the version number has
|
---|
115 | been bumped up to 4.0.
|
---|
116 |
|
---|
117 | =cut
|
---|
118 |
|
---|
119 | use Carp;
|
---|
120 | use warnings::register;
|
---|
121 |
|
---|
122 | sub new {
|
---|
123 | my $pkg = shift;
|
---|
124 | $pkg->TIEHANDLE(@_);
|
---|
125 | }
|
---|
126 |
|
---|
127 | # "Grandfather" the new, a la Tie::Hash
|
---|
128 |
|
---|
129 | sub TIEHANDLE {
|
---|
130 | my $pkg = shift;
|
---|
131 | if (defined &{"{$pkg}::new"}) {
|
---|
132 | warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing");
|
---|
133 | $pkg->new(@_);
|
---|
134 | }
|
---|
135 | else {
|
---|
136 | croak "$pkg doesn't define a TIEHANDLE method";
|
---|
137 | }
|
---|
138 | }
|
---|
139 |
|
---|
140 | sub PRINT {
|
---|
141 | my $self = shift;
|
---|
142 | if($self->can('WRITE') != \&WRITE) {
|
---|
143 | my $buf = join(defined $, ? $, : "",@_);
|
---|
144 | $buf .= $\ if defined $\;
|
---|
145 | $self->WRITE($buf,length($buf),0);
|
---|
146 | }
|
---|
147 | else {
|
---|
148 | croak ref($self)," doesn't define a PRINT method";
|
---|
149 | }
|
---|
150 | }
|
---|
151 |
|
---|
152 | sub PRINTF {
|
---|
153 | my $self = shift;
|
---|
154 |
|
---|
155 | if($self->can('WRITE') != \&WRITE) {
|
---|
156 | my $buf = sprintf(shift,@_);
|
---|
157 | $self->WRITE($buf,length($buf),0);
|
---|
158 | }
|
---|
159 | else {
|
---|
160 | croak ref($self)," doesn't define a PRINTF method";
|
---|
161 | }
|
---|
162 | }
|
---|
163 |
|
---|
164 | sub READLINE {
|
---|
165 | my $pkg = ref $_[0];
|
---|
166 | croak "$pkg doesn't define a READLINE method";
|
---|
167 | }
|
---|
168 |
|
---|
169 | sub GETC {
|
---|
170 | my $self = shift;
|
---|
171 |
|
---|
172 | if($self->can('READ') != \&READ) {
|
---|
173 | my $buf;
|
---|
174 | $self->READ($buf,1);
|
---|
175 | return $buf;
|
---|
176 | }
|
---|
177 | else {
|
---|
178 | croak ref($self)," doesn't define a GETC method";
|
---|
179 | }
|
---|
180 | }
|
---|
181 |
|
---|
182 | sub READ {
|
---|
183 | my $pkg = ref $_[0];
|
---|
184 | croak "$pkg doesn't define a READ method";
|
---|
185 | }
|
---|
186 |
|
---|
187 | sub WRITE {
|
---|
188 | my $pkg = ref $_[0];
|
---|
189 | croak "$pkg doesn't define a WRITE method";
|
---|
190 | }
|
---|
191 |
|
---|
192 | sub CLOSE {
|
---|
193 | my $pkg = ref $_[0];
|
---|
194 | croak "$pkg doesn't define a CLOSE method";
|
---|
195 | }
|
---|
196 |
|
---|
197 | package Tie::StdHandle;
|
---|
198 | our @ISA = 'Tie::Handle';
|
---|
199 | use Carp;
|
---|
200 |
|
---|
201 | sub TIEHANDLE
|
---|
202 | {
|
---|
203 | my $class = shift;
|
---|
204 | my $fh = \do { local *HANDLE};
|
---|
205 | bless $fh,$class;
|
---|
206 | $fh->OPEN(@_) if (@_);
|
---|
207 | return $fh;
|
---|
208 | }
|
---|
209 |
|
---|
210 | sub EOF { eof($_[0]) }
|
---|
211 | sub TELL { tell($_[0]) }
|
---|
212 | sub FILENO { fileno($_[0]) }
|
---|
213 | sub SEEK { seek($_[0],$_[1],$_[2]) }
|
---|
214 | sub CLOSE { close($_[0]) }
|
---|
215 | sub BINMODE { binmode($_[0]) }
|
---|
216 |
|
---|
217 | sub OPEN
|
---|
218 | {
|
---|
219 | $_[0]->CLOSE if defined($_[0]->FILENO);
|
---|
220 | @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]);
|
---|
221 | }
|
---|
222 |
|
---|
223 | sub READ { read($_[0],$_[1],$_[2]) }
|
---|
224 | sub READLINE { my $fh = $_[0]; <$fh> }
|
---|
225 | sub GETC { getc($_[0]) }
|
---|
226 |
|
---|
227 | sub WRITE
|
---|
228 | {
|
---|
229 | my $fh = $_[0];
|
---|
230 | print $fh substr($_[1],0,$_[2])
|
---|
231 | }
|
---|
232 |
|
---|
233 |
|
---|
234 | 1;
|
---|