This is all about abstract programming, - or the joys of eating - whiver you prefer.
http://rosettacode.org/wiki/Constrained_genericity#OxygenBasicmacro Gluttony(vartype, capacity, foodlist)
'==========================================
typedef vartype physical
enum food foodlist
type ActualFood
sys name
physical size
physical quantity
end type
Class foodbox
'============
has ActualFood Item[capacity]
sys max
method put(sys f, physical s,q)
max++
Item[max]<=f,s,q
end method
method GetNext(ActualFood *Stuff)
if max then
copy @stuff,@Item[max], sizeof Item
max--
end if
end method
end class
Class Gourmand
'=============
physical WeightGain, SleepTime
method eat(ActualFood *stuff)
WeightGain+=stuff.size*stuff.quantity*0.75
stuff.size=0
stuff.quantity=0
end method
end class
end macro
'IMPLEMENTATION
'==============
Gluttony (
double,100,{
oyster,trout,bloater,
chocolate,truffles,
cheesecake,cream,pudding,pie
})
% small 1
% medium 2
% large 3
% huge 7
% none 0
% single 1
% few 3
% several 7
% many 12
'INSTANCE
'========
FoodBox Hamper
Gourmand MrG
'TEST
'====
Hamper.put food.pudding,large,several
Hamper.put food.pie,huge,few
ActualFood Course
Hamper.GetNext Course
MrG.eat Course
print MrG.WeightGain
Charles