protected static function __parseXmlToObject($node, $node_class, $parse_attributes)
 {
     if ($node_class != null) {
         if ($node_class == 'array') {
             $obj = array();
         } else {
             $obj = new $node_class();
         }
     } else {
         $obj = new RecurlyObject();
     }
     while ($node) {
         if ($node->nodeType == XML_TEXT_NODE) {
             if ($node->wholeText != null) {
                 $text = trim($node->wholeText);
                 if (strlen($text) > 0) {
                     $obj->message = $text;
                 }
             }
         } else {
             if ($node->nodeType == XML_ELEMENT_NODE) {
                 $nodeName = str_replace("-", "_", $node->nodeName);
                 if (is_array($obj)) {
                     $child_node_class = RecurlyClient::$class_map[$nodeName];
                     $new_obj = RecurlyClient::__parseXmlToObject($node->childNodes->item(0), $child_node_class, $parse_attributes);
                     if ($parse_attributes) {
                         foreach ($node->attributes as $attrName => $attrNode) {
                             $nodeName = str_replace("-", "_", $attrName);
                             $nodeValue = $attrNode->nodeValue;
                             if (!is_numeric($nodeValue) && ($tmp = strtotime($nodeValue))) {
                                 $new_obj->{$nodeName} = $tmp;
                             } else {
                                 if ($nodeValue == "false") {
                                     $new_obj->{$nodeName} = false;
                                 } else {
                                     if ($nodeValue == "true") {
                                         $new_obj->{$nodeName} = true;
                                     } else {
                                         $new_obj->{$nodeName} = $nodeValue;
                                     }
                                 }
                             }
                         }
                     }
                     $obj[] = $new_obj;
                     $node = $node->nextSibling;
                     continue;
                 }
                 if ($node->getAttribute('nil')) {
                     $obj->{$nodeName} = null;
                 } else {
                     switch ($node->getAttribute('type')) {
                         case 'boolean':
                             $obj->{$nodeName} = $node->nodeValue == 'true';
                             break;
                         case 'date':
                             $obj->{$nodeName} = strtodate($node->nodeValue);
                             break;
                         case 'datetime':
                             $obj->{$nodeName} = strtotime($node->nodeValue);
                             break;
                         case 'float':
                             $obj->{$nodeName} = (double) $node->nodeValue;
                             break;
                         case 'integer':
                             $obj->{$nodeName} = (int) $node->nodeValue;
                             break;
                         default:
                             $obj->{$nodeName} = $node->nodeValue;
                     }
                 }
                 if ($node->childNodes->length > 1) {
                     $child_node_class = RecurlyClient::$class_map[$nodeName];
                     if ($child_node_class != '') {
                         $obj->{$nodeName} = RecurlyClient::__parseXmlToObject($node->childNodes->item(0), $child_node_class, $parse_attributes);
                     }
                 }
                 if ($parse_attributes) {
                     foreach ($node->attributes as $attrName => $attrNode) {
                         $nodeName = str_replace("-", "_", $attrName);
                         $nodeValue = $attrNode->nodeValue;
                         if (!is_numeric($nodeValue) && ($tmp = strtotime($nodeValue))) {
                             $obj->{$nodeName} = $tmp;
                         } else {
                             if ($nodeValue == "false") {
                                 $obj->{$nodeName} = false;
                             } else {
                                 if ($nodeValue == "true") {
                                     $obj->{$nodeName} = true;
                                 } else {
                                     $obj->{$nodeName} = $nodeValue;
                                 }
                             }
                         }
                     }
                 }
             }
         }
         $node = $node->nextSibling;
     }
     return $obj;
 }