------ art_24986_28830790.1146867611647
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
After reading the sharp knives and glue thread, my head started spinning
around some ways to minimize or localize the modifications to core classes.
This is what I came up with, it's obviously rough, not-all-inclusive, and
has some fairly obvious and severe drawbacks, but none-the-less I thought
I'd share my 20 minutes of fiddling in the hopes of sparking some
conversation if nothing else.
class Object
def define_meta_methods(name,&blk)
@@__meta_methods__=
(Object.class_variables.include?("@@__meta_methods")
? @@__meta_methods__ : Hash.new)
@@__meta_methods__[name] = Array.new if
@@__meta_methods__[name].nil?
@@__meta_methods__[name] << blk
end
def add_meta_methods
@@__meta_methods__[self.class].each do |mm|
instance_eval &mm
end
end
end
Object.define_meta_methods(String) do
def test_meta
puts "Tested Meta!"
end
end
Object.define_meta_methods(String) do
@something="Hello"
def something; @something; end; # had to go this route instead of
attr_reader, because of private restriciton. Can avoid it with the send
hack though.
end
some_string = String.new
some_other_string = String.new
some_string.add_meta_methods
some_string.test_meta # -> "Tested Meta!"
puts some_string.something # -> "Hello"
some_other_string.test_meta #--> "No method error"
--
===Tanner Burson===
tanner.burson / gmail.com
http://tannerburson.com <---Might even work one day...
------ art_24986_28830790.1146867611647--