Last active
December 21, 2015 06:18
-
-
Save davejachimiak/6263019 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module LoggingObserver | |
def self.included base | |
base.extend ClassMethods | |
end | |
module ClassMethods | |
def new *args | |
@instance = super | |
override_methods | |
@instance | |
end | |
def override_methods | |
@instance.class.instance_methods(false).each { |m| override_method m } | |
end | |
def override_method(m) | |
@instance.instance_eval <<-code | |
def #{m} *args | |
klass = self.class.name | |
logger = eval "\#{klass}Logger.new" | |
m = __method__.to_s | |
puts logger.instance_eval 'before_' + m.to_s if logger.respond_to? 'before_' + m.to_s | |
super | |
puts logger.instance_eval 'after_' + m.to_s if logger.respond_to? 'after_' + m.to_s | |
end | |
code | |
end | |
end | |
end | |
class RecordLogger | |
def before_save | |
'before the save' | |
end | |
def after_save | |
'save done' | |
end | |
end | |
class Record | |
include LoggingObserver | |
def save | |
puts 'saving' | |
end | |
end | |
Record.new.save | |
#=> before the save | |
#=> saving | |
#=> save done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment