$0open System
/// FireEventArgs: a custom event inherited from EventArgs
type FireEventArgs (room:string,ferocity:int) =
inherit EventArgs()
/// Where the fire is
member this.room = room
/// How "ferocious" the fire is
member this.ferocity = ferocity
/// FireEventHandler delegate for event handler
type FireEventHandler = delegate of obj * FireEventArgs -> unit
/// Class with a function that creates the eventargs and initiates the event
type FireAlarm () =
/// Event of type FireEventHandler delegate
let fireEvent = Event<FireEventHandler,FireEventArgs>()
/// Triggers the fire event
member this.ActivateFireAlarm(room, ferocity) =
// Trigger the event, passing in the object that initated the event (this)
// as well as FireEventArgs.
fireEvent.Trigger(this, FireEventArgs(room,ferocity))
/// Public "FireEvent" event
[<CLIEvent>] member this.FireEvent = fireEvent.Publish
/// Class which handles the fire alarm event
type FireHandlerClass (fireAlarm:FireAlarm) =
/// Function to be executed when a fire event is raised
let extinguishFire (sender:obj,fe:FireEventArgs) =
printf "\nThe ExtinguishFire function was called by %O." sender
if fe.ferocity <2 then
printf "This fire in the %s is no problem. I'm going to pour some water on it." fe.room
elif fe.ferocity < 5 then
printf "I'm using FireExtinguisher to put out the fire in the %s." fe.room
else
printf "The fire in the %s is out of control. I'm calling the fire department!" fe.room
// Add a handler to the fire alarm event
do fireAlarm.FireEvent.AddHandler(fun sender fe -> extinguishFire(sender,fe))
do /// Instance of the class that will be firing an event.
let myFireAlarm = FireAlarm()
/// Instance of the class that will be handling the event.
/// Note that it receives the class that will fire the event as a parameter.
let myFireHandler = FireHandlerClass(myFireAlarm)
// Use our class to raise a few events and watch them get handled
myFireAlarm.ActivateFireAlarm("Kitchen", 3)
myFireAlarm.ActivateFireAlarm("Study", 1)
myFireAlarm.ActivateFireAlarm("Porch", 5)
$0