#Region - TimeStamp
; 2012-04-23 15:48:35   v 0.2
#EndRegion - TimeStamp
#include-once
#include <Array.au3>


;====================================================================================================
;    BAO = Basic-AutoIt-Object     [ oder: BugFix-AutoIt-Object ;=) ]
;====================================================================================================
; FUNKTIONEN
;	_BAO_Class_Create            Erstellt eine Objekt-Klasse
;	_BAO_Class_MethodSet         Registriert eine Methode für die Klasse oder löscht sie
;	_BAO_Class_PropSet           Registriert, ändert oder löscht eine Property der Klasse
;	_BAO_Class_ObjCreate         Erstellt ein Klassen-Objekt oder löscht es aus der Klasse
;	_BAO_Class_ObjMethodSet      Registriert eine Methode für ein Klassen-Objekt oder löscht sie
;	_BAO_Class_ObjPropSet        Registriert, ändert oder löscht eine Property eines Klassen-Objektes
;	_BAO_Class_ObjGet            Abfragen von Informationen der Klasse und/oder des Klassen-Objektes
;	_BAO_Class_ObjMethodCall     Aufrufen von Methoden
;====================================================================================================

;===============================================================================
; Function Name....: _BAO_Class_Create
; Description......: Erstellt eine Objekt-Klasse
; Parameter(s).....: $_sClass       Name der Klasse, die erstellt werden soll
; ........optional.: $_sIndexClass  Name der Klasse, von der geerbt werden soll (Standard: 'self' = keine Vererbung)
; Requirement(s)...: Die Variable zum Aufnehmen des Objektes MUSS ZWINGEND identisch mit dem Klassennamen sein! ("$" & "Klassenname")
; Return Value(s)..: Array, das die Objekt-Klasse repräsentiert
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_Create($_sClass, $_sIndexClass='self')
	Local Static $aClass_MethodsTmp, $aClass_PropsTmp, $sClassTmp
	Local $aClass[4]                                       ; == Array zum Speichern der Mitglieder der Klassenmerkmale: [Klassenname, Array-Methoden, Array-Properties, Array-KlassenObjekte]
	If $_sIndexClass = 'self' Then
		Local $aClass_Methods[1] = [0]                     ; == Array zur Aufnahme der Methoden, Erstellen mit Anzahl der akt. Methoden als erstem Element
		Local $aClass_Props[1][2] = [[0]]                  ; == 2D-Array zur Aufnahme der Properties, Erstellen mit Anzahl der akt. Properties als erstem Element, [['property','value']]
		Local $aMembers[1] = [0]
		If IsArray($aClass_MethodsTmp) Then $aClass_Methods = $aClass_MethodsTmp
		If IsArray($aClass_PropsTmp)   Then $aClass_Props   = $aClass_PropsTmp
		If $sClassTmp <> ''            Then $_sClass        = $sClassTmp
		$aClass[0] = $_sClass
		$aClass[1] = $aClass_Methods
		$aClass[2] = $aClass_Props
		$aClass[3] = $aMembers
		$aClass_MethodsTmp = ''
		$aClass_PropsTmp   = ''
		$sClassTmp         = ''
		Return $aClass
	Else
		$sClassTmp = $_sClass                              ; == zu verwendender KlassenObjekt-Name
		Local $aTmp = Execute('$' & $_sIndexClass)         ; == alle zu vererbenden Informationen aus der "Index-Klasse" abfragen (Methoden und Eigenschaften)
		$aClass_MethodsTmp = $aTmp[1]
		$aClass_PropsTmp   = $aTmp[2]
		Return _BAO_Class_Create($_sClass)
	EndIf
EndFunc  ;==>_BAO_Class_Create

;===============================================================================
; Function Name....: _BAO_Class_MethodSet
; Description......: weist einer Klasse eine Methode oder löscht sie, gültig für alle Mitglieder der Klasse
; Parameter(s).....: $_aClass    die mit "_BAO_Class_Create" erstellte Klasse
; .................: $_sMethod   Name der Methode
;*********************************************************************************************************
; HINWEIS: Als erster Parameter sind ZWINGEND alle Methoden mit "$_self" zu versehen.
;          In der Funktion zum Aufruf der Methode wird an diesen Paramter das aufrufende Objekt übergeben.
;          Somit kann in den Methoden auf die Properties des KlassenObjektes zugegriffen werden.
;          ZUSÄTZLICHE Parameter werden von der aufrufenden Funktion ("_BAO_Class_ObjMethodCall")
;          IMMER als Array übergeben!!
;*********************************************************************************************************
; ........optional.: $iDelete    "1" - Löscht die Methode aus der Klasse (Standard: 0, nicht Löschen)
; Return Value(s)..: Erfolg      nichts
; .................: Fehler      -1 set @error=1 - Methode kann nicht zugewiesen werden, existiert bereits
; .................:                    @error=2 - zu Löschende Methode ist nicht vorhanden
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_MethodSet(ByRef $_aClass, $_sMethod, $iDelete=0) ; == Parameter: Klassen-Array, Methode als String
	Local $aMethods = $_aClass[1], $fFound = False         ; == das Methoden-Array zum Bearbeiten aus dem Klassen-Array auslesen
	If $aMethods[0] > 0 Then                               ; == suchen ob Methode vorhanden ==> dann Löschen
		For $i = 1 To $aMethods[0]
			If $aMethods[$i] = $_sMethod Then
				$fFound = True
				If $iDelete = 1 Then
					_ArrayDelete($aMethods, $i)
					$aMethods[0] -= 1
					$_aClass[1] = $aMethods
					Return
				Else
					Return SetError(1,0,-1)
				EndIf
				ExitLoop
			EndIf
		Next
		If $iDelete = 1 And Not $fFound Then Return SetError(2,0,-1)
	EndIf
	$aMethods[0] += 1                                      ; == Anzahl Methoden um 1 erhöhen
	ReDim $aMethods[$aMethods[0]+1]                        ; == Array vergrößern
	$aMethods[$aMethods[0]] = $_sMethod                    ; == Methode eintragen
	$_aClass[1] = $aMethods                                ; == bearbeitetes Methoden-Array zurückschreiben in Klassen-Array
EndFunc  ;==>_BAO_Class_MethodSet

;===============================================================================
; Function Name....: _BAO_Class_PropSet
; Description......: Properties der Klasse Erstellen und/oder Ändern, Löschen, gültig für alle Mitglieder dieser Klasse
; Parameter(s).....: $_aClass   die mit "_BAO_Class_Create" erstellte Klasse
; .................: $_sProp    Name der Property
; ........optional.: $_vProp    Wert der Property
; ........optional.: $iDelete   "1" - Löscht die Property aus der Klasse (Standard: 0, nicht Löschen)
; Return Value(s)..: Erfolg     nichts
; .................: Fehler     -1 set @error=1 - zu Löschende Property ist nicht vorhanden
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_PropSet(ByRef $_aClass, $_sProp, $_vProp='', $iDelete=0) ; == Parameter: Klassen-Array, Eigenschaft als String, [optional] Wert der Eigenschaft
	Local $aProps = $_aClass[2], $fFound = False           ; == das Properties-Array zum Bearbeiten aus dem Klassen-Array auslesen
	If $aProps[0][0] > 0 Then                              ; == suchen ob Property vorhanden ==> dann Aktualisieren od. Löschen
		For $i = 1 To $aProps[0][0]
			If $aProps[$i][0] = $_sProp Then
				$fFound = True
				If $iDelete = 1 Then
					_ArrayDelete($aProps, $i)
					$aProps[0][0] -= 1
				Else
					$aProps[$i][1] = $_vProp
				EndIf
				ExitLoop
			EndIf
		Next
		If $iDelete = 1 And Not $fFound Then Return SetError(1,0,-1)
		If $fFound Then
			$_aClass[2] = $aProps
			Return
		EndIf
	EndIf
	$aProps[0][0] += 1                                     ; == Anzahl Properties um 1 erhöhen
	ReDim $aProps[$aProps[0][0]+1][2]                      ; == Array vergrößern
	$aProps[$aProps[0][0]][0] = $_sProp                    ; == Eigenschaft eintragen
	$aProps[$aProps[0][0]][1] = $_vProp                    ; == Wert eintragen
	$_aClass[2] = $aProps                                  ; == bearbeitetes Properties-Array zurückschreiben in Klassen-Array
EndFunc  ;==>_BAO_Class_PropSet

;===============================================================================
; Function Name....: _BAO_Class_ObjCreate
; Description......: Erstellt ein Objekt einer Klasse oder löscht es aus der Klasse
; Parameter(s).....: $_aClass   die mit "_BAO_Class_Create" erstellte Klasse
; .................: $_sName    Name des KlassenObjektes
; ........optional.: $iDelete   "1" - Löscht das Objekt aus der Klasse (Standard: 0, nicht Löschen)
; Requirement(s)...: Die Variable zum Aufnehmen des KlassenObjektes MUSS ZWINGEND identisch mit dem KlassenObjekt-Namen sein! ("$" & "KlassenObjekt-Name")
; Return Value(s)..: Erfolg     Array, das das KlassenObjekt repräsentiert
; .................: Fehler     -1 set @error=1 - Objekt kann nicht erstellt werden, existiert bereits
; .................:                   @error=2 - zu Löschendes Objekt ist nicht vorhanden
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_ObjCreate(ByRef $_aClass, $_sName, $iDelete=0) ; == Parameter: Klassen-Array, Name des Klassen-Objektes als String
	Local $aClassObj_Methods[1] = [0]                      ; == Array zur Aufnahme der Methoden erstellen mit Anzahl der akt. Methoden als erstem Element
	Local $aClassObj_Props[1][2] = [[0]]                   ; == 2D-Array zur Aufnahme der Properties erstellen mit Anzahl der akt. Properties als erstem Element, [['property','value']]
	Local $objClass[4] = [$_sName, $_aClass[0], $aClassObj_Methods, $aClassObj_Props] ; == [Objektname, Klassenname, Array Objekt-Methoden, Array Objekt-Properties]
	Local $aMembers = $_aClass[3], $fFound = False
	If $aMembers[0] > 0 Then
		For $i = 1 To $aMembers[0]
			If $aMembers[$i] = $_sName Then
				$fFound = True
				If $iDelete = 1 Then
					_ArrayDelete($aMembers, $i)
					$aMembers[0] -= 1
					$_aClass[3] = $aMembers
					Return
				Else
					Return SetError(1,0,-1)
				EndIf
				ExitLoop
			EndIf
		Next
		If $iDelete = 1 And Not $fFound Then Return SetError(2,0,-1)
	EndIf
	$aMembers[0] += 1
	ReDim $aMembers[$aMembers[0]+1]
	$aMembers[$aMembers[0]] = $_sName
	$_aClass[3] = $aMembers
	Return $objClass
EndFunc  ;==>_BAO_Class_ObjCreate

;===============================================================================
; Function Name....: _BAO_Class_ObjMethodSet
; Description......: weist einem KlassenObjekt eine Methode zu oder löscht sie, gültig nur für dieses KlassenObjekt
; Parameter(s).....: $_objClass   das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt
; .................: $_sMethod    Name der Methode
;*********************************************************************************************************
; HINWEIS: Als erster Parameter sind ZWINGEND alle Methoden mit "$_self" zu versehen.
;          In der Funktion zum Aufruf der Methode wird an diesen Paramter das aufrufende Objekt übergeben.
;          Somit kann in den Methoden auf die Properties des KlassenObjektes zugegriffen werden.
;          ZUSÄTZLICHE Parameter werden von der aufrufenden Funktion ("_BAO_Class_ObjMethodCall")
;          IMMER als Array übergeben!!
;          Methoden des KlassenObjektes werden beim Aufruf IMMER mit einem 2-ten Parameter, einem Array,
;          aufgerufen. Dieses Array enthält an Array[0] ein Flag für das Überladen (0/1 = nein/ja).
;          Um Fehler zu vermeiden einfach immer mit 2 Parametern deklarieren:
;          Func MeineMethode($_self, $_aParam=0)    <== so gibt es keine Fehler
;*********************************************************************************************************
; ........optional.: $iDelete    "1" - Löscht die Methode aus dem KlassenObjekt (Standard: 0, nicht Löschen)
; Return Value(s)..: Erfolg      nichts
; .................: Fehler      -1 set @error=1 - Methode kann nicht zugewiesen werden, existiert bereits
; .................:                    @error=2 - zu Löschende Methode ist nicht vorhanden
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_ObjMethodSet(ByRef $_objClass, $_sMethod, $iDelete=0)  ; == Parameter: Klassen-Objekt, Methode als String
	Local $aMethods = $_objClass[2], $fFound = False       ; == das Methoden-Array zum Bearbeiten aus dem KlassenObjekt-Array auslesen
	If $aMethods[0] > 0 Then                               ; == suchen ob Methode vorhanden ==> dann Löschen
		For $i = 1 To $aMethods[0]
			If $aMethods[$i] = $_sMethod Then
				$fFound = True
				If $iDelete = 1 Then
					_ArrayDelete($aMethods, $i)
					$aMethods[0] -= 1
					$_objClass[2] = $aMethods
					Return
				Else
					Return SetError(1,0,-1)
				EndIf
				ExitLoop
			EndIf
		Next
		If $iDelete = 1 And Not $fFound Then Return SetError(2,0,-1)
	EndIf
	$aMethods[0] += 1                                      ; == Anzahl Methoden um 1 erhöhen
	ReDim $aMethods[$aMethods[0]+1]                        ; == Array vergrößern
	$aMethods[$aMethods[0]] = $_sMethod                    ; == Methode eintragen
	$_objClass[2] = $aMethods                              ; == bearbeitetes Methoden-Array zurückschreiben in KlassenObjekt-Array
EndFunc  ;==>_BAO_Class_ObjMethodSet

;===============================================================================
; Function Name....: _BAO_Class_ObjPropSet
; Description......: Properties des KlassenObjektes Erstellen und/oder ändern, Löschen, gültig nur für dieses KlassenObjekt
; Parameter(s).....: $_objClass   das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt
; .................: $_sProp      Name der Property
; ........optional.: $_vProp      Wert der Property
; ........optional.: $iDelete     "1" - Löscht die Property aus dem KlassenObjekt (Standard: 0, nicht Löschen)
; Return Value(s)..: Erfolg       nichts
; .................: Fehler       -1 set @error=1 - zu Löschende Property ist nicht vorhanden
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_ObjPropSet(ByRef $_objClass, $_sProp, $_vProp='', $iDelete=0) ; == Parameter: KlassenObjekt, Eigenschaft als String, [optional] Wert der Eigenschaft
	If Not IsArray($_objClass) Then $_objClass = Execute('$' & $_objClass)


	Local $aProps = $_objClass[3], $fFound = False         ; == das Properties-Array zum Bearbeiten aus dem KlassenObjekt-Array auslesen
	If $aProps[0][0] > 0 Then                              ; == suchen ob Property vorhanden ==> dann Aktualisieren od. Löschen
		For $i = 1 To $aProps[0][0]
			If $aProps[$i][0] = $_sProp Then
				$fFound = True
				If $iDelete = 1 Then
					_ArrayDelete($aProps, $i)
					$aProps[0][0] -= 1
				Else
					$aProps[$i][1] = $_vProp
				EndIf
				ExitLoop
			EndIf
		Next
		If $iDelete = 1 And Not $fFound Then Return SetError(1,0,-1)
		If $fFound Then
			$_objClass[3] = $aProps
			Return
		EndIf
	EndIf
	$aProps[0][0] += 1                                     ; == Anzahl Properties um 1 erhöhen
	ReDim $aProps[$aProps[0][0]+1][2]                      ; == Array vergrößern
	$aProps[$aProps[0][0]][0] = $_sProp                    ; == Eigenschaft eintragen
	$aProps[$aProps[0][0]][1] = $_vProp                    ; == Wert eintragen
	$_objClass[3] = $aProps                                ; == bearbeitetes Properties-Array zurückschreiben in KlassenObjekt-Array
