title: Why Builder.add should be used for junctions but not for Source/Flow/Sink in GraphDSL.create?
body: <p>In <code>akka-stream</code> <a href="https://doc.akka.io/docs/akka/2.5.5/scala/stream/stream-graphs.html" rel="nofollow noreferrer">docs</a> there is an example on how to use <code>GraphDSL.create</code> for constructing graphs of nonlinear shapes. The simplest code sample follows for a graph with one fan-out element:</p>
  <pre><code>val graph = GraphDSL.create(){implicit builder =&gt;
    val source = Source(1 to 100)
    val flow = Flow.apply[Int]
    val sink1 = Sink.foreach[Int](println)
    val sink2 = Sink.foreach[Int](i =&gt; println(&quot;Sink2: &quot; + i))
    val broadcast = builder.add(Broadcast[Int](2))
    source ~&gt; flow ~&gt; broadcast.in
    broadcast.out(0) ~&gt; sink1
    broadcast.out(1) ~&gt; sink2
    ClosedShape
  }
  RunnableGraph.fromGraph(graph).run()
  </code></pre>
  <p>My question is why instance of <code>Broadcast</code> should be 'imported' with help of <code>builder.add</code> method while for source/sink/flow a regular instantiation is enough?</p>
  <p>If I remove <code>builder.add</code> and just leave the <code>val broadcast = Broadcast[Int](2)</code> then the code will compile but at runtime an exception will be thrown:</p>
  <pre><code>Exception in thread &quot;main&quot; java.lang.IllegalArgumentException: [Broadcast.in] is already connected
  </code></pre>
  <p>Documentation does not explain this clearly and just provides it as something given.
  Could you clarify?</p>