Rough idea regarding modification of core classes


#1

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”


#2

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. - removed_email_address@domain.invalid - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com


#3

On 5/6/06, Eric H. removed_email_address@domain.invalid 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


#4

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. - removed_email_address@domain.invalid - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com