Sha256: 996d2b471995ea7e6ff4b26e6700ef9baf7da428874f8a30bbb252eff3654178

Contents?: true

Size: 1.32 KB

Versions: 5

Compression:

Stored size: 1.32 KB

Contents

# Exception-based Event Hooks
# Copyright (c) 2004 Thomas Sawyer, All Rights Reserved
# hookse.rb

=begin

=  Exception-based Event Hooks

Provides an Event Hooks system designed on top of
Ruby's built-in Exception system.

== Example

  def dothis2
    puts 'pre'
    hook :quitit
    puts 'post'
  end

  def tryit2
    begin
      puts "BEFORE"
      dothis2
      puts "AFTER"
    rescue EventHook
      event :quitit do
        puts "HERE"
      end
    end
  end

  tryit2


== Authenticate

Copyright (c) 2004 Thomas Sawyer
Ruby License

=end

class EventHook < Exception
  attr_reader :name, :cc
  def initialize(name, cc)
    @name = name
    @cc = cc
  end
  def call
    @cc.call
  end
end

module Kernel
  def hook(sym)
    callcc{ |c| raise EventHook.new(sym, c) }
  end
  def event(sym)
    if $!.name == sym
      yield
      $!.call
    end
  end
end



#
# Test
#

=begin

  require 'test/unit'

  class T
    attr_reader :a
    def dothis
      @a << '{'
      hook :here
      @a << '}'
    end
    def tryit
      @a = ''
      begin
        @a << "["
        dothis
        @a << "]"
      rescue EventHook
        event :here do
          @a << "HERE"
        end
      end
    end
  end


  class TC_Cut < Test::Unit::TestCase 

    def test_run
      t = T.new
      t.tryit
      assert_equal('[{HERE}]', t.a)
    end

  end

=end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
facets-1.4.1 forge/more/hookse.rb
facets-1.4.2 forge/more/hookse.rb
facets-1.4.3 forge/more/hookse.rb
facets-1.4.4 forge/more/hookse.rb
facets-1.4.5 snip/more/hookse.rb