require_relative "object"

module Virtual
  
  # Instruction is an abstract for all the code of the object-machine. 
  # Derived classes make up the actual functionality of the machine. 
  # All functions on the machine are captured as instances of instructions
  #
  # It is actually the point of the virtual machine layer to express oo functionality in the set of instructions,
  # thus defining a minimal set of instructions needed to implement oo.
  
  # This is partly because jumping over this layer and doing in straight in assember was too big a step
  class Instruction < Virtual::Object

    # simple thought: don't recurse for Blocks, just check their names
    def == other
      return false unless other.class == self.class 
      Sof::Util.attributes(self).each do |a|
        begin
          left = send(a)
        rescue NoMethodError
          next  # not using instance variables that are not defined as attr_readers for equality
        end
        begin
          right = other.send(a)
        rescue NoMethodError
          return false
        end
        return false unless left.class == right.class 
        if( left.is_a? Block)
          return false unless left.name == right.name
        else
          return false unless left == right
        end
      end
      return true
    end
  end

end

require_relative "instructions/access"
require_relative "instructions/control"
require_relative "instructions/messaging"