module Stove
  class Filter
    include Mixin::Insideable

    #
    # The class that created this filter.
    #
    # @return [~Plugin::Base]
    #
    attr_reader :klass

    #
    # The message given by the filter.
    #
    # @return [String]
    #
    attr_reader :message

    #
    # The block captured by the filter.
    #
    # @return [Proc]
    #
    attr_reader :block

    #
    # Create a new filter object.
    #
    # @param [~Plugin::Base] klass
    #   the class that created this filter
    # @param [String] message
    #   the message given by the filter
    # @param [Proc] block
    #   the block captured by this filter
    #
    def initialize(klass, message, &block)
      @klass   = klass
      @message = message
      @block   = block
    end

    #
    # Execute this filter in the context of the creating class, inside the
    # given cookbook's path.
    #
    # @param [Cookbook]
    #   the cookbook to run this filter against
    #
    def run(cookbook, options = {})
      Stove::Log.info(message)
      instance = klass.new(cookbook, options)

      inside(cookbook) do
        instance.instance_eval(&block)
      end
    end
  end
end
