ECOBU ;BP/CMF - Utility Object ;8/21/2015
 ;;2.0;EVENT CAPTURE;**100,129**;8 May 96;Build 7
 ;@author  - Chris Flegel
 ;@date    - 17 May 2009
 ;@version - 1.0
 ;;
 Q
 ;; private methods
HANDLERS(RESULT,HANDLE,METHOD,PARAMS) ;;
 ; find & execute handlers
 N PROPERTY,HANDLES,FOUND,HANDLER,EXECUTER
 S RESULT="-1^Invalid method"
 I $E(METHOD,1,3)="Get" D 
 .D PARSE("Get",METHOD)
 .S PARAMS=PROPERTY_"."_PARAMS
 .S METHOD="Get"
 .Q
 I $E(METHOD,1,3)="Set" D 
 .D PARSE("Set",METHOD)
 .S PARAMS=PROPERTY_"."_PARAMS
 .S METHOD="Set"
 .Q
 I $E(METHOD,1,4)="Show" D 
 .D PARSE("Show",METHOD)
 .S PARAMS=PROPERTY_"."_PARAMS
 .S METHOD="Show"
 .Q
 D METHOD(.HANDLER,HANDLE_".Methods.Find1."_METHOD)
 D METHOD^ECOBM(.EXECUTER,HANDLER_".GetHandler")
 I $G(EXECUTER)="" Q  ;EC*129
 I ($P(EXECUTER,"^")=0)!($P(EXECUTER,"^")=-1) Q  ;EC*129
 D @EXECUTER
 Q
 ;;
OBM(RESULT,ARGUMENT) ;shortcut to method class
 D METHOD^ECOBM(.RESULT,ARGUMENT) Q
 ;;
OBP(RESULT,ARGUMENT) ;shortcut to property class
 D METHOD^ECOBP(.RESULT,ARGUMENT) Q
 ;;
OB2(RESULT,ARGUMENT) ;shortcut to utility class
 D METHOD^ECOB2(.RESULT,ARGUMENT) Q
 ;;
ECOB30(RESULT,HANDLE,PARAMS) ;handler for collect object
 N CHILD
 D GET^ECOB(.CHILD,HANDLE,"Pu","Collect")
 D METHOD^ECOB30(.RESULT,CHILD_"."_PARAMS)
 Q
 ;;
ECOBL(RESULT,HANDLE,METHOD,PARAMS) ;handler for simple list
 N CHILD
 D GET^ECOB(.CHILD,HANDLE,"Pu",METHOD)
 D METHOD^ECOBL(.RESULT,CHILD_"."_PARAMS)
 Q
 ;;
ECOBMC(RESULT,HANDLE,PARAMS) ;handler for method collection
 N CHILD
 D GET^ECOB(.CHILD,HANDLE,"Pu","Methods")
 D METHOD^ECOBMC(.RESULT,CHILD_"."_PARAMS)
 Q
 ;;
ECOBPC(RESULT,HANDLE,PARAMS) ;handler for property collection
 N CHILD
 D GET^ECOB(.CHILD,HANDLE,"Pu","Properties")
 D METHOD^ECOBPC(.RESULT,CHILD_"."_PARAMS)
 Q 
 ;;
ECOBM(RESULT,HANDLE,PARAMS) ;; pass-through
 D OBM(.RESULT,HANDLE_"."_PARAMS) Q
 ;;
ECOB2(RESULT,HANDLE,PARAMS) ;; pass-through
 D OB2(.RESULT,HANDLE_"."_PARAMS) Q
 ;;
ECOBP(RESULT,HANDLE,PARAMS) ; pass-through
 D OBP(.RESULT,HANDLE_"."_PARAMS) Q
 ;;
DIAGHDR(VALUE,WIDTH) ;;
 N I,J
 S J=WIDTH-$L(VALUE)-1
 W !," "_VALUE_" "
 F J=1:1:J W "-"
 W "+"
 Q
DIAGSGMT(VALUE,WIDTH) ;;
 N I,J,OUT,FILL
 S J=WIDTH-$L(VALUE)
 S OUT=" + "_VALUE_" "
 S FILL=""
 F J=1:1:J S FILL=FILL_"-"
 S OUT=$E(OUT_FILL,1,WIDTH)_" |"
 W !,OUT
 Q
DIAGATTR(VALUE,WIDTH) ;;
 N I,J,OUT,FILL
 S J=WIDTH-$L(VALUE)
 S OUT=" | * "_VALUE
 D:$L(VALUE)<WIDTH
 .S FILL=""
 .F J=1:1:J S FILL=FILL_" "
 .S OUT=$E(OUT_FILL,1,WIDTH)_" |"
 .Q
 W !,OUT
 Q
DIAGFTR(WIDTH) ;;
 N I,J,OUT,FILL
 S J=WIDTH
 S OUT=" + "
 S FILL=""
 F J=1:1:J S FILL=FILL_"-"
 S OUT=$E(OUT_FILL,1,J)_" +"
 W !,OUT
 Q
 ;;
    ;;protected methods
