001 // Copyright 2006 Waterken Inc. under the terms of the MIT X license
002 // found at http://www.opensource.org/licenses/mit-license.html
003 package org.waterken.bang;
004
005 import static org.ref_send.promise.Eventual.ref;
006
007 import java.io.Serializable;
008
009 import org.ref_send.promise.Promise;
010
011 /**
012 * A {@link Drum} maker.
013 */
014 public final class
015 Bang {
016 private Bang() { /* no instance interface */ }
017
018 /**
019 * Constructs a {@link Drum}.
020 */
021 static public Drum
022 make() {
023 class DrumX implements Drum, Serializable {
024 static private final long serialVersionUID = 1L;
025
026 private int hits = 0;
027
028 public Promise<Integer>
029 getHits() { return ref(hits); }
030
031 public Drum
032 bang(final int beats) {
033 if (0 > beats) { throw new RuntimeException(); }
034 hits += beats;
035 return this;
036 }
037 }
038 return new DrumX();
039 }
040 }