Code: Select all
sPrefix.s = "CLASS_"
sClassName.s = InputRequester("Class name", "Class name:", sPrefix)
sClassFile.s = SaveFileRequester("Save .class.pbi file", LCase(Mid(sClassName, Len(sPrefix) + 1, Len(sClassName) - Len(sPrefix)) + ".class.pbi"), "pbi|*.pbi", 0)
If sClassFile = "" : End : EndIf
sTemplateText.s = PeekS(?template)
sTemplateText = ReplaceString(sTemplateText, "<#classname#>", sClassName)
If CreateFile(1, sClassFile)
WriteString(1, sTemplateText)
CloseFile(1)
MessageRequester("Complete!", "File:" + Chr(10) + sClassFile, #MB_OK | #MB_ICONINFORMATION)
Else
MessageRequester("Fatal error!", "File" + Chr(10) + sClassFile + Chr(10) + "not created!", #MB_OK | #MB_ICONERROR)
EndIf
DataSection
template:
IncludeBinary "templatebase.pb"
EndDataSection
Code: Select all
; Class <#classname#>
; Generated by SofT MANiAC's ClassMaker
;- structures
Structure <#classname#>_PROPS
dummyProp.l
EndStructure
Interface <#classname#>
; constructor
<#classname#>(dummyConstructorParam.l)
; destructor
Release()
; methods
DummyMethod(dummyMethodParam.l)
EndInterface
Structure s<#classname#>
; virt table
*vt.l
; attributes
props.<#classname#>_PROPS
EndStructure
Declare.l Construct<#classname#>(dummyConstructorParam.l)
Declare.l <#classname#>_Release(*this)
Global _VT_<#classname#>
;- constructor
Procedure <#classname#>_<#classname#>(*this.s<#classname#>, dummyConstructorParam.l)
Protected *thisM.<#classname#> = *this
; *this\props\dummyProp = dummyConstructorParam
; MessageRequester("Input param is:", Str(dummyConstructorParam), #MB_OK)
; MessageRequester("Construction...", "...complete!", #MB_OK)
; ProcedureReturn #True
EndProcedure
;- destructor
Procedure <#classname#>_Release(*this.s<#classname#>)
Protected *thisM.<#classname#> = *this
; MessageRequester("Destruction...", "...complete!", #MB_OK)
; ProcedureReturn #True
EndProcedure
;- DummyMethod
Procedure <#classname#>_DummyMethod(*this.s<#classname#>, dummyMethodParam.l)
Protected *thisM.<#classname#> = *this
MessageRequester("Input param is:", Str(dummyMethodParam), #MB_OK)
Protected ouput.l = *this\props\dummyProp
MessageRequester("Output param is:", Str(ouput), #MB_OK)
ProcedureReturn ouput
EndProcedure
Procedure Construct<#classname#>(dummyConstructorParam.l)
Protected *this.s<#classname#> = AllocateMemory(SizeOf(s<#classname#>))
Protected *thisM.<#classname#> = *this
If Not *this : ProcedureReturn #False : EndIf
If Not _VT_<#classname#> And SizeOf(<#classname#>)
_VT_<#classname#> = AllocateMemory(SizeOf(<#classname#>)) ; Global virtual table
; constructor
CompilerIf Defined(<#classname#>_<#classname#>, #PB_Procedure)
PokeL(_VT_<#classname#> + OffsetOf(<#classname#>\<#classname#>()), @<#classname#>_<#classname#>())
CompilerEndIf
; destructor
CompilerIf Defined(<#classname#>_Release, #PB_Procedure)
PokeL(_VT_<#classname#> + OffsetOf(<#classname#>\Release()), @<#classname#>_Release())
CompilerEndIf
; other methods here
CompilerIf Defined(<#classname#>_DummyMethod, #PB_Procedure)
PokeL(_VT_<#classname#> + OffsetOf(<#classname#>\DummyMethod()), @<#classname#>_DummyMethod())
CompilerEndIf
EndIf
*this\vt = _VT_<#classname#>
CompilerIf Defined(<#classname#>_<#classname#>, #PB_Procedure) = #True
<#classname#>_<#classname#>(*this, dummyConstructorParam)
CompilerEndIf
ProcedureReturn *this
EndProcedure
; declaration
; dummyConstructorParam.l = 23
; Global *IS_Dummy.<#classname#> = construct<#classname#>(dummyConstructorParam)
; accessing methods
; dummyMethodParam.l = 87
; debug *IS_Dummy\DummyMethod(dummyMethodParam)
; deleting
; *IS_Dummy\Release() : FreeMemory(*IS_Dummy) : *IS_Dummy = 0
I use it, because Dreamotion3D conflicts with PureObject
Preprocessor tools (eg PureObject) are really cool, but not always comfortable.
Native OOP support would be great