Upgrade to Encode 1.32, from Dan Kogai.
[p5sagit/p5-mst-13.2.git] / ext / Encode / lib / Encode / Encoder.pm
index 1fc65ea..33a3bd5 100644 (file)
@@ -1,16 +1,14 @@
 #
-# $Id: Encoder.pm,v 0.1 2002/04/08 02:35:10 dankogai Exp $
+# $Id: Encoder.pm,v 0.2 2002/04/08 18:08:07 dankogai Exp $
 #
-package Encoder;
+package Encode::Encoder;
 use strict;
-our $VERSION = do { my @r = (q$Revision: 0.1 $ =~ /\d+/g); sprintf "%d."."%02d"  x $#r, @r };
+use warnings;
+our $VERSION = do { my @r = (q$Revision: 0.2 $ =~ /\d+/g); sprintf "%d."."%02d"  x $#r, @r };
 
 require Exporter;
 our @ISA = qw(Exporter);
-# Public, encouraged API is exported by default
-our @EXPORT = qw (
-  encoder
-);
+our @EXPORT = qw ( encoder );
 
 our $AUTOLOAD;
 our $DEBUG = 0;
@@ -19,22 +17,30 @@ use Carp;
 
 sub new{
     my ($class, $data, $encname) = @_;
-    $encname ||= 'utf8';
-    my $obj = find_encoding($encname) 
-       or croak __PACKAGE__, ": unknown encoding: $encname";
+    unless($encname){
+       $encname = Encode::is_utf8($data) ? 'utf8' : '';
+    }else{
+       my $obj = find_encoding($encname) 
+           or croak __PACKAGE__, ": unknown encoding: $encname";
+       $encname = $obj->name;
+    }
     my $self = {
                data     => $data,
-               encoding => $obj->name,
+               encoding => $encname,
               };
     bless $self => $class;
 }
 
-sub encoder{ shift->new(@_) }
+sub encoder{ __PACKAGE__->new(@_) }
 
 sub data{
     my ($self, $data) = shift;
-    defined $data and $self->{data} = $data;
-    return $self;
+    if (defined $data){
+       $self->{data} = $data;
+       return $data;
+    }else{
+       return $self->{data};
+    }
 }
 
 sub encoding{
@@ -43,8 +49,24 @@ sub encoding{
        my $obj = find_encoding($encname) 
            or confess __PACKAGE__, ": unknown encoding: $encname";
        $self->{encoding} = $obj->name;
+       return $self;
+    }else{
+       return $self->{encoding}
     }
-    $self;
+}
+
+sub bytes {
+    my ($self, $encname) = @_;
+    $encname ||= $self->{encoding};
+    my $obj = find_encoding($encname) 
+           or confess __PACKAGE__, ": unknown encoding: $encname";
+    $self->{data} = $obj->decode($self->{data}, 1);
+    $self->{encoding} = '' ;
+    return $self;
+}
+
+sub DESTROY{ # defined so it won't autoload.
+    $DEBUG and warn shift;
 }
 
 sub AUTOLOAD {
@@ -56,7 +78,11 @@ sub AUTOLOAD {
     my $obj = find_encoding($myname) 
            or confess __PACKAGE__, ": unknown encoding: $myname";
     $DEBUG and warn $self->{encoding}, " => ", $obj->name;
-    from_to($self->{data}, $self->{encoding}, $obj->name, 1);
+    if ($self->{encoding}){
+       from_to($self->{data}, $self->{encoding}, $obj->name, 1);
+    }else{
+       $self->{data} = $obj->encode($self->{data}, 1);
+    }
     $self->{encoding} = $obj->name;
     return $self;
 }
@@ -82,11 +108,13 @@ Encode::Encoder -- Object Oriented Encoder
   # shortcut
   encoder($data)->iso_8859_1;
   # you can stack them!
-  encoder($data)->iso_8859_1->base64; # provided base64() is defined
+  encoder($data)->iso_8859_1->base64;  # provided base64() is defined
+  # you can use it as a decoder as well
+  encoder($base64)->bytes('base64')->latin1;
   # stringified
-  print encoder($utf8)->latin1     # prints the string in latin1
+  print encoder($data)->utf8->latin1;  # prints the string in latin1
   # numified
-  encoder("\x{abcd}\x{ef}g") == 6; # true. bytes::length($data)
+  encoder("\x{abcd}\x{ef}g")->utf8 == 6; # true. bytes::length($data)
 
 =head1 ABSTRACT
 
@@ -100,6 +128,7 @@ converted to Latin1 then Base64, you can simply say
 instead of
 
   my $latin1 = encode("latin1", $utf8);
+  my $base64 = encode_base64($utf8);
 
 or lazier and convolted
 
@@ -122,7 +151,56 @@ When there is no method, it takes the method name as the name of
 encoding and encode instance I<data> with I<encoding>.  If successful,
 instance I<encoding> is set accordingly.
 
-=item * 
+=item *
+
+You can retrieve the result via -E<gt>data but usually you don't have to 
+because the stringify operator ("") is overridden to do exactly that.
+
+=back
+
+=head2 Predefined Methods
+
+This module predefines the methods below;
+
+=over 4
+
+=item $e = Encode::Encoder-E<gt>new([$data, $encoding]);
+
+returns the encoder object.  Its data is initialized with $data if
+there, and its encoding is set to $encoding if there.
+
+When $encoding is omitted, it defaults to utf8 if $data is already in
+utf8 or "" (empty string) otherwise.
+
+=item encoder()
+
+is an alias of Encode::Encoder-E<gt>new().  This one is exported for
+convenience.
+
+=item $e-E<gt>data([$data])
+
+when $data is present, sets instance data to $data and returns the
+object itself. otherwise the current instance data is returned.
+
+=item $e-E<gt>encoding([$encoding])
+
+when $encoding is present, sets instance encoding to $encoding and
+returns the object itself. otherwise the current instance encoding is
+returned.
+
+=item $e-E<gt>bytes([$encoding])
+
+decodes instance data from $encoding, or instance encoding if omitted.
+when the conversion is successful, the enstance encoding will be set
+to "" . 
+
+The name I<bytes> was deliberately picked to avoid namespace tainting
+-- this module may be used as a base class so method names that appear
+in Encode::Encoding are avoided.
+
+=back
+
+=head2 Example: base64 transcoder
 
 This module is desined to work with L<Encode::Encoding>.
 To make the Base64 transcorder example above really work, you should
@@ -130,15 +208,15 @@ write a module like this.
 
   package Encode::Base64;
   use base 'Encode::Encoding';
-  __PACKAGE->Define('base64');
+  __PACKAGE__->Define('base64');
   use MIME::Base64;
   sub encode{ 
-    my ($obj, $data) = @_; 
-    return encode_base64($data);
+      my ($obj, $data) = @_; 
+      return encode_base64($data);
   }
   sub decode{
-    my ($obj, $data) = @_; 
-    return decode_base64($data);
+      my ($obj, $data) = @_; 
+      return decode_base64($data);
   }
   1;
   __END__
@@ -147,7 +225,11 @@ And your caller module should be like this;
 
   use Encode::Encoder;
   use Encode::Base64;
-  # and be creative.
+
+  # now you can really do the following
+
+  encoder($data)->iso_8859_1->base64;
+  encoder($base64)->bytes('base64')->latin1;
 
 =head2 operator overloading
 
@@ -159,34 +241,6 @@ Numify returns the number of bytes therein.
 
 They come in handy when you want to print or find the size of data.
 
-=back
-
-=head2 Predefined Methods
-
-This module predefines the methods below;
-
-=over 4
-
-=item $e = Encode::Encoder-E<gt>new([$data, $encoding]);
-
-returns the encoder object.  Its data is initialized with $data if
-there, and its encoding is set to $encoding if there.
-
-=item encoder()
-
-is an alias of Encode::Encoder-E<gt>new().  This one is exported for
-convenience.
-
-=item $e-E<gt>data($data)
-
-sets instance data to $data.
-
-=item $e-E<gt>encoding($encoding)
-
-sets instance encoding to $encoding
-
-=back
-
 =head1 SEE ALSO
 
 L<Encode>