::Myco::Switch < ::Myco::Object {

var input: void
var output: void
var matched: false
var comparator: :"=="

when: |expected, &blk| {
  matched || (input.__send__(comparator, expected) &&
    ((matched() = true) && (output() = blk.call(input))))
  self
}

when_true: |&blk| {
  matched || (input &&
    ((matched() = true) && (output() = blk.call(input))))
  self
}

when_false: |&blk| {
  matched || (input ||
    ((matched() = true) && (output() = blk.call(input))))
  self
}

else: |&blk| {
  matched ||
    ((matched() = true) && (output() = blk.call(input)))
  self
}

}