tario / evalhook

Alternate eval which hook all methods executed in the evaluated code

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

= evalhook - Alternate eval which hook all methods (and more) in the evaluated code

== Installation

=== Gem installation

Run in the terminal:

sudo gem install evalhook

OR

* Download the last version of the gem from http://github.com/tario/evalhook/downloads
* Install the gem with the following;

sudo gem install evalhook-X.X.X.gem.

== Documentation

Full API documentation can be found on:
http://tario.github.com/evalhook/doc/

== Usage

This examples and more can be found in examples directory

=== Basic Example

Hook of method calls

	require "rubygems"
	require "evalhook"

	class Hook < EvalHook::HookHandler
		def handle_method(klass, recv, method_name)
			print "called #{klass}##{method_name} over #{recv}\n"
			nil
		end
	end

	h = Hook.new
	h.evalhook('print "hello world\n"')

=== Basic Example 2

Hook of global variables and constants

	require "rubygems"
	require "evalhook"

	class Hook < EvalHook::HookHandler
		# global variable assignment/creation
		def handle_gasgn( global_name, new_value)
			print "assignment of #{global_name} = #{new_value}\n"
			nil
		end

		# constant assignment/creation
		def handle_cdecl( container, const_name, new_value)
			print "assignment of #{container}::#{const_name} = #{new_value}\n"
			nil
		end
	end

	h = Hook.new
	h.evalhook('
	$a = 4
	A = 4', binding)


=== Basic Example 3

Redirect of method calls

	require "rubygems"
	require "evalhook"

	class Hook < EvalHook::HookHandler
		
		include RedirectHelper
		
		def handle_method(klass, recv, method_name)
			print "called #{klass}##{method_name} over #{recv}\n"
			
			if method_name == :print
				# change the method_name to alternative_print
				Redirect.new(klass, recv, "alternative_print")
			else
				nil # do nothing
			end
			
		end
	end

	module Kernel
		def alternative_print(*args)
			print "alternative ", *args
		end
	end

	h = Hook.new
	h.evalhook('print "hello world\n"')

	
=== MultiHookHandler Example (new feature since 0.2.0)

	require "rubygems"
	require "evalhook"

	include EvalHook

	class Hook1 < HookHandler
		def handle_method(klass,recv,method_name)
			
			if method_name == :foo
				redirect_method(klass,recv,:bar)
			else
				nil
			end
		end
	end

	class Hook2 < HookHandler
		def handle_method(klass,recv,method_name)

			if method_name == :bar
				redirect_method(klass,recv,:test1)
			else
				nil
			end
		end
	end

	class X
		def foo
			print "foo\n"
		end
		
		def bar
			print "bar\n"
		end
		
		def test1
			print "test1\n"
		end
	end


	x = X.new
	x.foo # foo

	mmh = MultiHookHandler.new
	mmh.add( Hook1.new )	# :foo => :bar
	mmh.add( Hook2.new )   # :bar => :test1

	mmh.evalhook("x.foo") # test1
	mmh.evalhook("x.bar") # test1

=== MultiHookHandler Example 2

	require "rubygems"
	require "evalhook"

	include EvalHook

	class DenyFooFilter < HookHandler
		def handle_method(klass,recv,method_name)
		
			if method_name == :foo
				raise SecurityError
			else
				nil
			end
		end
	end

	class RedirectFooToBar < HookHandler
		def handle_method(klass,recv,method_name)

			if method_name == :foo
				redirect_method(klass,recv,:bar)
			else
				nil
			end
		end
	end

	class X
		def foo
			print "foo\n"
		end
		
		def bar
			print "bar\n"
		end
	end


	x = X.new
	x.foo # foo

	mmh = MultiHookHandler.new
	mmh.add( DenyFooFilter.new )	
	mmh.add( RedirectFooToBar.new )

	begin
	mmh.evalhook("x.foo")
	rescue SecurityError
	print "foo method filtered by a SecurityError exception\n"
	end


	mmh = MultiHookHandler.new
	mmh.add( RedirectFooToBar.new )
	mmh.add( DenyFooFilter.new )	

	mmh.evalhook("x.foo")

	
	
== Copying

Copyright (c) 2010-2011 Dario Seminara, released under the GPL License (see LICENSE)
	

About

Alternate eval which hook all methods executed in the evaluated code

License:GNU General Public License v3.0


Languages

Language:Ruby 100.0%