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...
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.
[...]
Ruby does all that with #extend.
module Meta
attr_reader :something
def self.extended(o)
o.instance_variable_set :@something, 'Hello'
end
def test_meta
puts 'Tested Meta!'
end
end
some_string = String.new
some_other_string = String.new
some_string.extend Meta
···
On May 5, 2006, at 3:20 PM, Tanner Burson wrote:
some_string.test_meta # -> "Tested Meta!"
puts some_string.something # -> "Hello"
some_other_string.test_meta #--> "No method error"
--
Eric Hodel - drbrain@segment7.net - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant
http://trackmap.robotcoop.com
This is cool, very similar to the "adding functionality to the strings
passed to me" idea (in the glue thread), except it's cleaner than
having a def inside every function that wants an extended string. Now,
is there a clever way to extend all strings passed to any methods of a
specific class?
Les
···
On 5/6/06, Eric Hodel <drbrain@segment7.net> wrote:
On May 5, 2006, at 3:20 PM, Tanner Burson wrote:
> 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.
[...]
Ruby does all that with #extend.
module Meta
attr_reader :something
def self.extended(o)
o.instance_variable_set :@something, 'Hello'
end
def test_meta
puts 'Tested Meta!'
end
end
> some_string = String.new
> some_other_string = String.new
>
some_string.extend Meta
> some_string.test_meta # -> "Tested Meta!"
> puts some_string.something # -> "Hello"
>
> some_other_string.test_meta #--> "No method error"