Class: Async::Service::Environment::Builder
- Inherits:
- BasicObject
- Defined in:
- lib/async/service/environment.rb
Overview
A builder for constructing environments using a DSL.
Class Method Summary collapse
-
.for(*facets, **values, &block) ⇒ Object
Create a new environment with facets and values.
Instance Method Summary collapse
-
#include(target) ⇒ Object
Include a module or other includable object into the environment.
-
#initialize(facet = ::Module.new) ⇒ Builder
constructor
Initialize a new builder.
-
#method_missing(name, argument = nil, &block) ⇒ Object
Define methods dynamically on the environment.
-
#respond_to_missing?(name, include_private = false) ⇒ Boolean
Always respond to missing methods for dynamic method definition.
Constructor Details
#initialize(facet = ::Module.new) ⇒ Builder
Initialize a new builder.
60 61 62 |
# File 'lib/async/service/environment.rb', line 60 def initialize(facet = ::Module.new) @facet = facet end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, argument = nil, &block) ⇒ Object
Define methods dynamically on the environment.
80 81 82 83 84 85 86 |
# File 'lib/async/service/environment.rb', line 80 def method_missing(name, argument = nil, &block) if block @facet.define_method(name, &block) else @facet.define_method(name){argument} end end |
Class Method Details
.for(*facets, **values, &block) ⇒ Object
Create a new environment with facets and values.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/async/service/environment.rb', line 19 def self.for(*facets, **values, &block) top = ::Module.new builder = self.new(top) facets.each do |facet| builder.include(facet) end values.each do |key, value| if value.is_a?(::Proc) builder.method_missing(key, &value) else builder.method_missing(key, value) end end # This allows for a convenient syntax, e.g.: # # Builder.for do # foo 42 # end # # or: # # Builder.for do |builder| # builder.foo 42 # end if block_given? if block.arity == 0 builder.instance_exec(&block) else yield builder end end return top end |
Instance Method Details
#include(target) ⇒ Object
Include a module or other includable object into the environment.
66 67 68 69 70 71 72 73 74 |
# File 'lib/async/service/environment.rb', line 66 def include(target) if target.class == ::Module @facet.include(target) elsif target.respond_to?(:included) target.included(@facet) else ::Kernel.raise ::ArgumentError, "Cannot include #{target.inspect} into #{@facet.inspect}!" end end |
#respond_to_missing?(name, include_private = false) ⇒ Boolean
Always respond to missing methods for dynamic method definition.
92 93 94 |
# File 'lib/async/service/environment.rb', line 92 def respond_to_missing?(name, include_private = false) true end |