Skip to content

Instantly share code, notes, and snippets.

@joshnuss
Last active December 19, 2015 03:28
Show Gist options
  • Save joshnuss/5889991 to your computer and use it in GitHub Desktop.
Save joshnuss/5889991 to your computer and use it in GitHub Desktop.
Angular style dependency injector. uses block param names to resolve dependency
class ResolutionError < StandardError; end
module Injector
extend self
@dependencies = {}
def register(dependency, resolution)
@dependencies[dependency] = resolution
end
def resolve(dependency)
@dependencies[dependency] or raise ResolutionError.new("Failed to resolve `#{dependency}`")
end
def invoke(&block)
resolutions = block.parameters.map {|_, name| resolve(name) }
block.call(*resolutions)
end
end
class SomeService
end
Injector.register(:service, SomeService.new)
Injector.register(:magic, 922)
Injector.invoke do |magic, service|
puts magic, service
end
Injector.invoke {|foo| puts foo } # raises error: Failed to resolve `foo`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment