NAME pervasives.rb SYNOPSIS access to pristine object state. if you don't metaprogram or write debuggers you probably don't need it. INSTALL gem install pervasives URIS http://rubyforge.org/projects/codeforpeople/ http://codeforpeople.com/lib/ruby HISTORY 1.1.0 added Pervasives.call method, refactored a bit, updated samples, updated tests for new api 1.0.0 is NOT backward compatible with any other pervasives version. the new library is __greatly__ simplified SAMPLES <========< samples/a.rb >========> ~ > cat samples/a.rb # # Pervasives allows an object's methods to be accessed in a pristine state, # even when some effort has been made to derride them # require 'pervasives' class BlankSlate instance_methods.each{|m| undef_method m unless m[%r/__/]} end bs = BlankSlate.new p Pervasives(bs).methods #=> ["__object_pervasive__", "__id__", "__send__", "__pervasive__"] p Pervasives(bs).is_a?(BlankSlate) #=> true p Pervasives(bs).instance_eval{ @a = 42 } #=> 42 p Pervasives(bs).instance_variables #=> ["@a"] ~ > ruby samples/a.rb ["__pervasive__", "__id__", "__send__"] true 42 ["@a"] <========< samples/b.rb >========> ~ > cat samples/b.rb # # the special method __pervasive__ is added to all objects - it can be used to # access the pristine state # require 'pervasives' class C def instance_eval(*a, &b) raise end end c = C.new c.__pervasive__(:instance_eval){ @a = 42 } p c.instance_variables #=> ["@a"] ~ > ruby samples/b.rb ["@a"] <========< samples/c.rb >========> ~ > cat samples/c.rb # # even if hackery removes the __pervasive__ method you can still call a # pristine method on an object # require 'pervasives' class VeryBlankSlate instance_methods.each{ |m| undef_method m } end vbs = VeryBlankSlate.new begin vbs.__pervasive__ rescue 'nope not even that' end Pervasives.call(vbs, :instance_eval){ @a = 42 } p Pervasives.call(vbs, :instance_variables) #=> ["@a"] ~ > ruby samples/c.rb samples/c.rb:8: warning: undefining `__id__' may cause serious problem samples/c.rb:8: warning: undefining `__send__' may cause serious problem ["@a"] <========< samples/d.rb >========> ~ > cat samples/d.rb # # of course it works for classes and modules too # require 'pervasives' class C def self.new() raise end def inspect() 42.inspect end end c = C.__pervasive__ :new p c #=> 42 ~ > ruby samples/d.rb 42