 
 import Foundation
 
-class Circuit<ImpulseType: Impulse> {  // Signal
+public class Circuit<ImpulseType: Impulse> {  // Signal
     private var etches = [Etch<ImpulseType>]()
     
     private let impulseQueue: dispatch_queue_t = dispatch_queue_create("circuit_impulse_queue", DISPATCH_QUEUE_SERIAL)
     private let defaultDispatchQueue: dispatch_queue_t = dispatch_queue_create("circuit_default_dispatch_queue", DISPATCH_QUEUE_CONCURRENT)
     
+    public init() { }
+    
     /// Add an etch to this circuit from any thread.
-    internal func addEtch(etch: Etch<ImpulseType>) {
+    public func addEtch(etch: Etch<ImpulseType>) {
         dispatch_async(impulseQueue) { _ in
             self.etches.append(etch)
         }
     }
     
     /// Send an impulse from any thread.
-    internal func sendImpulse(impulse: ImpulseType) {
+    public func sendImpulse(impulse: ImpulseType) {
         dispatch_async(impulseQueue) { _ in
             self.recursiveSendImpulseToEtches(impulse, etches: self.etches)
         }

    /// The code to run in response to a matching Impulse.
    private(set) internal var dispatch: (AnyObject -> [ImpulseType]?) = { _ in nil }
    
    internal func withAlive(block: (() -> Bool)) -> Etch {
        var etch = self
        etch.alive = block
        return etch

    }
}

public struct Etch<ImpulseType: Impulse> { // "Observer"
    /// A unique identifier for this Etch. For supporting equatable.
    private let id = NSUUID()
    