CLASS(RESULT,HANDLE,PARAMS) ;handler for class info display
 N JUSTIFY,OFFSET,X,METH,PROP,ITEM
 D PARSE("Offset",PARAMS)
 D SHOW^ECOB(.X,HANDLE,"Pu","_class",JUSTIFY)
 ;;
 D SHOW^ECOB(.X,HANDLE,"Pu","Methods",JUSTIFY)
 D METHOD(.X,HANDLE_".Methods.Info."_OFFSET)
 D SHOW^ECOB(.X,HANDLE,"Pu","Methods",JUSTIFY_"/")
 ;;
 D SHOW^ECOB(.X,HANDLE,"Pu","Properties",JUSTIFY)
 D METHOD(.X,HANDLE_".Properties.Info."_OFFSET)
 D SHOW^ECOB(.X,HANDLE,"Pu","Properties",JUSTIFY_"/")
 ;;
 D SHOW^ECOB(.X,HANDLE,"Pu","Root",JUSTIFY)
 D METHOD(.X,HANDLE_".Root.Info."_OFFSET)
 D SHOW^ECOB(.X,HANDLE,"Pu","Root",JUSTIFY_"/")
 ;;
 D SHOW^ECOB(.X,HANDLE,"Pu","_class",JUSTIFY_"/")
 S RESULT=1
 Q
 ;;
CLEAR(RESULT,HANDLE,PARAMS) ; restore object to default state
 N PROPERTY,DEFAULT,X
 D METHOD(.PROPERTY,HANDLE_".Properties.First")
 F  Q:PROPERTY="-1^End of list"  D
 .D OBP(.DEFAULT,PROPERTY_".GetDefaultValue")
 .D OBP(.X,PROPERTY_".SetValue."_DEFAULT)
 .D METHOD(.PROPERTY,HANDLE_".Properties.Next")
 S RESULT=1
 Q
 ;
DIAGRAM(RESULT,HANDLE,PARAMS) ; draw class diagram
 N CLASS,X,WIDTH,METHOD,PROPERTY,EXTEND,COLLECT,NAME
 D GET^ECOB(.CLASS,HANDLE,"Pu","_class")
 S X=$L(CLASS)+2
 S WIDTH=$S(X<20:20,X<40:40,X<60:60,1:70)
 D DIAGHDR(CLASS,WIDTH)
 ;;
 D DIAGSGMT("Methods",WIDTH)
 D METHOD(.METHOD,HANDLE_".Methods.First")
 F  Q:METHOD="-1^End of list"  D
 .D OBM(.NAME,METHOD_".GetName")
 .D DIAGATTR(NAME,WIDTH)
 .D METHOD(.METHOD,HANDLE_".Methods.Next")
 .Q
 ;;
 D DIAGSGMT("Properties",WIDTH)
 D METHOD(.PROPERTY,HANDLE_".Properties.First")
 F  Q:PROPERTY="-1^End of list"  D
 .D OBP(.NAME,PROPERTY_".GetName")
 .D DIAGATTR(NAME,WIDTH)
 .D METHOD(.PROPERTY,HANDLE_".Properties.Next")
 .Q
 ;;
 D DIAGSGMT("Extends",WIDTH)
 D METHOD(.EXTEND,HANDLE_".Root.First")
 F  Q:EXTEND="-1^End of list"  D
 .D:EXTEND'=CLASS DIAGATTR(EXTEND,WIDTH)
 .D METHOD(.EXTEND,HANDLE_".Root.Next")
 .Q
 D DIAGFTR(WIDTH)
 S RESULT=1
 Q
 ;
GET(RESULT,HANDLE,METHOD,PARAMS)  ;
 N PROPERTY,PROP
 S RESULT="-1^Invalid property"
 S PROPERTY=$P(PARAMS,".")
 D METHOD(.PROP,HANDLE_".Properties.Find1."_PROPERTY)
 D:PROP'="" OBP(.RESULT,PROP_".GetValue")
 Q
 ;;
INFO(RESULT,HANDLE,PARAMS) ;handler for business info display
 N JUSTIFY,OFFSET,PROPERTY
 D PARSE("Offset",PARAMS)
 W !,$J("Name : ",JUSTIFY),"Value"
 W !,$J("-----|-",JUSTIFY),"-----"
 D METHOD(.PROPERTY,HANDLE_".Properties.First")
 F  Q:PROPERTY="-1^End of list"  D
 .D OBP(.NAME,PROPERTY_".GetName")
 .D METHOD(.RESULT,HANDLE_".Show"_NAME_"."_JUSTIFY)
 .D METHOD(.PROPERTY,HANDLE_".Properties.Next")
 .Q
 S RESULT=1
 ;;
PARSE(PARSE,VALUE)  ;
 I PARSE="Get" D  Q
 .S PROPERTY=$P(VALUE,".",1)
 .S PROPERTY=$P(PROPERTY,"Get",2)
 .Q
 I PARSE="Handle" D  Q
 .S HANDLE=$P(VALUE,".")
 .Q
 I PARSE="Handle1" D  Q
 .S NAME=$P(VALUE,".",1)
 .S COUNT=$P(VALUE,".",2)
 .Q
 I PARSE="Justify" D  Q
 .S JUSTIFY=$S(+VALUE:+VALUE,1:0)
 .Q
 I PARSE="Method" D  Q
 .S METHOD=$P(VALUE,".",2)
 .Q
 I PARSE="Offset" D  Q
 .S JUSTIFY=$S(+VALUE:+VALUE,1:0)
 .S OFFSET=JUSTIFY+5
 .Q
 I PARSE="Params" D  Q
 .S PARAMS=$P(VALUE,".",3,99)
 .Q
 I PARSE="Set" D  Q
 .S PROPERTY=$P(VALUE,".",1)
 .S PROPERTY=$P(PROPERTY,"Set",2)
 .S VALUE=$P(VALUE,".",2)
 .Q
 I PARSE="Show" D  Q
 .S PROPERTY=$P(VALUE,".",1)
 .S PROPERTY=$P(PROPERTY,"Show",2)
 .Q
 Q
 ;
SET(RESULT,HANDLE,METHOD,PARAMS)  ;
 N PROPERTY,PROP
 S RESULT="-1^Invalid property"
 S PROPERTY=$P(PARAMS,".")
 S PARAMS=$P(PARAMS,".",2,99)
 D METHOD(.PROP,HANDLE_".Properties.Find1."_PROPERTY)
 D:PROP'="" OBP(.RESULT,PROP_".SetValue."_PARAMS)
 Q
 ;
SHOW(RESULT,HANDLE,METHOD,PARAMS) ; show a property
 N JUSTIFY,PROPERTY
 S PROPERTY=$P(PARAMS,".")
 S PARAMS=$P(PARAMS,".",2,99)
 D METHOD(.RESULT,HANDLE_".Get"_PROPERTY)
 Q:RESULT="-1^Invalid property"
 S JUSTIFY=$S(+PARAMS:+PARAMS,1:0)
 W !,$J("<"_PROPERTY_"> : ",JUSTIFY),RESULT
 Q
 ;;
 ;; public methods
CREATE(NAME)  ;
 ; call parent first
 N HANDLE,CHILD,METHOD,PROPERTY,X
 S HANDLE=$$CREATE^ECOB(NAME)
 D SELF^ECOB(.RESULT,HANDLE,"EC OBU UTILITY","Utility","METHOD^ECOBU(.RESULT,ARGUMENT)","ECOB")
 ;;
 S CHILD=$$CREATE^ECOB30(NAME)
 D COLLECT^ECOB(HANDLE,CHILD,"Pu","Collect")
 D METHOD^ECOB30(.X,CHILD_".SetCollector."_HANDLE)
 ;;
 S CHILD=$$CREATE^ECOBMC(NAME)
 D COLLECT^ECOB(HANDLE,CHILD,"Pu","Methods")
 ;; default ClassDiagram method
 D METHOD(.METHOD,HANDLE_".Methods.Add.ClassDiagram")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Displays diagram of the class.")
 D OBM(.X,METHOD_".SetHandler.DIAGRAM^ECOBU(.RESULT,HANDLE,PARAMS)")
 D OBM(.X,METHOD_".SetParams.")
 D OBM(.X,METHOD_".SetReturns.1")
 ;;
 ;; default ClassInfo method
 D METHOD(.METHOD,HANDLE_".Methods.Add.ClassInfo")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Displays information about the class.")
 D OBM(.X,METHOD_".SetHandler.CLASS^ECOBU(.RESULT,HANDLE,PARAMS)")
 D OBM(.X,METHOD_".SetParams.[Justify]")
 D OBM(.X,METHOD_".SetReturns.1")
 ;; default Clear method
 D METHOD(.METHOD,HANDLE_".Methods.Add.Clear")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Restores public attributes to default state.")
 D OBM(.X,METHOD_".SetHandler.CLEAR^ECOBU(.RESULT,HANDLE,PARAMS)")
 D OBM(.X,METHOD_".SetParams.")
 D OBM(.X,METHOD_".SetReturns.1")
 ;; default Get method
 D METHOD(.METHOD,HANDLE_".Methods.Add.Get")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Gets a property value.")
 D OBM(.X,METHOD_".SetHandler.GET^ECOBU(.RESULT,HANDLE,METHOD,PARAMS)")
 D OBM(.X,METHOD_".SetParams.Get[propertyName]")
 D OBM(.X,METHOD_".SetReturns.Property.Value")
 ;; default Set method
 D METHOD(.METHOD,HANDLE_".Methods.Add.Set")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Sets a property value.")
 D OBM(.X,METHOD_".SetHandler.SET^ECOBU(.RESULT,HANDLE,METHOD,PARAMS)")
 D OBM(.X,METHOD_".SetParams.Set[propertyName].[Value]")
 D OBM(.X,METHOD_".SetReturns.1 if successful, -1 otherwise")
 ;;
 D METHOD(.METHOD,HANDLE_".Methods.Add.Show")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Displays a property value.")
 D OBM(.X,METHOD_".SetHandler.SHOW^ECOBU(.RESULT,HANDLE,METHOD,PARAMS)")
 D OBM(.X,METHOD_".SetParams.[Justify]")
 D OBM(.X,METHOD_".SetReturns.[Property.Name] : [Property.Value]")
 ;;
 D METHOD(.METHOD,HANDLE_".Methods.Add.Info")
 D OBM(.X,METHOD_".SetAddedByClass.Utility")
 D OBM(.X,METHOD_".SetDescription.Displays business information.")
 D OBM(.X,METHOD_".SetHandler.INFO^ECOBU(.RESULT,HANDLE,PARAMS)")
 D OBM(.X,METHOD_".SetParams.[Justify]")
 D OBM(.X,METHOD_".SetReturns.1")
 ;;
 S CHILD=$$CREATE^ECOBPC(NAME)
 D COLLECT^ECOB(HANDLE,CHILD,"Pu","Properties")
 ;;
 D METHOD(.PROPERTY,HANDLE_".Properties.Add._this")
 D OBP(.X,PROPERTY_".SetAddedByClass.Utility")
 D OBP(.X,PROPERTY_".SetValue."_HANDLE)
 D OBP(.X,PROPERTY_".SetDefaultValue."_HANDLE)
 ;;
 S CHILD=$$CREATE^ECOBL(NAME)
 D COLLECT^ECOB(HANDLE,CHILD,"Pu","Root")
 ;;
 D METHOD(.X,HANDLE_".Root.Add.EC BASE")
 D METHOD(.X,HANDLE_".Root.Add.EC OBU UTILITY")
 ; complex properties last
 Q HANDLE
 ;;
DESTROY(HANDLE)  ;
 ; call parent last
 N CHILD
 D GET^ECOB(.CHILD,HANDLE,"Pu","Collect")
 D DESTROY^ECOB30(CHILD)
 D GET^ECOB(.CHILD,HANDLE,"Pu","Methods")
 D DESTROY^ECOBMC(CHILD)
 D GET^ECOB(.CHILD,HANDLE,"Pu","Properties")
 D DESTROY^ECOBPC(CHILD)
 D GET^ECOB(.CHILD,HANDLE,"Pu","Root")
 D DESTROY^ECOBL(CHILD)
 Q $$DESTROY^ECOB(HANDLE)
 ;;
FUNCTION(HANDLE,ARGUMENT)  ;
 ; argument=method.(additional.params....)
 N RESULT
 D METHOD(.RESULT,HANDLE_"."_ARGUMENT)
 Q RESULT
 ;
OUT(HANDLE,ARGUMENT)  ;
 ; argument=method.(additional.params....)
 N RESULT
 D METHOD(.RESULT,HANDLE_"."_ARGUMENT)
 Q RESULT
 ;
METHOD(RESULT,ARGUMENT)  ;
 ; argument=handle.method.(additional.params...)
 N HANDLE,METHOD,PARAMS
 D PARSE("Handle",ARGUMENT)
 I $G(HANDLE)'="",'$D(@HANDLE) S RESULT="-1^No data at handle: "_HANDLE_"." Q  ;EC*129 - JAM
 D PARSE("Method",ARGUMENT)
 D PARSE("Params",ARGUMENT)
 I METHOD="Collect" D ECOB30(.RESULT,HANDLE,PARAMS) Q
 I METHOD="Methods" D ECOBMC(.RESULT,HANDLE,PARAMS) Q
 I METHOD="Properties" D ECOBPC(.RESULT,HANDLE,PARAMS) Q
 I METHOD="Root" D ECOBL(.RESULT,HANDLE,METHOD,PARAMS) Q
 I METHOD="mf" D ECOBM(.RESULT,HANDLE,PARAMS) Q
 I METHOD="of" D ECOB2(.RESULT,HANDLE,PARAMS) Q
 I METHOD="pf" D ECOBP(.RESULT,HANDLE,PARAMS) Q
 D HANDLERS(.RESULT,HANDLE,METHOD,PARAMS) Q
 ;;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HECOBU   11353     printed  Sep 23, 2025@19:34:13                                                                                                                                                                                                      Page 2
ECOBU     ;BP/CMF - Utility Object ;8/21/2015
 +1       ;;2.0;EVENT CAPTURE;**100,129**;8 May 96;Build 7
 +2       ;@author  - Chris Flegel
 +3       ;@date    - 17 May 2009
 +4       ;@version - 1.0
 +5       ;;
 +6        QUIT 
 +7       ;; private methods
HANDLERS(RESULT,HANDLE,METHOD,PARAMS) ;;
 +1       ; find & execute handlers
 +2        NEW PROPERTY,HANDLES,FOUND,HANDLER,EXECUTER
 +3        SET RESULT="-1^Invalid method"
 +4        IF $EXTRACT(METHOD,1,3)="Get"
               Begin DoDot:1
 +5                DO PARSE("Get",METHOD)
 +6                SET PARAMS=PROPERTY_"."_PARAMS
 +7                SET METHOD="Get"
 +8                QUIT 
               End DoDot:1
 +9        IF $EXTRACT(METHOD,1,3)="Set"
               Begin DoDot:1
 +10               DO PARSE("Set",METHOD)
 +11               SET PARAMS=PROPERTY_"."_PARAMS
 +12               SET METHOD="Set"
 +13               QUIT 
               End DoDot:1
 +14       IF $EXTRACT(METHOD,1,4)="Show"
               Begin DoDot:1
 +15               DO PARSE("Show",METHOD)
 +16               SET PARAMS=PROPERTY_"."_PARAMS
 +17               SET METHOD="Show"
 +18               QUIT 
               End DoDot:1
 +19       DO METHOD(.HANDLER,HANDLE_".Methods.Find1."_METHOD)
 +20       DO METHOD^ECOBM(.EXECUTER,HANDLER_".GetHandler")
 +21      ;EC*129
           IF $GET(EXECUTER)=""
               QUIT 
 +22      ;EC*129
           IF ($PIECE(EXECUTER,"^")=0)!($PIECE(EXECUTER,"^")=-1)
               QUIT 
 +23       DO @EXECUTER
 +24       QUIT 
 +25      ;;
OBM(RESULT,ARGUMENT) ;shortcut to method class
 +1        DO METHOD^ECOBM(.RESULT,ARGUMENT)
           QUIT 
 +2       ;;
OBP(RESULT,ARGUMENT) ;shortcut to property class
 +1        DO METHOD^ECOBP(.RESULT,ARGUMENT)
           QUIT 
 +2       ;;
OB2(RESULT,ARGUMENT) ;shortcut to utility class
 +1        DO METHOD^ECOB2(.RESULT,ARGUMENT)
           QUIT 
 +2       ;;
