Class: Logging::Proxy
- Inherits:
-
Object
- Object
- Logging::Proxy
- Defined in:
- lib/logging/proxy.rb
Overview
Defines a Proxy that will log all method calls on the proxied object. This class uses method_missing
on a “blank slate” object to intercept all method calls. The method name being called and the arguments are all logged to the proxied object’s logger instance. The log level and other settings for the proxied object are honored by the Proxy instance.
If you want, you can also supply your own method_missing
code as a block to the constructor.
Proxy.new(object) do |name, *args, &block|
# code to be executed before the proxied method
result = @object.send(name, *args, &block)
# code to be executed after the proxied method
result # <-- always return the result
end
The proxied object is available as the “@object” variable. The logger is available as the “@logger” variable.
Constant Summary collapse
- KEEPERS =
:stopdoc:
%r/^__|^object_id$|^initialize$/
Instance Method Summary collapse
-
#initialize(object, &block) ⇒ Proxy
constructor
Create a new proxy for the given object.
-
#method_missing(name, *args, &block) ⇒ Object
All hail the magic of method missing.
Constructor Details
#initialize(object, &block) ⇒ Proxy
Create a new proxy for the given object. If an optional block is given it will be called before the proxied method. This block will replace the method_missing
implementation
35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/logging/proxy.rb', line 35 def initialize( object, &block ) Kernel.raise ArgumentError, "Cannot proxy nil" if nil.equal? object @object = object @leader = @object.is_a?(Class) ? "#{@object.name}." : "#{@object.class.name}#" @logger = Logging.logger[object] if block eigenclass = class << self; self; end eigenclass.__send__(:define_method, :method_missing, &block) end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
All hail the magic of method missing. Here is where we are going to log the method call and then forward to the proxied object. The return value from the proxied object method call is passed back.
52 53 54 55 |
# File 'lib/logging/proxy.rb', line 52 def method_missing( name, *args, &block ) @logger << "#@leader#{name}(#{args.inspect[1..-2]})\n" @object.send(name, *args, &block) end |