[e-lang] simple Guard example
Martin Scheffler
martinscheffler at googlemail.com
Mon Jan 8 07:46:46 CST 2007
Hi,
I tried to create a simple example of how to create guards.
The guard is supposed to guard objects created by a specific maker.
It basically checks if the guarded object posesses a sealer that fits
to the unsealer of the guard.
Could you take a look at this?
If this code is correct (and there is not a much simpler version of
how to do it), I would like to place it in the wiki at
http://wiki.erights.org/wiki/Walnut/Advanced_Topics/Build_your_Own_Guards
#------------------------->8----------------------------------------
def makeBrandPair := <elib:sealing.makeBrand>
# value: <makeBrand>
def makeCertifiedMaker() :any{
#create a sealer/unsealer pair
def [certifiedSealer, certifiedUnsealer] := makeBrandPair("certified")
def certifiedMaker {
#This guard throws an error if an uncertified object is
encountered
to getGuard() :any {
def CertifiedGuard {
to coerce( specimen, ejector ) :any{
def someObj := {}
def sealed := specimen.seal( someObj )
try {
certifiedUnsealer.unseal( sealed )
} catch error {
throw.eject( ejector,
"This is not a certified object!" )
return null
}
return specimen
}
}
return CertifiedGuard
}
to run() :any {
def certified{
to print() :void{println("I am a
certified object!")}
to seal(obj) :any {return
certifiedSealer.seal(obj)}
}
return certified
}
}
return certifiedMaker
}
# value: <makeCertifiedMaker>
def certifiedMaker:=makeCertifiedMaker()
# value: <certifiedMaker>
def Certified:=certifiedMaker.getGuard()
# value: <CertifiedGuard>
def myCertified:=certifiedMaker()
# value: <certified>
def test :Certified :=myCertified
# value: <certified>
test.print()
#stdout: I am a certified object!
def [fakeSealer, fakeUnsealer] := makeBrandPair("certified")
# value: [<certified sealer>, <certified unsealer>]
def fakeCertified{
to print() :void{
println("HAHA, i sneaked in!")
}
to seal(obj) :any {
return fakeSealer.seal(obj)
}
}
# value: <fakeCertified>
def test2 :Certified :=fakeCertified
# problem: This is not a certified object!
#
# - Thrower#eject(OneArgFunc, RuntimeException)
# (...)
#------------------------->8-----------------
More information about the e-lang
mailing list