QuickBooks/QBXML/Object.php
static public function fromXML($XML, $action_or_object = null)
	{		
		if (!$action_or_object or $action_or_object == QUICKBOOKS_QUERY_ITEM)
		{
			$action_or_object = $XML->name();
		}
		
		$type = QuickBooks_Utilities::actionToObject($action_or_object);
		
		$exceptions = array(
			QUICKBOOKS_OBJECT_SERVICEITEM => 'ServiceItem', 
			QUICKBOOKS_OBJECT_INVENTORYITEM => 'InventoryItem', 
			QUICKBOOKS_OBJECT_NONINVENTORYITEM => 'NonInventoryItem', 
			QUICKBOOKS_OBJECT_DISCOUNTITEM => 'DiscountItem', 
			QUICKBOOKS_OBJECT_FIXEDASSETITEM => 'FixedAssetItem', 
			QUICKBOOKS_OBJECT_GROUPITEM => 'GroupItem', 
			QUICKBOOKS_OBJECT_OTHERCHARGEITEM => 'OtherChargeItem', 
			QUICKBOOKS_OBJECT_SALESTAXITEM => 'SalesTaxItem', 
			QUICKBOOKS_OBJECT_SALESTAXGROUPITEM => 'SalesTaxGroupItem', 
			QUICKBOOKS_OBJECT_SUBTOTALITEM => 'SubtotalItem', 
			QUICKBOOKS_OBJECT_INVENTORYASSEMBLYITEM => 'InventoryAssemblyItem', 
			);
		
		if (isset($exceptions[$type]))
		{
			$type = $exceptions[$type];
		}
		
		//print('trying to create type: {' . $type . '}' . "\n");
		
		$class = 'QuickBooks_QBXML_Object_' . ucfirst(strtolower($type));
		
		if (true) 		//class_exists($class, false))
		{
			$Object = QuickBooks_QBXML_Object::_fromXMLHelper($class, $XML);
			
			if (!is_object($Object))
			{
				return false;
			}
			
			$children = array();
			switch ($Object->object())
			{
				case QUICKBOOKS_OBJECT_RECEIVEPAYMENT:

					$children = array(
						'AppliedToTxnRet' => array( 'QuickBooks_QBXML_Object_ReceivePayment_AppliedToTxn', 'addAppliedToTxn' ),
						);

					break;
				case QUICKBOOKS_OBJECT_BILL:
					
					$children = array(
						'ItemLineRet' => array( 'QuickBooks_QBXML_Object_Bill_ItemLine', 'addItemLine' ), 
						'ExpenseLineRet' => array( 'QuickBooks_QBXML_Object_Bill_ExpenseLine', 'addExpenseLine' ), 
						);					
					
					break;
				case QUICKBOOKS_OBJECT_PURCHASEORDER:
					
					$children = array(
						'PurchaseOrderLineRet' => array( 'QuickBooks_QBXML_Object_PurchaseOrder_PurchaseOrderLine', 'addPurchaseOrderLine' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_INVOICE:
					
					$children = array( 
						'InvoiceLineRet' => array( 'QuickBooks_QBXML_Object_Invoice_InvoiceLine', 'addInvoiceLine' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_ESTIMATE:
					
					$children = array( 
						'EstimateLineRet' => array( 'QuickBooks_QBXML_Object_Estimate_EstimateLine', 'addEstimateLine' ), 
						);					
					
					break;
				case QUICKBOOKS_OBJECT_SALESRECEIPT:
					
					$children = array( 
						'SalesReceiptLineRet' => array( 'QuickBooks_QBXML_Object_SalesReceipt_SalesReceiptLine', 'addSalesReceiptLine' ), 
						);					
					
					break;
				case QUICKBOOKS_OBJECT_JOURNALENTRY:
					
					$children = array(
						'JournalCreditLineRet' => array( 'QuickBooks_QBXML_Object_JournalEntry_JournalCreditLine', 'addCreditLine' ), 
						'JournalDebitLineRet' => array( 'QuickBooks_QBXML_Object_JournalEntry_JournalDebitLine', 'addDebitLine' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_SALESTAXGROUPITEM:
					
					$children = array(
						'ItemSalesTaxRef' => array( 'QuickBooks_QBXML_Object_SalesTaxGroupItem_ItemSalesTaxRef', 'addItemSalesTaxRef' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_UNITOFMEASURESET:
					
					$children = array(
						'RelatedUnit' => array( 'QuickBooks_QBXML_Object_UnitOfMeasureSet_RelatedUnit', 'addRelatedUnit' ), 
						'DefaultUnit' => array( 'QuickBooks_QBXML_Object_UnitOfMeasureSet_DefaultUnit', 'addDefaultUnit' ), 
						);
					
					break;
			}
			
			foreach ($children as $node => $tmp)
			{
				$childclass = $tmp[0];
				$childmethod = $tmp[1];
				
				if (class_exists($childclass))
				{
					foreach ($XML->children() as $ChildXML)
					{
						if ($ChildXML->name() == $node)
						{
							$ChildObject = QuickBooks_QBXML_Object::_fromXMLHelper($childclass, $ChildXML);
							$Object->$childmethod($ChildObject);			
						}	
					}
				}
				else
				{
					print('Missing class: ' . $childclass . "\n");
				}
			}
			
			return $Object;
		}
		
		return false;		
	}
static public function fromXML($XML, $action_or_object = null)
	{		
		if (!$action_or_object or $action_or_object == QUICKBOOKS_QUERY_ITEM)
		{
			$action_or_object = $XML->name();
		}
		
		$type = QuickBooks_Utilities::actionToObject($action_or_object);
		
		$exceptions = array(
			QUICKBOOKS_OBJECT_SERVICEITEM => 'ServiceItem', 
			QUICKBOOKS_OBJECT_INVENTORYITEM => 'InventoryItem', 
			QUICKBOOKS_OBJECT_NONINVENTORYITEM => 'NonInventoryItem', 
			QUICKBOOKS_OBJECT_DISCOUNTITEM => 'DiscountItem', 
			QUICKBOOKS_OBJECT_FIXEDASSETITEM => 'FixedAssetItem', 
			QUICKBOOKS_OBJECT_GROUPITEM => 'GroupItem', 
			QUICKBOOKS_OBJECT_OTHERCHARGEITEM => 'OtherChargeItem', 
			QUICKBOOKS_OBJECT_SALESTAXITEM => 'SalesTaxItem', 
			QUICKBOOKS_OBJECT_SALESTAXGROUPITEM => 'SalesTaxGroupItem', 
			QUICKBOOKS_OBJECT_SUBTOTALITEM => 'SubtotalItem', 
			QUICKBOOKS_OBJECT_INVENTORYASSEMBLYITEM => 'InventoryAssemblyItem', 
			);
		
		if (isset($exceptions[$type]))
		{
			$type = $exceptions[$type];
		}
		
		//print('trying to create type: {' . $type . '}' . "\n");
		
		$class = 'QuickBooks_QBXML_Object_' . ucfirst(strtolower($type));
		
		if (true) 		//class_exists($class, false))
		{
			$Object = QuickBooks_QBXML_Object::_fromXMLHelper($class, $XML);
			
			if (!is_object($Object))
			{
				return false;
			}
			
			$children = array();
			switch ($Object->object())
			{
				case QUICKBOOKS_OBJECT_RECEIVEPAYMENT:

					$children = array(
						'AppliedToTxnRet' => array( 'QuickBooks_QBXML_Object_ReceivePayment_AppliedToTxn', 'addAppliedToTxn' ),
						);

					break;
				case QUICKBOOKS_OBJECT_BILL:
					
					$children = array(
						'ItemLineRet' => array( 'QuickBooks_QBXML_Object_Bill_ItemLine', 'addItemLine' ), 
						'ExpenseLineRet' => array( 'QuickBooks_QBXML_Object_Bill_ExpenseLine', 'addExpenseLine' ), 
						);					
					
					break;
				case QUICKBOOKS_OBJECT_PURCHASEORDER:
					
					$children = array(
						'PurchaseOrderLineRet' => array( 'QuickBooks_QBXML_Object_PurchaseOrder_PurchaseOrderLine', 'addPurchaseOrderLine' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_INVOICE:
					
					$children = array( 
						'InvoiceLineRet' => array( 'QuickBooks_QBXML_Object_Invoice_InvoiceLine', 'addInvoiceLine' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_ESTIMATE:
					
					$children = array( 
						'EstimateLineRet' => array( 'QuickBooks_QBXML_Object_Estimate_EstimateLine', 'addEstimateLine' ), 
						);					
					
					break;
				case QUICKBOOKS_OBJECT_SALESRECEIPT:
					
					$children = array( 
						'SalesReceiptLineRet' => array( 'QuickBooks_QBXML_Object_SalesReceipt_SalesReceiptLine', 'addSalesReceiptLine' ), 
						);					
					
					break;
				case QUICKBOOKS_OBJECT_JOURNALENTRY:
					
					$children = array(
						'JournalCreditLineRet' => array( 'QuickBooks_QBXML_Object_JournalEntry_JournalCreditLine', 'addCreditLine' ), 
						'JournalDebitLineRet' => array( 'QuickBooks_QBXML_Object_JournalEntry_JournalDebitLine', 'addDebitLine' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_SALESTAXGROUPITEM:
					
					$children = array(
						'ItemSalesTaxRef' => array( 'QuickBooks_QBXML_Object_SalesTaxGroupItem_ItemSalesTaxRef', 'addItemSalesTaxRef' ), 
						);
					
					break;
				case QUICKBOOKS_OBJECT_UNITOFMEASURESET:
					
					$children = array(
						'RelatedUnit' => array( 'QuickBooks_QBXML_Object_UnitOfMeasureSet_RelatedUnit', 'addRelatedUnit' ), 
						'DefaultUnit' => array( 'QuickBooks_QBXML_Object_UnitOfMeasureSet_DefaultUnit', 'addDefaultUnit' ), 
						);
					
					break;
			}
			
			foreach ($children as $node => $tmp)
			{
				$childclass = $tmp[0];
				$childmethod = $tmp[1];
				
				if (class_exists($childclass))
				{
					foreach ($XML->children() as $ChildXML)
					{
						if ($ChildXML->name() == $node)
						{
							$ChildObject = QuickBooks_QBXML_Object::_fromXMLHelper($childclass, $ChildXML);
							$Object->$childmethod($ChildObject);			
						}	
					}
				}
				else
				{
					print('Missing class: ' . $childclass . "\n");
				}
			}
			
			return $Object;
		}
		
		return false;		
	}
Convert a QuickBooks_XML_Node object to a QuickBooks_Object_* object instance

@param QuickBooks_XML_Node $XML
@param string $action_or_object
@return QuickBooks_Object