Protocol::XMLRPC::ValueFactory - value objects factory


Protocol-XMLRPC documentation Contained in the Protocol-XMLRPC distribution.

Index


Code Index:

NAME

Top

Protocol::XMLRPC::ValueFactory - value objects factory

SYNOPSIS

Top

    my $array    = Protocol::XMLRPC::ValueFactory->build([...]);
    my $struct   = Protocol::XMLRPC::ValueFactory->build({...});
    my $integer  = Protocol::XMLRPC::ValueFactory->build(1);
    my $double   = Protocol::XMLRPC::ValueFactory->build(1.2);
    my $datetime = Protocol::XMLRPC::ValueFactory->build('19980717T14:08:55');
    my $boolean  = Protocol::XMLRPC::ValueFactory->build('true');
    my $string   = Protocol::XMLRPC::ValueFactory->build('foo');

DESCRIPTION

Top

This is a value object factory. Used internally. In synopsis you can see what types can be guessed.

ATTRIBUTES

Top

METHODS

Top

build

Builds new value object. If no instance was provided tries to guess type.

AUTHOR

Top

Viacheslav Tykhanovskyi, vti@cpan.org.

COPYRIGHT

Top


Protocol-XMLRPC documentation Contained in the Protocol-XMLRPC distribution.

package Protocol::XMLRPC::ValueFactory;

use strict;
use warnings;

use Protocol::XMLRPC::Value::Double;
use Protocol::XMLRPC::Value::String;
use Protocol::XMLRPC::Value::Integer;
use Protocol::XMLRPC::Value::Array;
use Protocol::XMLRPC::Value::Boolean;
use Protocol::XMLRPC::Value::DateTime;
use Protocol::XMLRPC::Value::Struct;

sub build {
    my $class = shift;

    return unless @_;

    my ($type, $value) = @_;
    ($value, $type) = ($type, '') unless defined $value;

    if (($type && $type eq 'array') || ref($value) eq 'ARRAY') {
        return Protocol::XMLRPC::Value::Array->new($value);
    }
    elsif (($type && $type eq 'struct') || ref($value) eq 'HASH') {
        return Protocol::XMLRPC::Value::Struct->new($value);
    }
    elsif (ref($value)) {
        return $value;
    }
    elsif (($type && $type eq 'int') || $value =~ m/^(?:\+|-)?\d+$/) {
        return Protocol::XMLRPC::Value::Integer->new($value);
    }
    elsif (($type && $type eq 'double') || $value =~ m/^(?:\+|-)?\d+\.\d+$/) {
        return Protocol::XMLRPC::Value::Double->new($value);
    }
    elsif (($type && $type eq 'boolean')
        || $value eq 'true'
        || $value eq 'false')
    {
        return Protocol::XMLRPC::Value::Boolean->new($value);
    }
    elsif (($type && $type eq 'datetime')
        || $value =~ m/^(\d\d\d\d)(\d\d)(\d\d)T(\d\d):(\d\d):(\d\d)$/)
    {
        return Protocol::XMLRPC::Value::DateTime->parse($value);
    }

    return Protocol::XMLRPC::Value::String->new($value);
}

1;
__END__