summaryrefslogtreecommitdiff
path: root/lib/Net/XRC/Data.pm
blob: 6f264004eccd5e7df643ef4363873ddb2087bfb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Net::XRC::Data;

use strict;

sub new {
  my $proto = shift;
  my $class = ref($proto) || $proto;
  my $data = shift;
  my $self = ref($data) ? $data : \$data;
  warn "$proto->($self [$data])\n"
    if $Net::XRC::DEBUG > 1;

  if ( $class eq 'Net::XRC::Data' ) { #take a guess
    if ( ref($self) eq 'HASH' ) {
      $class .= '::complex';
    } elsif ( ref($self) eq 'ARRAY' ) {
      $class .= '::list';
    } elsif ( !defined($$self) ) {
      $class .= '::null';

    # now just guess...  no good way to distinguish
    # (bool and bytes are never guessed)
    } elsif ( $$self =~ /^-?\d+$/ ) {
      $class .= '::int';
    } else {
      $class .= '::string';
    }
    eval "use $class;";
    die $@ if $@;
  }
  bless($self, $class);
}

1;