X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTie%2FHandle.pm;h=33b22210f9b767e59848cbd9d3295875f922f8ce;hb=eb31b78e700ea0345396e27142faff79fd75f356;hp=3cf94ec2270d63234ed0d33a725f154de7ce96c0;hpb=8a0597442b89a0a3330c57701574531c2f5c7b15;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Tie/Handle.pm b/lib/Tie/Handle.pm index 3cf94ec..33b2221 100644 --- a/lib/Tie/Handle.pm +++ b/lib/Tie/Handle.pm @@ -1,22 +1,25 @@ package Tie::Handle; +use 5.006_001; +our $VERSION = '4.1'; + =head1 NAME -Tie::Handle - base class definitions for tied handles +Tie::Handle, Tie::StdHandle - base class definitions for tied handles =head1 SYNOPSIS package NewHandle; require Tie::Handle; - - @ISA = (Tie::Handle); - + + @ISA = qw(Tie::Handle); + sub READ { ... } # Provide a needed method sub TIEHANDLE { ... } # Overrides inherited method - - + + package main; - + tie *FH, 'NewHandle'; =head1 DESCRIPTION @@ -24,15 +27,13 @@ Tie::Handle - base class definitions for tied handles This module provides some skeletal methods for handle-tying classes. See L for a list of the functions required in tying a handle to a package. The basic B package provides a C method, as well as methods -C, C and C. The C method is provided as a means -of grandfathering, for classes that forget to provide their own C -method. +C, C, C and C. For developers wishing to write their own tied-handle classes, the methods are summarized below. The L section not only documents these, but has sample code as well: -=over +=over 4 =item TIEHANDLE classname, LIST @@ -69,6 +70,28 @@ Get a single character Close the handle +=item OPEN this, filename + +(Re-)open the handle + +=item BINMODE this + +Specify content is binary + +=item EOF this + +Test for end of file. + +=item TELL this + +Return position in the file. + +=item SEEK this, offset, whence + +Position the file. + +Test for end of file. + =item DESTROY this Free the storage associated with the tied handle referenced by I. @@ -82,9 +105,19 @@ destruction of an instance. The L section contains an example of tying handles. +=head1 COMPATIBILITY + +This version of Tie::Handle is neither related to nor compatible with +the Tie::Handle (3.0) module available on CPAN. It was due to an +accident that two modules with the same name appeared. The namespace +clash has been cleared in favor of this module that comes with the +perl core in September 2000 and accordingly the version number has +been bumped up to 4.0. + =cut use Carp; +use warnings::register; sub new { my $pkg = shift; @@ -96,8 +129,7 @@ sub new { sub TIEHANDLE { my $pkg = shift; if (defined &{"{$pkg}::new"}) { - carp "WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing" - if $^W; + warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"); $pkg->new(@_); } else { @@ -121,7 +153,7 @@ sub PRINTF { my $self = shift; if($self->can('WRITE') != \&WRITE) { - my $buf = sprintf(@_); + my $buf = sprintf(shift,@_); $self->WRITE($buf,length($buf),0); } else { @@ -162,4 +194,41 @@ sub CLOSE { croak "$pkg doesn't define a CLOSE method"; } +package Tie::StdHandle; +our @ISA = 'Tie::Handle'; +use Carp; + +sub TIEHANDLE +{ + my $class = shift; + my $fh = do { \local *HANDLE}; + bless $fh,$class; + $fh->OPEN(@_) if (@_); + return $fh; +} + +sub EOF { eof($_[0]) } +sub TELL { tell($_[0]) } +sub FILENO { fileno($_[0]) } +sub SEEK { seek($_[0],$_[1],$_[2]) } +sub CLOSE { close($_[0]) } +sub BINMODE { binmode($_[0]) } + +sub OPEN +{ + $_[0]->CLOSE if defined($_[0]->FILENO); + @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]); +} + +sub READ { read($_[0],$_[1],$_[2]) } +sub READLINE { my $fh = $_[0]; <$fh> } +sub GETC { getc($_[0]) } + +sub WRITE +{ + my $fh = $_[0]; + print $fh substr($_[1],0,$_[2]) +} + + 1;