From: "mame (Yusuke Endoh)" Date: 2012-03-27T23:52:36+09:00 Subject: [ruby-core:43743] [ruby-trunk - Feature #5582][Assigned] Allow clone of singleton methods on a BasicObject Issue #5582 has been updated by mame (Yusuke Endoh). Status changed from Open to Assigned Assignee set to matz (Yukihiro Matsumoto) ---------------------------------------- Feature #5582: Allow clone of singleton methods on a BasicObject https://bugs.ruby-lang.org/issues/5582#change-25250 Author: thinkerbot (Simon Chiang) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: Target version: 1.9.2 Currently I do not know of a way to implement something like 'clone' on a BasicObject subclass. This is as close as I've gotten but as you can see the singleton methods are not propagated to the clone. require 'test/unit' class Context < BasicObject def _singleton_class_ class << self SINGLETON_CLASS = self def _singleton_class_ SINGLETON_CLASS end end _singleton_class_ end def _class_ _singleton_class_.superclass end def _extend_(mod) mod.__send__(:extend_object, self) end def _initialize_clone_(orig) # set variables as needed end def _clone_ clone = _class_.allocate clone._initialize_clone_(self) _singleton_class_.included_modules.each {|mod| clone._extend_ mod } clone end end class ContextTest < Test::Unit::TestCase module A def a :a end end def test__clone__inherits_modules context = Context.new context._extend_ A clone = context._clone_ assert_equal :a, clone.a end def test__clone__inherits_singleton_methods context = Context.new def context.a :a end clone = context._clone_ assert_equal :a, clone.a # fails end end Is there a way to do this that I don't see? If not, then I request that a way be added - perhaps by allowing the singleton_class to be set somehow. In my case I am using Context as the context for a dsl where methods write to a target (an instance variable). I want to be able to clone a context such that I can have multiple contexts with the same methods, including extensions and singletons, that write to different targets. Thank you. -- http://bugs.ruby-lang.org/