require 'object_browser_gtk'

class Term
  attr_reader :operator, :left, :right

  def initialize(operator, left, right)
    @operator = operator
    @left = left
    @right = right
  end

  def value
    @value ||= left.value.send(:operator, right.value)
  end

  def to_s
    "(#{left} #{operator} #{right})"
  end
end

term = Term.new(:*, Term.new(:+, 10, 10), Term.new(:-, 10, 8))
ObjectBrowser::UI::Gtk::browse(term)
puts term