Initial revision
[OpenSRF.git] / src / perlmods / OpenSRF / DomainObject.pm
1 package OpenSRF::DomainObject;
2 use base 'OpenSRF::DOM::Element::domainObject';
3 use OpenSRF::DOM;
4 use OpenSRF::Utils::Logger qw(:level);
5 use OpenSRF::DomainObject::oilsPrimitive;
6 my $logger = "OpenSRF::Utils::Logger";
7
8 =head1 NAME
9
10 OpenSRF::DomainObject
11
12 =head1 SYNOPSIS
13
14 OpenSRF::DomainObject is an abstract base class.  It
15 should not be used directly.  See C<OpenSRF::DomainObject::*>
16 for details.
17
18 =cut
19
20 my $tmp_doc;
21
22 sub object_castor {
23         my $self = shift;
24         my $node = shift;
25
26         return unless (defined $node);
27
28         if (ref($node) eq 'HASH') {
29                 return new OpenSRF::DomainObject::oilsHash (%$node);
30         } elsif (ref($node) eq 'ARRAY') {
31                 return new OpenSRF::DomainObject::oilsArray (@$node);
32         }
33
34         return $node;
35 }
36
37 sub native_castor {
38         my $self = shift;
39         my $node = shift;
40
41         return unless (defined $node);
42
43         if ($node->nodeType == 3) {
44                 return $node->nodeValue;
45         } elsif ($node->nodeName =~ /domainObject/o) {
46                 return $node->tie_me if ($node->class->can('tie_me'));
47         }
48         return $node;
49 }
50
51 sub new {
52         my $class = shift;
53         $class = ref($class) || $class;
54
55         (my $type = $class) =~ s/^.+://o;
56
57         $tmp_doc ||= OpenSRF::DOM->createDocument;
58         my $dO = OpenSRF::DOM::Element::domainObject->new( $type, @_ );
59
60         $tmp_doc->documentElement->appendChild($dO);
61
62         return $dO;
63 }
64
65 sub _attr_get_set {
66         my $self = shift;
67         my $part = shift;
68
69         $logger->debug( "DomainObject:_attr_get_set: ". $self->toString, INTERNAL );
70
71         my $node = $self->attrNode($part);
72
73         $logger->debug( "DomainObject:_attr_get_set " . $node->toString(), INTERNAL ) if ($node);
74
75
76         if (defined(my $new_value = shift)) {
77                 if (defined $node) {
78                         my $old_val = $node->getAttribute( "value" );
79                         $node->setAttribute(value => $new_value);
80                         return $old_val;
81                 } else {
82                         $self->addAttr( $part => $new_value );
83                         return $new_value;
84                 }
85         } elsif ( $node ) {
86                 return $node->getAttribute( "value" );
87         }
88 }
89
90 1;