A proxy to CLR objects that records method calls. this implements all the public instance methods of the class when you use it in ruby code When you use it in a CLR class you’re bound to CLR rules and it only overrides the methods that are marked as virtual. We also can’t isolate static or sealed types at the moment.
Implementation of the template method that creates an isolator for a class defined in a CLR language.
# File lib/caricature/clr/isolator.rb, line 114 114: def initialize(context) 115: super 116: instance = nil 117: sklass = context.subject 118: unless context.subject.respond_to?(:class_eval) 119: sklass = context.subject.class 120: instance = context.subject 121: end 122: @descriptor = ClrClassDescriptor.new sklass 123: instance ||= sklass.new unless sklass.to_clr_type.is_abstract 124: build_isolation sklass, instance 125: end
access to the proxied subject
# File lib/caricature/clr/isolator.rb, line 145 145: def ___super___ 146: isolation_context.instance 147: end
builds the Isolator class for the specified subject
# File lib/caricature/clr/isolator.rb, line 133 133: def create_isolation_for(subj) 134: members = @descriptor.instance_members 135: class_members = @descriptor.class_members 136: events = @descriptor.events 137: class_events = @descriptor.class_events 138: 139: klass = Object.const_set(class_name(subj), Class.new(subj)) 140: klass.class_eval do 141: 142: include Interception 143: 144: # access to the proxied subject 145: def ___super___ 146: isolation_context.instance 147: end 148: 149: def initialize(*args) 150: self 151: end 152: 153: members.each do |mem| 154: nm = mem.name.to_s.to_sym 155: define_method nm do |*args| 156: b = nil 157: b = Proc.new { yield } if block_given? 158: isolation_context.send_message(nm, mem.return_type, *args, &b) 159: end unless nm == :to_string 160: end 161: 162: class_members.each do |mn| 163: mn = mn.name.to_s.to_sym 164: define_cmethod mn do |*args| 165: b = nil 166: b = Proc.new { yield } if block_given? 167: isolation_context.send_class_message(mn, nil, *args, &b) 168: end 169: end 170: 171: evts = (events + class_events).collect do |evt| 172: %(add remove).inject("") do |res, nm| 173: res << def #{"self." unless evt.instance_member?}#{nm}_#{evt.event_name}(block) self.isolation_context.#{nm}_event_subscription('#{evt.event_name}', :#{evt.instance_member? ? "instance" : "class"}, block)end 174: end 175: 176: end.join("\n") 177: 178: klass.class_eval evts 179: 180: #puts evts 181: 182: end 183: 184: klass 185: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.