EndFunc  ;==>_BAO_Class_ObjPropSet

;===============================================================================
; Function Name....: _BAO_Class_ObjGet
; Description......: Gibt Informationen zu einem KlassenObjekt/ der Klasse des Objektes zurück
; Parameter(s).....: $_objClass      das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt (alternativ der Name des Objektes) oder die Klasse
; .................: $_sWhat         welche Info wird angefordert
; .................:                 mögl. Werte:
; .................:                  "about"       gibt alle vorhandenen Informationen zur Klasse aus als 2D-Array: [[name], [class], [Lokale_Meth,..,..], [Globale_Meth,..,..], [Lokale_Props,..,..], [Globale_Props,..,..], [Member,..]]
; .................:                  "count"       gibt die Anzahl der Klassenmitglieder zurück
; .................:                  "members"     gibt ein Array mit den Namen der Klassenmitglieder zurück
; .................:                  "name"        gibt den Name des Klassenobjektes zurück
; .................:                  "class"       gibt den Name der Klasse zurück
; .................:                  "methods_l"   gibt ein    Array aller Lokalen  Methoden   zurück
; .................:                  "methods_g"   gibt ein    Array aller Globalen Methoden   zurück
; .................:                  "props_l"     gibt ein 2D-Array aller Lokalen  Properties zurück
; .................:                  "props_g"     gibt ein 2D-Array aller Globalen Properties zurück
; .................:                  alles_andere  Abfrage bezieht sich auf eine einzelne Property
; ........optional.: $_sAlternative  wird eine abgefragte Property nicht gefunden, wird der hier hinterlegte Wert zurückgegeben (Standard: -1)
; Return Value(s)..: Ergebnis der Abfrage
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_ObjGet($_objClass, $_sWhat, $_sAlternative=-1) ; == Parameter: Klassen-Objekt, Abfragebegriff als String, "$_sAlternative": bei Abfrage einer Propertie - wenn nicht gefunden wird dieser Alternativwert zurückgegeben (Standard: -1)
	Local $aClass = Execute('$' & Execute('$_objClass[1]'))    ; == Zugriff auf das Klassenarray über den im Klassenobjekt hinterlegten Klassennamen [name, Array-Meth, Arr-Props, Array-Member]
	Local $vRet, $aProps, $fFound = False, $aAbout[7][2], $aTmp, $fIsClass = False
	If Not IsArray($aClass) Then
		If IsArray($_objClass) Then
			$fIsClass = True                                   ; == $_objClass ist kein KlassenObjekt, sondern die Klasse selbst
		Else
			$_objClass = Execute('$' & $_objClass)
			$aClass = Execute('$' & Execute('$_objClass[1]'))
		EndIf
	EndIf
	Switch $_sWhat                                             ; == was wird abgefragt
		Case 'about'                                           ; == Alle Informationen zum KlassenObjekt/ zur Klasse abfragen
			If $fIsClass Then
				ReDim $aAbout[4][2]                            ; == [Klassenname, Array-Methoden, Array-Properties, Array-KlassenObjekte]
				$aAbout[0][0] = $_objClass[0]                  ; == Klassen-Name
				$aTmp = $_objClass[1]                          ; == Globale Methoden
				If $aTmp[0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[4][$aTmp[0]]
					For $i = 1 To $aTmp[0]
						$aAbout[1][$i-1] = $aTmp[$i]
					Next
				EndIf
				$aTmp = $_objClass[2]                          ; == Globale Properties (nur Namen, keine Werte)
				If $aTmp[0][0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[4][$aTmp[0][0]]
					For $i = 1 To $aTmp[0][0]
						$aAbout[2][$i-1] = $aTmp[$i][0]
					Next
				EndIf
				$aTmp = $_objClass[3]                          ; == Member
				If $aTmp[0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
					For $i = 1 To $aTmp[0]
						$aAbout[3][$i-1] = $aTmp[$i]
					Next
				EndIf
			Else
				$aAbout[0][0] = $_objClass[0]                  ; == Objekt-Name
				$aAbout[1][0] = $_objClass[1]                  ; == Klassen-Name
				$aTmp = $_objClass[2]                          ; == Lokale Methoden
				If $aTmp[0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
					For $i = 1 To $aTmp[0]
						$aAbout[2][$i-1] = $aTmp[$i]
					Next
				EndIf
				$aTmp = $aClass[1]                             ; == Globale Methoden
				If $aTmp[0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
					For $i = 1 To $aTmp[0]
						$aAbout[3][$i-1] = $aTmp[$i]
					Next
				EndIf
				$aTmp = $_objClass[3]                          ; == Lokale Properties (nur Namen, keine Werte)
				If $aTmp[0][0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[6][$aTmp[0][0]]
					For $i = 1 To $aTmp[0][0]
						$aAbout[4][$i-1] = $aTmp[$i][0]
					Next
				EndIf
				$aTmp = $aClass[2]                             ; == Globale Properties (nur Namen, keine Werte)
				If $aTmp[0][0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0][0] Then ReDim $aAbout[6][$aTmp[0][0]]
					For $i = 1 To $aTmp[0][0]
						$aAbout[5][$i-1] = $aTmp[$i][0]
					Next
				EndIf
				$aTmp = $aClass[3]                             ; == Member
				If $aTmp[0] > 0 Then
					If UBound($aAbout,2) < $aTmp[0] Then ReDim $aAbout[6][$aTmp[0]]
					For $i = 1 To $aTmp[0]
						$aAbout[6][$i-1] = $aTmp[$i]
					Next
				EndIf
			EndIf
			$vRet = $aAbout
		Case 'count'                                       ; == Anzahl der Mitglieder der Klasse ausgeben
			If $fIsClass Then
				$aTmp = $_objClass[3]
				Return $aTmp[0]
			EndIf
			$aTmp = $aClass[3]
			$vRet = $aTmp[0]
		Case 'members'                                     ; == Mitglieder der Klasse ausgeben (Array)
			If $fIsClass Then Return $_objClass[3]
			$aTmp = $aClass[3]
			$vRet = $aTmp
		Case 'name'                                        ; == Name des KlassenObjektes ausgeben
			If $fIsClass Then Return $_objClass[0]         ; == bei Klasse, der Name der Klasse
			$vRet = $_objClass[0]
		Case 'class'                                       ; == Name der Klasse ausgeben
			If $fIsClass Then Return
			$vRet = $_objClass[1]
		Case 'methods_g'                                   ; == das Methoden-Array aus dem Klassen-Array auslesen
			If $fIsClass Then Return $_objClass[1]
			$vRet = $aClass[1]
		Case 'props_g'                                     ; == das Properties-Array aus dem Klassen-Array auslesen
			If $fIsClass Then Return $_objClass[2]
			$vRet = $aClass[2]
		Case 'methods_l'                                   ; == das Methoden-Array aus dem KlassenObjekt-Array auslesen
			If $fIsClass Then Return
			$vRet = $_objClass[2]
		Case 'props_l'                                     ; == das Properties-Array aus dem KlassenObjekt-Array auslesen
			If $fIsClass Then Return
			$vRet = $_objClass[3]
		Case Else                                          ; == alles andere ist eine Abfrage zu einer einzelnen Eigenschaft (Lokal oder Global)
			If Not $fIsClass Then
				$aProps = $_objClass[3]                    ; == Priorität beachten, zuerst Lokal abfragen
				If $aProps[0][0] > 0 Then
					For $i = 1 To $aProps[0][0]
						If $aProps[$i][0] = $_sWhat Then
							$vRet = $aProps[$i][1]
							$fFound = True
							ExitLoop
						EndIf
					Next
				EndIf
			EndIf
			If Not $fFound Then
				If $fIsClass Then
					$aProps = $_objClass[2]
				Else
					$aProps = $aClass[2]                   ; == danach global abfragen
				EndIf
				If $aProps[0][0] > 0 Then
					For $i = 1 To $aProps[0][0]
						If $aProps[$i][0] = $_sWhat Then
							$vRet = $aProps[$i][1]
							$fFound = True
							ExitLoop
						EndIf
					Next
				EndIf
				If Not $fFound Then $vRet = $_sAlternative ; == abgefragte Property gibt es nicht
			EndIf
	EndSwitch
	Return $vRet
EndFunc  ;==>_BAO_Class_ObjGet

;===============================================================================
; Function Name....: _BAO_Class_ObjMethodCall
; Description......: Aufruf von Methoden
; Parameter(s).....: $_objClass   das mit "_BAO_Class_ObjCreate" erstellte KlassenObjekt
; .................: $_sMethod    Name der Methode
; ........optional.: $_vParam     Parameter, der übergeben werden soll (bei mehreren Parametern ein Array übergeben)
; Note.............: Diese Funktion übergibt IMMER als ersten Parameter den Namen des aufrufenden Objektes an die Methode.
; .................: Alle weiteren Parameter (auch wenn es nur einer ist) werden als ARRAY an die Methode übergeben.
; .................: Dies ist bei der Erstellung der Methoden unbedingt zu berücksichtigen.
; Return Value(s)..: Erfolg      Der Rückgabewert der aufgerufenen Methode
; .................: Fehler      -1  set @error=1
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _BAO_Class_ObjMethodCall(ByRef $_objClass, $_sMethod, $_vParam='')
	Local $aParam[2] = [0], $fFound = False                ; == $aParam wird als zweiter Parameter dem Aufruf übergeben, erstes Element =1 signalisiert Lokalen Aufruf
	If Not IsArray($_objClass) Then $_objClass = Execute('$' & $_objClass)
	If Not IsArray($_vParam) Then
		$aParam[1] = $_vParam
	Else
		$aParam = $_vParam
		_ArrayInsert($aParam, 0, 0)
	EndIf
	Local $aMethods = $_objClass[2]                        ; == zuerst bei den Lokalen Methoden nachschauen
	If $aMethods[0] > 0 Then
		For $i = 1 To $aMethods[0]
			If $aMethods[$i] = $_sMethod Then
				$fFound = True
				$aParam[0] = 1                             ; == Methode ist Lokal registriert, ParameterArray[0] = 1
				ExitLoop
			EndIf
		Next
	EndIf
	If Not $fFound Then                                    ; == dann bei den Globalen
		Local $aClass = Execute('$' & Execute('$_objClass[1]'))
		$aMethods = $aClass[1]
		If $aMethods[0] > 0 Then
			For $i = 1 To $aMethods[0]
				If $aMethods[$i] = $_sMethod Then
					$fFound = True
					ExitLoop
				EndIf
			Next
		EndIf
	EndIf
	If Not $fFound Then Return SetError(1,0,-1)            ; == Aufruf enthält keine gültige Methode
	If $_vParam = '' And $aParam[0] = 0 Then               ; == kein Parameter übergeben, kein Lokaler Aufruf
		Return Call($_sMethod, $_objClass)                 ; == evtl. Rückgabewert der Funktion wird ausgegeben
	Else
		Return Call($_sMethod, $_objClass, $aParam)        ; == evtl. Rückgabewert der Funktion wird ausgegeben
	EndIf
EndFunc  ;==>_BAO_Class_ObjMethodCall

