Skip to content

Instantly share code, notes, and snippets.

@JackDanger
Created January 25, 2014 07:12
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 JackDanger/8612902 to your computer and use it in GitHub Desktop.
Save JackDanger/8612902 to your computer and use it in GitHub Desktop.
module Injectable
class Placeholder
def initialize(target)
@target = target
end
def injected_value
@target.generate
end
end
def self.included(klass)
klass.extend Generate
end
module Generate
def injectable
Placeholder.new(self)
end
end
end
class Email
include Injectable
attr_reader :address
def initialize(address)
@address = address
end
def self.generate
new "email#{rand}@example.com"
end
end
require 'logger'
class Logger
include Injectable
def self.generate
new STDOUT
end
end
class Binding
def inject
local_variables.each do |name|
current = local_variable_get(name)
if current.class <= Injectable::Placeholder
local_variable_set(name, current.injected_value)
end
end
end
# Patched in https://bugs.ruby-lang.org/issues/8773
def local_variables
eval("local_variables")
end
end
def run
regular = "not injected"
logger = Logger.injectable
email = Email.injectable
puts "The variables are not instantiated - they're merely placeholders:"
p regular
p logger
p email
binding.inject
puts ''
puts "Now they've been realized:"
p regular
p logger
p email
puts ''
logger.info(email.address)
end
run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment