ooRexx logo tripplan.orx
-- stdout and trace output will go to a separate window
prevTrace = .traceoutput~destination(.streamclient~new("localhost",726578))~~open(.context~name "- ooRexx Trace Output")
prevOut = .output~destination(.streamclient~new("localhost",726576))~~open(.context~name "- ooRexx Standard Output")
-- let's start in Rotterdam and go to Dublin
planner = .planner~new
planner~from = .location~new("From","Rotterdam")
say 1 planner~route?~makeString('L','-')
trace i
planner~to = .location~new("To","Dublin")
say 2 planner~route?~makeString('L','-')
-- add listeners for city changes for "from" and "to"
planner~from~addEventListener(address_changed,planner)
planner~to~addEventListener(address_changed,planner)
--say "Enter departure address:"
--parse pull fromAddress
--planner~from = fromAddress

-- on second thought begin in Amsterdam
planner~from~address = "Amsterdam"
say 3 planner~route?~makeString('L','-')
trace o
--say "Enter destination address:"
--parse pull toAddress
--planner~to = toAddress

-- and end in Rome
planner~to~address = "Rome"
say 4 planner~route?~makeString('L','-')
-- add listener for added midway city
planner~via~addEventListener(via_appended,planner)
-- with a stopover at Oslo
index = planner~via~append(.location~new("Via_"planner~via~items+1,"Oslo"))
say 5 planner~route?~makeString('L','-')
-- add listener for changed city of a midway location
planner~via[index]~addEventListener(address_changed,planner)
-- or rather Barcelona instead of Oslo
planner~via[index]~address = "Barcelona"
say 6 planner~route?~makeString('L','-')

-- and Palermo after Barcelona
via = .location~new
via~objectname = "Via"planner~via~items+1
via~addEventListener(address_changed,planner)
planner~via~append(via)
via~address = "Palermo"
say 7 planner~route?~makeString('L','-')

exit

::class planner public

::method init
  expose via
  via = .via~new

::attribute from get
::attribute from set
  expose from
  use arg from
  self~plan
 
::attribute to get
::attribute to set
  expose to
  use arg to
  self~plan
 
::attribute via get
::attribute via set private

::method plan
  expose from to via route
  --trace i
  route = .array~new
  if from~isA(.location) then do
    route~append(from~address)
  end
  if via~isA(.array) then do v over via
    route~append(v~address)
  end
  if to~isA(.location) then do
    route~append(to~address)
  end
 
::method route?
  expose route
  return route

::method address_changed
  self~plan
  return .false -- in case there are more event handlers/listeners waiting
 
::method via_appended
        say arg(1,'A')~makeString('L',',')
  self~via~makeString
  self~plan
  return .false

::class location public inherit eventable

::attribute address get
::attribute address set
  expose address
  --trace i
  use arg address
  self~triggerEvent(address_changed,.array~of(arg1,arg2))
        return .false

::method init
  --trace i
  self~init:super
  use strict arg name=.nil, address=.nil
  if (name\==.nil) then self~objectname = name
  if (address\==.nil) then self~address = address
  self~events[address_changed] = .array~new
 
::class via subclass array inherit eventable

::method init
  self~init:super(via_appended)
  --self~events[via_appended] = .array~new
 
::method append
  use strict arg item
  --trace i
  index = self~append:super(item)
        say self[index] item
  self~triggerEvent(via_appended,.array~of(self[index]))
  return index
 
::requires 'eventable.cls'
::requires 'streamclient.cls'

 
If you feel inclined to make corrections, suggestions etc., please mail me any.
All content © Ruurd Idenburg, 2007–2018, except where marked otherwise. All rights reserved. This page is primarily for non-commercial use only. The Idenburg website records no personal information and sets no ‘cookies’. This site is hosted on a VPS(Virtual Private System) rented from CloudVPS, a Dutch company, falling under Dutch (privacy) laws.

This page updated on Thu, 28 Apr 2016 14:59:56 +0200 by Ruurd Idenburg.