class Sequencer
  class Unit
    module Common
      module Mixin
        module DynamicAttribute

          def self.included(base)

            class << base

              def inherited(base)
                base.extend(Forwardable)
                base.instance_delegate [:attribute] => base
              end

              def attribute
                @attribute ||= begin
                  if uses.size != 1
                    raise "DynamicAttribute classes can use exactly one attribute. Found #{uses.size}."
                  end

                  uses.first
                end
              end
            end
          end

          private

          def attribute_value
            @attribute_value ||= state.use(attribute)
          end
        end
      end
    end
  end
end