ECOB30(RESULT,HANDLE,PARAMS) ;handler for collect object
 +1        NEW CHILD
 +2        DO GET^ECOB(.CHILD,HANDLE,"Pu","Collect")
 +3        DO METHOD^ECOB30(.RESULT,CHILD_"."_PARAMS)
 +4        QUIT 
 +5       ;;
ECOBL(RESULT,HANDLE,METHOD,PARAMS) ;handler for simple list
 +1        NEW CHILD
 +2        DO GET^ECOB(.CHILD,HANDLE,"Pu",METHOD)
 +3        DO METHOD^ECOBL(.RESULT,CHILD_"."_PARAMS)
 +4        QUIT 
 +5       ;;
ECOBMC(RESULT,HANDLE,PARAMS) ;handler for method collection
 +1        NEW CHILD
 +2        DO GET^ECOB(.CHILD,HANDLE,"Pu","Methods")
 +3        DO METHOD^ECOBMC(.RESULT,CHILD_"."_PARAMS)
 +4        QUIT 
 +5       ;;
ECOBPC(RESULT,HANDLE,PARAMS) ;handler for property collection
 +1        NEW CHILD
 +2        DO GET^ECOB(.CHILD,HANDLE,"Pu","Properties")
 +3        DO METHOD^ECOBPC(.RESULT,CHILD_"."_PARAMS)
 +4        QUIT 
 +5       ;;
ECOBM(RESULT,HANDLE,PARAMS) ;; pass-through
 +1        DO OBM(.RESULT,HANDLE_"."_PARAMS)
           QUIT 
 +2       ;;
ECOB2(RESULT,HANDLE,PARAMS) ;; pass-through
 +1        DO OB2(.RESULT,HANDLE_"."_PARAMS)
           QUIT 
 +2       ;;
ECOBP(RESULT,HANDLE,PARAMS) ; pass-through
 +1        DO OBP(.RESULT,HANDLE_"."_PARAMS)
           QUIT 
 +2       ;;
DIAGHDR(VALUE,WIDTH) ;;
 +1        NEW I,J
 +2        SET J=WIDTH-$LENGTH(VALUE)-1
 +3        WRITE !," "_VALUE_" "
 +4        FOR J=1:1:J
               WRITE "-"
 +5        WRITE "+"
 +6        QUIT 
DIAGSGMT(VALUE,WIDTH) ;;
 +1        NEW I,J,OUT,FILL
 +2        SET J=WIDTH-$LENGTH(VALUE)
 +3        SET OUT=" + "_VALUE_" "
 +4        SET FILL=""
 +5        FOR J=1:1:J
               SET FILL=FILL_"-"
 +6        SET OUT=$EXTRACT(OUT_FILL,1,WIDTH)_" |"
 +7        WRITE !,OUT
 +8        QUIT 
DIAGATTR(VALUE,WIDTH) ;;
 +1        NEW I,J,OUT,FILL
 +2        SET J=WIDTH-$LENGTH(VALUE)
 +3        SET OUT=" | * "_VALUE
 +4        if $LENGTH(VALUE)<WIDTH
               Begin DoDot:1
 +5                SET FILL=""
 +6                FOR J=1:1:J
                       SET FILL=FILL_" "
 +7                SET OUT=$EXTRACT(OUT_FILL,1,WIDTH)_" |"
 +8                QUIT 
               End DoDot:1
 +9        WRITE !,OUT
 +10       QUIT 
DIAGFTR(WIDTH) ;;
 +1        NEW I,J,OUT,FILL
 +2        SET J=WIDTH
 +3        SET OUT=" + "
 +4        SET FILL=""
 +5        FOR J=1:1:J
               SET FILL=FILL_"-"
 +6        SET OUT=$EXTRACT(OUT_FILL,1,J)_" +"
 +7        WRITE !,OUT
 +8        QUIT 
 +9       ;;
 +10      ;;protected methods
CLASS(RESULT,HANDLE,PARAMS) ;handler for class info display
 +1        NEW JUSTIFY,OFFSET,X,METH,PROP,ITEM
 +2        DO PARSE("Offset",PARAMS)
 +3        DO SHOW^ECOB(.X,HANDLE,"Pu","_class",JUSTIFY)
 +4       ;;
 +5        DO SHOW^ECOB(.X,HANDLE,"Pu","Methods",JUSTIFY)
 +6        DO METHOD(.X,HANDLE_".Methods.Info."_OFFSET)
 +7        DO SHOW^ECOB(.X,HANDLE,"Pu","Methods",JUSTIFY_"/")
 +8       ;;
 +9        DO SHOW^ECOB(.X,HANDLE,"Pu","Properties",JUSTIFY)
 +10       DO METHOD(.X,HANDLE_".Properties.Info."_OFFSET)
 +11       DO SHOW^ECOB(.X,HANDLE,"Pu","Properties",JUSTIFY_"/")
 +12      ;;
 +13       DO SHOW^ECOB(.X,HANDLE,"Pu","Root",JUSTIFY)
 +14       DO METHOD(.X,HANDLE_".Root.Info."_OFFSET)
 +15       DO SHOW^ECOB(.X,HANDLE,"Pu","Root",JUSTIFY_"/")
 +16      ;;
 +17       DO SHOW^ECOB(.X,HANDLE,"Pu","_class",JUSTIFY_"/")
 +18       SET RESULT=1
 +19       QUIT 
 +20      ;;
CLEAR(RESULT,HANDLE,PARAMS) ; restore object to default state
 +1        NEW PROPERTY,DEFAULT,X
 +2        DO METHOD(.PROPERTY,HANDLE_".Properties.First")
 +3        FOR 
               if PROPERTY="-1^End of list"
                   QUIT 
               Begin DoDot:1
 +4                DO OBP(.DEFAULT,PROPERTY_".GetDefaultValue")
 +5                DO OBP(.X,PROPERTY_".SetValue."_DEFAULT)
 +6                DO METHOD(.PROPERTY,HANDLE_".Properties.Next")
               End DoDot:1
 +7        SET RESULT=1
 +8        QUIT 
 +9       ;
DIAGRAM(RESULT,HANDLE,PARAMS) ; draw class diagram
 +1        NEW CLASS,X,WIDTH,METHOD,PROPERTY,EXTEND,COLLECT,NAME
 +2        DO GET^ECOB(.CLASS,HANDLE,"Pu","_class")
 +3        SET X=$LENGTH(CLASS)+2
 +4        SET WIDTH=$SELECT(X<20:20,X<40:40,X<60:60,1:70)
 +5        DO DIAGHDR(CLASS,WIDTH)
 +6       ;;
 +7        DO DIAGSGMT("Methods",WIDTH)
 +8        DO METHOD(.METHOD,HANDLE_".Methods.First")
 +9        FOR 
               if METHOD="-1^End of list"
                   QUIT 
               Begin DoDot:1
 +10               DO OBM(.NAME,METHOD_".GetName")
 +11               DO DIAGATTR(NAME,WIDTH)
 +12               DO METHOD(.METHOD,HANDLE_".Methods.Next")
 +13               QUIT 
               End DoDot:1
 +14      ;;
 +15       DO DIAGSGMT("Properties",WIDTH)
 +16       DO METHOD(.PROPERTY,HANDLE_".Properties.First")
 +17       FOR 
               if PROPERTY="-1^End of list"
                   QUIT 
               Begin DoDot:1
 +18               DO OBP(.NAME,PROPERTY_".GetName")
 +19               DO DIAGATTR(NAME,WIDTH)
 +20               DO METHOD(.PROPERTY,HANDLE_".Properties.Next")
 +21               QUIT 
               End DoDot:1
 +22      ;;
 +23       DO DIAGSGMT("Extends",WIDTH)
 +24       DO METHOD(.EXTEND,HANDLE_".Root.First")
 +25       FOR 
               if EXTEND="-1^End of list"
                   QUIT 
               Begin DoDot:1
 +26               if EXTEND'=CLASS
                       DO DIAGATTR(EXTEND,WIDTH)
 +27               DO METHOD(.EXTEND,HANDLE_".Root.Next")
 +28               QUIT 
               End DoDot:1
 +29       DO DIAGFTR(WIDTH)
 +30       SET RESULT=1
 +31       QUIT 
 +32      ;
GET(RESULT,HANDLE,METHOD,PARAMS) ;
 +1        NEW PROPERTY,PROP
 +2        SET RESULT="-1^Invalid property"
 +3        SET PROPERTY=$PIECE(PARAMS,".")
 +4        DO METHOD(.PROP,HANDLE_".Properties.Find1."_PROPERTY)
 +5        if PROP'=""
               DO OBP(.RESULT,PROP_".GetValue")
 +6        QUIT 
 +7       ;;
INFO(RESULT,HANDLE,PARAMS) ;handler for business info display
 +1        NEW JUSTIFY,OFFSET,PROPERTY
 +2        DO PARSE("Offset",PARAMS)
 +3        WRITE !,$JUSTIFY("Name : ",JUSTIFY),"Value"
 +4        WRITE !,$JUSTIFY("-----|-",JUSTIFY),"-----"
 +5        DO METHOD(.PROPERTY,HANDLE_".Properties.First")
 +6        FOR 
               if PROPERTY="-1^End of list"
                   QUIT 
               Begin DoDot:1
 +7                DO OBP(.NAME,PROPERTY_".GetName")
 +8                DO METHOD(.RESULT,HANDLE_".Show"_NAME_"."_JUSTIFY)
 +9                DO METHOD(.PROPERTY,HANDLE_".Properties.Next")
 +10               QUIT 
               End DoDot:1
 +11       SET RESULT=1
 +12      ;;
PARSE(PARSE,VALUE) ;
 +1        IF PARSE="Get"
               Begin DoDot:1
 +2                SET PROPERTY=$PIECE(VALUE,".",1)
 +3                SET PROPERTY=$PIECE(PROPERTY,"Get",2)
 +4                QUIT 
               End DoDot:1
               QUIT 
 +5        IF PARSE="Handle"
               Begin DoDot:1
 +6                SET HANDLE=$PIECE(VALUE,".")
 +7                QUIT 
               End DoDot:1
               QUIT 
 +8        IF PARSE="Handle1"
               Begin DoDot:1
 +9                SET NAME=$PIECE(VALUE,".",1)
 +10               SET COUNT=$PIECE(VALUE,".",2)
 +11               QUIT 
               End DoDot:1
               QUIT 
 +12       IF PARSE="Justify"
               Begin DoDot:1
 +13               SET JUSTIFY=$SELECT(+VALUE:+VALUE,1:0)
 +14               QUIT 
               End DoDot:1
               QUIT 
 +15       IF PARSE="Method"
               Begin DoDot:1
 +16               SET METHOD=$PIECE(VALUE,".",2)
 +17               QUIT 
               End DoDot:1
               QUIT 
 +18       IF PARSE="Offset"
               Begin DoDot:1
 +19               SET JUSTIFY=$SELECT(+VALUE:+VALUE,1:0)
 +20               SET OFFSET=JUSTIFY+5
 +21               QUIT 
               End DoDot:1
               QUIT 
 +22       IF PARSE="Params"
               Begin DoDot:1
 +23               SET PARAMS=$PIECE(VALUE,".",3,99)
 +24               QUIT 
               End DoDot:1
               QUIT 
 +25       IF PARSE="Set"
               Begin DoDot:1
 +26               SET PROPERTY=$PIECE(VALUE,".",1)
 +27               SET PROPERTY=$PIECE(PROPERTY,"Set",2)
 +28               SET VALUE=$PIECE(VALUE,".",2)
 +29               QUIT 
               End DoDot:1
               QUIT 
 +30       IF PARSE="Show"
               Begin DoDot:1
 +31               SET PROPERTY=$PIECE(VALUE,".",1)
 +32               SET PROPERTY=$PIECE(PROPERTY,"Show",2)
 +33               QUIT 
               End DoDot:1
               QUIT 
 +34       QUIT 
 +35      ;
