Pervasives-1.1.0

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

enjoy.

a @ http://drawohara.com/

On 9/25/07, ara.t.howard [email protected] wrote:
Ara,
does this fix the bug in prototype? It was in attributes IIRC, so I am
not sure.
I tried last about six weeks ago and it did not work yet.

Thx in advance.
Robert

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs