Created
December 16, 2019 19:20
-
-
Save SeedyROM/b6a049a4cad25f5d47493f3879a15fa8 to your computer and use it in GitHub Desktop.
Crystal Dependency Injector
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
# 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