K
Kevin Barnes
I noticed some interesting behavior when implementing some
metaprogramming techniques with private. This is dependent on why's
metaid gem/library. I have included metaid at the end in case folks
are not familiar with it.
In 1.8.5 the output is:
true
true
true
In 1.8.6 the output is:
true
true
false
require 'metaid'
module NoSeeUm
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def see(name)
meta_eval do
define_method("#{name}_public") { puts "I'm public" }
define_method("#{name}_private") { puts "I'm private" }
private ("#{name}_private").to_sym
private
define_method("#{name}_maybe_private") { puts "I may be private" }
end
end
end
end
class Reveal
include NoSeeUm
see :me
end
p Reveal.public_methods.include?('me_public')
p Reveal.private_methods.include?('me_private')
p Reveal.private_methods.include?('me_maybe_private')
### Metaid ###
# Metaid == a few simple metaclass helper
# (See http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html.)
class Object
# The hidden singleton lurks behind everyone
def metaclass; class << self; self; end; end
def meta_eval &blk; metaclass.instance_eval &blk; end
# Adds methods to a metaclass
def meta_def name, &blk
meta_eval { define_method name, &blk }
end
# Defines an instance method within a class
def class_def name, &blk
class_eval { define_method name, &blk }
end
end
Just wondering why the me_maybe_private method doesn't show up in the
list of private methods in 1.8.6? Which version of Ruby is 'right'?
Thanks,
Kevin
metaprogramming techniques with private. This is dependent on why's
metaid gem/library. I have included metaid at the end in case folks
are not familiar with it.
In 1.8.5 the output is:
true
true
true
In 1.8.6 the output is:
true
true
false
require 'metaid'
module NoSeeUm
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def see(name)
meta_eval do
define_method("#{name}_public") { puts "I'm public" }
define_method("#{name}_private") { puts "I'm private" }
private ("#{name}_private").to_sym
private
define_method("#{name}_maybe_private") { puts "I may be private" }
end
end
end
end
class Reveal
include NoSeeUm
see :me
end
p Reveal.public_methods.include?('me_public')
p Reveal.private_methods.include?('me_private')
p Reveal.private_methods.include?('me_maybe_private')
### Metaid ###
# Metaid == a few simple metaclass helper
# (See http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html.)
class Object
# The hidden singleton lurks behind everyone
def metaclass; class << self; self; end; end
def meta_eval &blk; metaclass.instance_eval &blk; end
# Adds methods to a metaclass
def meta_def name, &blk
meta_eval { define_method name, &blk }
end
# Defines an instance method within a class
def class_def name, &blk
class_eval { define_method name, &blk }
end
end
Just wondering why the me_maybe_private method doesn't show up in the
list of private methods in 1.8.6? Which version of Ruby is 'right'?
Thanks,
Kevin