#!/usr/bin/ruby

class Base {
    method *(Object o) {
        "Base: #{self} * #{o}"
    }
}

class Exp(v) < Base {

    method *(Exp o) {
        "Exp: #{self} * #{o}"
    }

    method to_s {
        "Exp"
    }
}

class Log(v) < Base {

    method *(Log o) {
        "Log: #{self} * #{o}"
    }

    method to_s {
        "Log"
    }
}

var e = Exp(1)
var l = Log(5)

say l*l
say l*e

assert_eq(l*l, "Log: Log * Log")
assert_eq(l*e, "Base: Log * Exp")
assert_eq(e*e, "Exp: Exp * Exp")
assert_eq(e*l, "Base: Exp * Log")