module Vool
  class Constant < Expression
    #gobble it up
    def each(&block)
    end
  end

  class IntegerConstant < Constant
    attr_reader :value
    def initialize(value)
      @value = value
    end
    def slot_definition(method)
      return Mom::SlotDefinition.new(Mom::IntegerConstant.new(@value) , [])
    end
    def ct_type
      Parfait.object_space.get_class_by_name(:Integer).instance_type
    end
    #gobble it up
    def each(&block)
    end
  end
  class FloatConstant < Constant
    attr_reader :value
    def initialize(value)
      @value = value
    end
    def ct_type
      true
    end
  end
  class TrueConstant < Constant
    def ct_type
      Parfait.object_space.get_class_by_name(:True).instance_type
    end
    def slot_definition(method)
      return Mom::SlotDefinition.new(Parfait.object_space.true_object , [])
    end
  end
  class FalseConstant < Constant
    def ct_type
      Parfait.object_space.get_class_by_name(:False).instance_type
    end
    def slot_definition(method)
      return Mom::SlotDefinition.new(Parfait.object_space.false_object , [])
    end
  end
  class NilConstant < Constant
    def ct_type
      Parfait.object_space.get_class_by_name(:Nil).instance_type
    end
    def slot_definition(method)
      return Mom::SlotDefinition.new(Parfait.object_space.nil_object , [])
    end
  end
  class SelfExpression < Expression
    attr_reader :my_type
    def initialize(type = nil)
      @my_type = type
    end
    def slot_definition(in_method)
      @my_type = in_method.for_type
      Mom::SlotDefinition.new(:message , [:receiver])
    end
    def ct_type
      @my_type
    end
  end
  class SuperExpression < Statement
  end
  class StringConstant < Constant
    attr_reader :value
    def initialize(value)
      @value = value
    end
    def slot_definition(method)
      return Mom::SlotDefinition.new(Mom::StringConstant.new(@value),[])
    end
    def ct_type
      Parfait.object_space.get_class_by_name(:Word).instance_type
    end
  end
  class SymbolConstant < StringConstant
    def ct_type
      Parfait.object_space.get_class_by_name(:Word).instance_type
    end
  end
end