Note
Example 4.1. Creating an array subclass
/* Creating an array subclass for statistics */ ::class statArray subclass array public ::method init /* Initialize running total and forward to superclass */ expose total total = 0 /* Section 5.1.7.2, “new (Class Method)” describes the init method. */ forward class (super) ::method put /* Modify to increment running total */ expose total use arg value total = total + value /* Should verify that value is numeric!!! */ forward class (super) ::method "[]=" /* Modify to increment running total */ forward message "PUT" ::method remove /* Modify to decrement running total */ expose total use arg index forward message "AT" continue total = total - result forward class (super) ::method average /* Return the average of the array elements */ expose total return total / self~items ::method total /* Return the running total of the array elements */ expose total return total
Example 4.2. Adding a CLASS method
/* Adding a class method using ::METHOD */
a = .point~new(1,1)               /* Create some point instances  */
say "Created point instance" a
b = .point~new(2,2)               /* create another point instance */
say "Created point instance" b
c = .point~new(3,3)               /* create another point instance */
say "Created point instance" c
                                  /* ask the point class how many */
                                  /* instances it has created     */
say "The point class has created" .point~instances "instances."
::class point public                /* create Point class           */
::method init class
  expose instanceCount
  instanceCount = 0                 /* Initialize instanceCount     */
  forward class (super)             /* Forward INIT to superclass   */
::method new class
  expose instanceCount              /* Creating a new instance      */
  instanceCount = instanceCount + 1 /* Bump the count               */
  forward class (super)             /* Forward NEW to superclass    */
::method instances class
  expose instanceCount              /* Return the instance count    */
  return instanceCount
::method init
  expose xVal yVal                  /* Set object variables         */
  use arg xVal, yVal                /* as passed on NEW             */
::method string
  expose xVal yVal                  /* Use object variables         */
  return "("xVal","yVal")"          /* to return string value       */
/* Adding a class method using a metaclass  */
a = .point~new(1,1)                    /* Create some point instances  */
say "Created point instance" a
b = .point~new(2,2)
say "Created point instance" b
c = .point~new(3,3)
say "Created point instance" c
                                       /* ask the point class how many */
                                       /* instances it has created     */
say "The point class has created" .point~instances "instances."
::class InstanceCounter subclass class /* Create a new metaclass that */
                                       /* will count its instances     */
::method init
  expose instanceCount
  instanceCount = 0                    /* Initialize instanceCount     */
  forward class (super)                /* Forward INIT to superclass   */
::method new
  expose instanceCount                 /* Creating a new instance      */
  instanceCount = instanceCount + 1    /* Bump the count               */
  forward class (super)                /* Forward NEW to superclass    */
::method instances
expose instanceCount                   /* Return the instance count    */
return instanceCount
::class point public metaclass InstanceCounter  /* Create Point class */
                                       /* using InstanceCounter metaclass */
::method init
  expose xVal yVal                     /* Set object variables         */
  use arg xVal, yVal                   /* as passed on NEW             */
::method string
  expose xVal yVal                     /* Use object variables         */
  return "("xVal","yVal")"             /* to return string value       */