property ancestor, pCastlibName, pAmount, pCurrency on new me, amount, currency pCastlibName = "MoneySample" ancestor = script("IMoney", pCastlibName).new() pAmount = amount pCurrency = currency return me end on add me, anIMoney return anIMoney.addMoney(me) end on addMoney me, aMoney if aMoney.currency() = me.currency() then return script("Money", pCastlibName).new(me.amount() + aMoney.amount(), me.currency()) end if return script("MoneyBag", pCastlibName).new(me, aMoney) end on addMoneyBag me, aMoneyBag return aMoneyBag.addMoney(me) end on appendSelf me, aMoneyBag aMoneyBag.appendMoney(me) end on amount me return pAmount end on currency me return pCurrency end on isZero me return (me.amount() = 0) end on multiply me, factor return script("Money", pCastlibName).new(me.amount() * factor, me.currency()) end on negate me return script("Money", pCastlibName).new(-1 * me.amount(), me.currency()) end on subtract me, anIMoney return me.add(anIMoney.negate()) end on equals me, anIMoney if voidp(anIMoney) then return FALSE if not(anIMoney.instanceOf(#IMoney)) then return FALSE if me.isZero() then if anIMoney.instanceOf(#IMoney) then return anIMoney.isZero() end if end if if anIMoney.instanceOf(#Money) then aMoney = anIMoney return (aMoney.currency() = me.currency() and aMoney.amount() = me.amount()) end if return FALSE end on toString me buffer = "" buffer = buffer & "[" & me.amount() & " " & me.currency() & "]" return buffer end on instanceOf me, typeSymbol if typeSymbol = #Money then return TRUE end if return ancestor.instanceOf(typeSymbol) end on hashCode me return me.stringToHashCode(pCurrency) + pAmount end -- JavaTM 2 Platform, Standard Edition, v 1.3 API Specification -- java.lang.String hashCode() -- s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] on stringToHashCode me, s n = s.length c = 0 repeat with i = 1 to n c = c + charToNum(s.char[i]) * integer(power(31, n - i)) end repeat return c end