2 def remove_subclasses_of(*superclasses
) #:nodoc:
3 Class
.remove_class(*subclasses_of(*superclasses
))
7 ObjectSpace
.each_object(Class
.new
) {}
9 # Exclude this class unless it's a subclass of our supers and is defined.
10 # We check defined? in case we find a removed class that has yet to be
11 # garbage collected. This also fails for anonymous classes -- please
12 # submit a patch if you have a workaround.
13 def subclasses_of(*superclasses
) #:nodoc:
16 superclasses
.each
do |sup
|
17 ObjectSpace
.each_object(class << sup
; self; end) do |k
|
18 if k
!= sup
&& (k
.name
.blank
? || eval("defined?(::#{k}) && ::#{k}.object_id == k.object_id"))
27 # JRuby and any implementations which cannot handle the objectspace traversal
28 # above fall back to this implementation
29 def subclasses_of(*superclasses
) #:nodoc:
32 superclasses
.each
do |sup
|
33 ObjectSpace
.each_object(Class
) do |k
|
34 if superclasses
.any
? { |superclass
| k
< superclass
} &&
35 (k
.name
.blank
? || eval("defined?(::#{k}) && ::#{k}.object_id == k.object_id"))
45 def extended_by
#:nodoc:
46 ancestors
= class << self; ancestors
end
47 ancestors
.select
{ |mod
| mod
.class == Module
} - [ Object
, Kernel
]
50 def extend_with_included_modules_from(object
) #:nodoc:
51 object
.extended_by
.each
{ |mod
| extend mod
}
54 unless defined? instance_exec
# 1.9
55 module InstanceExecMethods
#:nodoc:
57 include InstanceExecMethods
59 # Evaluate the block with the given arguments within the context of
60 # this object, so self is set to the method receiver.
62 # From Mauricio's http://eigenclass.org/hiki/bounded+space+instance_exec
63 def instance_exec(*args
, &block
)
65 old_critical
, Thread
.critical
= Thread
.critical
, true
67 n
+= 1 while respond_to
?(method_name
= "__instance_exec#{n}")
68 InstanceExecMethods
.module_eval
{ define_method(method_name
, &block
) }
70 Thread
.critical
= old_critical
74 send(method_name
, *args
)
76 InstanceExecMethods
.module_eval
{ remove_method(method_name
) } rescue nil