Module: ObjectForge::Molds
- Defined in:
- lib/object_forge/molds.rb,
lib/object_forge/molds/hash_mold.rb,
lib/object_forge/molds/struct_mold.rb,
lib/object_forge/molds/wrapped_mold.rb,
lib/object_forge/molds/keywords_mold.rb,
lib/object_forge/molds/single_argument_mold.rb
Overview
This module provides a collection of predefined molds to be used in common cases.
Mold is an object that knows how to take a hash of attributes and create an object from them. Molds are callable objects responsible for actually building objects produced by factories (or doing other, interesting things with them (truly, only the code review is the limit!)). They are supposed to be immutable, shareable, and persistent: initialize once, use for the whole runtime.
A simple mold can easily be just a Proc. All molds must have the following #call signature: call(forge_target:, attributes:, **). The extra keywords are ignored for possibility of future extensions.
Defined Under Namespace
Classes: HashMold, KeywordsMold, SingleArgumentMold, StructMold, WrappedMold
Class Method Summary collapse
-
.mold_for(forge_target) ⇒ #call
Get maybe appropriate mold for the given forge target.
-
.wrap_mold(mold) ⇒ #call?
Wrap mold if needed.
Class Method Details
.mold_for(forge_target) ⇒ #call
Get maybe appropriate mold for the given forge target.
Currently provides specific recognition for:
-
subclasses of
Struct(StructMold), -
subclasses of
Data(KeywordsMold), -
Hashand subclasses (HashMold).
Other objects just get SingleArgumentMold.
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/object_forge/molds.rb', line 133 def self.mold_for(forge_target) if ::Class === forge_target if forge_target < ::Struct StructMold.new elsif defined?(::Data) && forge_target < ::Data KeywordsMold.new elsif forge_target <= ::Hash HashMold.new else SingleArgumentMold.new end else SingleArgumentMold.new end end |
.wrap_mold(mold) ⇒ #call?
Wrap mold if needed.
If mold is nil or a callable object, returns it. If it is a Class with #call, wraps it in WrappedMold. Otherwise, raises an error.
162 163 164 165 166 167 168 169 170 |
# File 'lib/object_forge/molds.rb', line 162 def self.wrap_mold(mold) if mold.nil? || mold.respond_to?(:call) mold # : ObjectForge::mold? elsif ::Class === mold && mold.public_method_defined?(:call) WrappedMold.new(mold) else raise ObjectInterfaceError, "mold must respond to or implement #call" end end |