Rough idea regarding modification of core classes

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”

On May 5, 2006, at 3:20 PM, Tanner B. 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”


Eric H. - [email protected] - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com

On 5/6/06, Eric H. [email protected] wrote:

I’d share my 20 minutes of fiddling in the hopes of sparking some
def self.extended(o)
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”

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 May 6, 2006, at 11:49 AM, Leslie V. wrote:

thought

some_string = String.new
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?

Use delegate.rb.


Eric H. - [email protected] - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com