Skip to content

Instantly share code, notes, and snippets.

@davejachimiak
Last active December 21, 2015 06:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davejachimiak/6263019 to your computer and use it in GitHub Desktop.
Save davejachimiak/6263019 to your computer and use it in GitHub Desktop.
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