# XML::RPC::Enc - phpMan

## NAME
    [XML::RPC::Enc] - Base class for [XML::RPC] encoders

## SYNOPSIS
    Generic usage

        use [XML::RPC::Fast];

        my $server = [XML::RPC::Fast]->new( undef, encoder => [XML::RPC::Enc::LibXML]->new );
        my $client = [XML::RPC::Fast]->new( $uri, encoder => [XML::RPC::Enc::LibXML]->new );

## METHODS
    The following methods should be implemented

  new (%args)
    Should support arguments:

    internal_encoding [ = undef ]
        Internal encoding. "undef" means wide perl characters (perl-5.8.1+)

    external_encoding [ = utf-8 ]
        External encoding. Which encoding to use in composed XML

  request ($method, @args) : xml byte-stream, [ new call url ]
    Encode request into XML

  response (@args) : xml byte-stream
    Encode response into XML

  fault ($faultcode, $faultstring) : xml byte-stream
    Encode fault into XML

  registerClass ($class_name,$encoder_cb)
    Register encoders for custom Perl types

    Encoders description:

        # Generic:
        $simple_encoder_cb = sub {
            my $object = shift;
            # ...
            return type => $string;
        };

        # Encoder-dependent ([XML::RPC::Enc::LibXML])
        $complex_encoder_cb = sub {
            my $object = shift;
            # ...
            return [XML::LibXML::Node];
        };

    Samples:

        $enc->registerClass( DateTime => sub {
            return ( 'dateTime.iso8601' => $_[0]->strftime('%Y%m%dT%H%M%S.%3N%z') );
        });

        # Encoder-dependent ([XML::RPC::Enc::LibXML])
        $enc->registerClass( DateTime => sub {
            my $node = [XML::LibXML::Element]->new('dateTime.iso8601');
            $node->appendText($_[0]->strftime('%Y%m%dT%H%M%S.%3N%z'));
            return $node;
        });

  decode ($xml) : $methodname, @args
    Decode request xml

  decode ($xml) : @args
    Decode response xml

  decode ($xml) : { fault => { faultCode => ..., faultString => ... } }
    Decode fault xml

  registerType ($xmlrpc_type,$decoder_cb)
    Register decoders for XML-RPC types

    $decoder_cb is depends on encoder implementation.

    Samples for [XML::RPC::Enc::LibXML]

        $enc->registerType( base64 => sub {
            my $node = shift;
            return [MIME::Base64::decode]($node->textContent);
        });

        $enc->registerType( 'dateTime.iso8601' => sub {
            my $node = shift;
            return [DateTime::Format::ISO8601]->parse_datetime($node->textContent);
        });

COPYRIGHT & LICENSE
    Copyright (c) 2008-2009 Mons Anderson.

    This program is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

## AUTHOR
    Mons Anderson, "<<mons@cpan.org>>"

