class SomeUtilityClassBase < BasicObject
def clone
clone = self.class.new # <= problem here, there's no way to get
:class
...
return clone
end
end
class Config < SomeUtilityClassBase
end
a = Config.new
b = a.clone
Thanks.
--
Posted via http://www.ruby-forum.com/.
Here's one way:
module DefineClass
def self.included(other)
other.class_eval {
define_method :class do
other
end
}
end
end
class SO < BasicObject
include ::DefineClass
@@counter = 0
def initialize(*a, &b)
super
@@counter += 1
end
def clone
clone = self.class.new
end
def inspect
"<#{self.class}: #{@@counter}>"
end
end
s = SO.new
p s.clone
# => <SO: 2>
(I'm not a huge fan of @@class_variables in general - it's just here
to make the point that there are two different instances.)
Regards,
Sean
class BasicObject
def self.class
self
end
end
Then have at it.
That last line should be:
"enable the :class instance method"
and the first line should read:
"You can inherit from BlankSlate instead of BasicObject."
class BasicObject
def class
BasicObject
end
end
But that would make any subclass of BasicObject that doesn't override this #class definition
would return BasicObject, which would be odd. I'm not sure of a pure-ruby way to write #class,
it's definitely written in C for the Object class.
Michael Edgar
ad...@carboni.ca
http://carboni.ca/
On Mar 6, 2011, at 4:21 PM, 7stud -- wrote:
> ...or even simpler: just open up BasicObject and monkeypatch a class
Here's another attempt (this time handling inheritance):
module DefineClass
def self.define_class(klass)
klass.class_eval {
define_method :class do
klass
end
}
end
def self.extended(other)
define_class(other)
end
def inherited(other)
DefineClass.define_class(other)
end
end
class SO < BasicObject
extend ::DefineClass
@@counter = 0
def initialize(*a, &b)
super
@@counter += 1
end
def clone
clone = self.class.new
end
def inspect
"<#{self.class}: #{@@counter}>"
end
end
s = SO.new
p s.clone
# => <SO: 2>
class BO < SO
end
b = BO.new
p b.clone
# => <BO: 4>
Regards,
Sean
You've changed the #class method of the BasicObject /class/, not the /instance/.
So BasicObject.class will now return BasicObject (rather than Class)
and BasicObject.new.class will not work.
Regards,
Sean
In my case using :inherited callback magic is too over engineered
solution :)