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 */