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