Skip to content

Instantly share code, notes, and snippets.

@SeedyROM
Created December 16, 2019 19:20
Show Gist options
  • Save SeedyROM/b6a049a4cad25f5d47493f3879a15fa8 to your computer and use it in GitHub Desktop.
Save SeedyROM/b6a049a4cad25f5d47493f3879a15fa8 to your computer and use it in GitHub Desktop.
Crystal Dependency Injector
# A simple DSL for createing dependency injected modules/classes.
module Opaque::Injector
# Full DSL setup, this creates a module for dependencies dynamically.
#
# ```
# include Injector
#
# dependencies do
# dependency :logger, Logger.new(STDOUT, Logger::INFO)
# end
# ```
macro dependencies(module_name = "Opaque::Dependencies", &block)
module {{module_name.id}}
extend self
include Injector
{{block.body}}
end
end
# Injects a dependency into a class.
#
# ```
# class Module
# include Injector
# inject :dep
# end
# ```
macro inject(name, module_name = "Opaque::Dependencies")
def {{name.id}}
{{module_name.id}}.{{name.id}}
end
end
# Adds a dependency to a specified module.
#
# ```
# module Module
# dependency :dep, "yes"
# end
# ```
macro dependency(name, value)
@@{{name.id}} = {{value}}
def {{name.id}}
@@{{name.id}}
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment