12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- require 'mixin/instance_wrapper'
- class Sequencer
- class Units
- include ::Enumerable
- include ::Mixin::InstanceWrapper
- wrap :@units
- # Initializes a new Sequencer::Units instance with the given Units Array.
- #
- # @param [*Array<String>] *units a list of Units with or without the Sequencer::Unit prefix.
- #
- # @example
- # Sequencer::Units.new('Example::Unit', 'Sequencer::Unit::Second::Unit')
- def initialize(*units)
- @units = units
- end
- # Required #each implementation for ::Enumerable functionality. Constantizes
- # the list of units given when initialized.
- #
- # @example
- # units.each do |unit|
- # unit.process(sequencer)
- # end
- #
- # @return [nil]
- def each
- @units.each do |unit|
- yield constantize(unit)
- end
- end
- # Provides an Array of :uses and :provides declarations for each Unit.
- #
- # @example
- # units.declarations
- # #=> [{uses: [:question], provides: [:answer], ...}]
- #
- # @return [Array<Hash{Symbol => Array<Symbol>}>] the declarations of the Units
- def declarations
- collect do |unit|
- {
- uses: unit.uses,
- provides: unit.provides,
- }
- end
- end
- # Enables the access to an Unit class via index.
- #
- # @param [Integer] index the index for the requested Unit class.
- #
- # @example
- # units[1]
- # #=> Sequencer::Unit::Example
- #
- # @return [Object] the Unit class for the requested index
- def [](index)
- constantize(@units[index])
- end
- private
- def constantize(unit)
- Sequencer::Unit.constantize(unit)
- end
- end
- end
|