class Reflekt::Control

Public Instance Methods

reflect(*args) click to toggle source

Reflect on a method.

Create a shadow action. @param *args [Dynamic] The method's arguments.

# File lib/control.rb, line 33
def reflect(*args)
  # Get trained rule sets.
  input_rule_sets = @aggregator.get_input_rule_sets(@klass, @method)
  output_rule_set = @aggregator.get_output_rule_set(@klass, @method)

  # Fail when no trained rule sets.
  if input_rule_sets.nil?
    @status = :fail
    🔥"> No trained rule sets", :fail, :reflect
  end

  # When arguments exist.
  unless args.size == 0
    # Validate arguments against trained rule sets.
    unless input_rule_sets.nil?
      unless @aggregator.test_inputs(args, input_rule_sets)
        @status = :fail
        🔥"> Invalid inputs", @status, :reflect
      end
    end

    🔥"> Create meta for #{@method}(): #{args}", :info, :meta, @klass
    # TODO: Create metadata for other inputs such as instance variables.
    @inputs = MetaBuilder.create_many(args)
  end

  # Action method with real arguments.
  begin
    # Run reflection.
    output = @clone.send(@method, *args)
    @output = MetaBuilder.create(output)

    # Validate output with aggregated control rule sets.
    unless @aggregator.test_output(output, output_rule_set)
      @status = :fail
      🔥"> Invalid output", @status, :reflect
    end

  # When a system error occurs.
  rescue StandardError => message
    @status = :error
    @message = message

    # TODO: Write log entry to /reflections/errors.txt
    🔥"#{@method}() not reflected", :error, :control, @klass.class
  end
end