SET(RESULT,HANDLE,METHOD,PARAMS) ;
 +1        NEW PROPERTY,PROP
 +2        SET RESULT="-1^Invalid property"
 +3        SET PROPERTY=$PIECE(PARAMS,".")
 +4        SET PARAMS=$PIECE(PARAMS,".",2,99)
 +5        DO METHOD(.PROP,HANDLE_".Properties.Find1."_PROPERTY)
 +6        if PROP'=""
               DO OBP(.RESULT,PROP_".SetValue."_PARAMS)
 +7        QUIT 
 +8       ;
SHOW(RESULT,HANDLE,METHOD,PARAMS) ; show a property
 +1        NEW JUSTIFY,PROPERTY
 +2        SET PROPERTY=$PIECE(PARAMS,".")
 +3        SET PARAMS=$PIECE(PARAMS,".",2,99)
 +4        DO METHOD(.RESULT,HANDLE_".Get"_PROPERTY)
 +5        if RESULT="-1^Invalid property"
               QUIT 
 +6        SET JUSTIFY=$SELECT(+PARAMS:+PARAMS,1:0)
 +7        WRITE !,$JUSTIFY("<"_PROPERTY_"> : ",JUSTIFY),RESULT
 +8        QUIT 
 +9       ;;
 +10      ;; public methods
CREATE(NAME) ;
 +1       ; call parent first
 +2        NEW HANDLE,CHILD,METHOD,PROPERTY,X
 +3        SET HANDLE=$$CREATE^ECOB(NAME)
 +4        DO SELF^ECOB(.RESULT,HANDLE,"EC OBU UTILITY","Utility","METHOD^ECOBU(.RESULT,ARGUMENT)","ECOB")
 +5       ;;
 +6        SET CHILD=$$CREATE^ECOB30(NAME)
 +7        DO COLLECT^ECOB(HANDLE,CHILD,"Pu","Collect")
 +8        DO METHOD^ECOB30(.X,CHILD_".SetCollector."_HANDLE)
 +9       ;;
 +10       SET CHILD=$$CREATE^ECOBMC(NAME)
 +11       DO COLLECT^ECOB(HANDLE,CHILD,"Pu","Methods")
 +12      ;; default ClassDiagram method
 +13       DO METHOD(.METHOD,HANDLE_".Methods.Add.ClassDiagram")
 +14       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +15       DO OBM(.X,METHOD_".SetDescription.Displays diagram of the class.")
 +16       DO OBM(.X,METHOD_".SetHandler.DIAGRAM^ECOBU(.RESULT,HANDLE,PARAMS)")
 +17       DO OBM(.X,METHOD_".SetParams.")
 +18       DO OBM(.X,METHOD_".SetReturns.1")
 +19      ;;
 +20      ;; default ClassInfo method
 +21       DO METHOD(.METHOD,HANDLE_".Methods.Add.ClassInfo")
 +22       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +23       DO OBM(.X,METHOD_".SetDescription.Displays information about the class.")
 +24       DO OBM(.X,METHOD_".SetHandler.CLASS^ECOBU(.RESULT,HANDLE,PARAMS)")
 +25       DO OBM(.X,METHOD_".SetParams.[Justify]")
 +26       DO OBM(.X,METHOD_".SetReturns.1")
 +27      ;; default Clear method
 +28       DO METHOD(.METHOD,HANDLE_".Methods.Add.Clear")
 +29       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +30       DO OBM(.X,METHOD_".SetDescription.Restores public attributes to default state.")
 +31       DO OBM(.X,METHOD_".SetHandler.CLEAR^ECOBU(.RESULT,HANDLE,PARAMS)")
 +32       DO OBM(.X,METHOD_".SetParams.")
 +33       DO OBM(.X,METHOD_".SetReturns.1")
 +34      ;; default Get method
 +35       DO METHOD(.METHOD,HANDLE_".Methods.Add.Get")
 +36       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +37       DO OBM(.X,METHOD_".SetDescription.Gets a property value.")
 +38       DO OBM(.X,METHOD_".SetHandler.GET^ECOBU(.RESULT,HANDLE,METHOD,PARAMS)")
 +39       DO OBM(.X,METHOD_".SetParams.Get[propertyName]")
 +40       DO OBM(.X,METHOD_".SetReturns.Property.Value")
 +41      ;; default Set method
 +42       DO METHOD(.METHOD,HANDLE_".Methods.Add.Set")
 +43       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +44       DO OBM(.X,METHOD_".SetDescription.Sets a property value.")
 +45       DO OBM(.X,METHOD_".SetHandler.SET^ECOBU(.RESULT,HANDLE,METHOD,PARAMS)")
 +46       DO OBM(.X,METHOD_".SetParams.Set[propertyName].[Value]")
 +47       DO OBM(.X,METHOD_".SetReturns.1 if successful, -1 otherwise")
 +48      ;;
 +49       DO METHOD(.METHOD,HANDLE_".Methods.Add.Show")
 +50       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +51       DO OBM(.X,METHOD_".SetDescription.Displays a property value.")
 +52       DO OBM(.X,METHOD_".SetHandler.SHOW^ECOBU(.RESULT,HANDLE,METHOD,PARAMS)")
 +53       DO OBM(.X,METHOD_".SetParams.[Justify]")
 +54       DO OBM(.X,METHOD_".SetReturns.[Property.Name] : [Property.Value]")
 +55      ;;
 +56       DO METHOD(.METHOD,HANDLE_".Methods.Add.Info")
 +57       DO OBM(.X,METHOD_".SetAddedByClass.Utility")
 +58       DO OBM(.X,METHOD_".SetDescription.Displays business information.")
 +59       DO OBM(.X,METHOD_".SetHandler.INFO^ECOBU(.RESULT,HANDLE,PARAMS)")
 +60       DO OBM(.X,METHOD_".SetParams.[Justify]")
 +61       DO OBM(.X,METHOD_".SetReturns.1")
 +62      ;;
 +63       SET CHILD=$$CREATE^ECOBPC(NAME)
 +64       DO COLLECT^ECOB(HANDLE,CHILD,"Pu","Properties")
 +65      ;;
 +66       DO METHOD(.PROPERTY,HANDLE_".Properties.Add._this")
 +67       DO OBP(.X,PROPERTY_".SetAddedByClass.Utility")
 +68       DO OBP(.X,PROPERTY_".SetValue."_HANDLE)
 +69       DO OBP(.X,PROPERTY_".SetDefaultValue."_HANDLE)
 +70      ;;
 +71       SET CHILD=$$CREATE^ECOBL(NAME)
 +72       DO COLLECT^ECOB(HANDLE,CHILD,"Pu","Root")
 +73      ;;
 +74       DO METHOD(.X,HANDLE_".Root.Add.EC BASE")
 +75       DO METHOD(.X,HANDLE_".Root.Add.EC OBU UTILITY")
 +76      ; complex properties last
 +77       QUIT HANDLE
 +78      ;;
DESTROY(HANDLE) ;
 +1       ; call parent last
 +2        NEW CHILD
 +3        DO GET^ECOB(.CHILD,HANDLE,"Pu","Collect")
 +4        DO DESTROY^ECOB30(CHILD)
 +5        DO GET^ECOB(.CHILD,HANDLE,"Pu","Methods")
 +6        DO DESTROY^ECOBMC(CHILD)
 +7        DO GET^ECOB(.CHILD,HANDLE,"Pu","Properties")
 +8        DO DESTROY^ECOBPC(CHILD)
 +9        DO GET^ECOB(.CHILD,HANDLE,"Pu","Root")
 +10       DO DESTROY^ECOBL(CHILD)
 +11       QUIT $$DESTROY^ECOB(HANDLE)
 +12      ;;
FUNCTION(HANDLE,ARGUMENT) ;
 +1       ; argument=method.(additional.params....)
 +2        NEW RESULT
 +3        DO METHOD(.RESULT,HANDLE_"."_ARGUMENT)
 +4        QUIT RESULT
 +5       ;
OUT(HANDLE,ARGUMENT) ;
 +1       ; argument=method.(additional.params....)
 +2        NEW RESULT
 +3        DO METHOD(.RESULT,HANDLE_"."_ARGUMENT)
 +4        QUIT RESULT
 +5       ;
METHOD(RESULT,ARGUMENT) ;
 +1       ; argument=handle.method.(additional.params...)
 +2        NEW HANDLE,METHOD,PARAMS
 +3        DO PARSE("Handle",ARGUMENT)
 +4       ;EC*129 - JAM
           IF $GET(HANDLE)'=""
               IF '$DATA(@HANDLE)
                   SET RESULT="-1^No data at handle: "_HANDLE_"."
                   QUIT 
 +5        DO PARSE("Method",ARGUMENT)
 +6        DO PARSE("Params",ARGUMENT)
 +7        IF METHOD="Collect"
               DO ECOB30(.RESULT,HANDLE,PARAMS)
               QUIT 
 +8        IF METHOD="Methods"
               DO ECOBMC(.RESULT,HANDLE,PARAMS)
               QUIT 
 +9        IF METHOD="Properties"
               DO ECOBPC(.RESULT,HANDLE,PARAMS)
               QUIT 
 +10       IF METHOD="Root"
               DO ECOBL(.RESULT,HANDLE,METHOD,PARAMS)
               QUIT 
 +11       IF METHOD="mf"
               DO ECOBM(.RESULT,HANDLE,PARAMS)
               QUIT 
 +12       IF METHOD="of"
               DO ECOB2(.RESULT,HANDLE,PARAMS)
               QUIT 
 +13       IF METHOD="pf"
               DO ECOBP(.RESULT,HANDLE,PARAMS)
               QUIT 
 +14       DO HANDLERS(.RESULT,HANDLE,METHOD,PARAMS)
           QUIT 
 +15      ;;