Split barrier concept into separate files.
diff --git a/barrier.go b/barrier.go
index 3e7cd94..5810851 100644
--- a/barrier.go
+++ b/barrier.go
@@ -4,31 +4,12 @@
 	Load() int64
 }
 
-type MultiBarrier struct {
-	cursors []*Cursor
-}
-
-func (this *MultiBarrier) Load() int64 {
-	minimum := MaxSequenceValue
-
-	for _, item := range this.cursors {
-		cursor := item.Load()
-		if cursor < minimum {
-			minimum = cursor
-		}
-	}
-
-	return minimum
-}
-
 func NewBarrier(upstream ...*Cursor) Barrier {
 	if len(upstream) == 0 {
 		panic("At least one upstream cursor is required.")
 	} else if len(upstream) == 1 {
 		return upstream[0]
 	} else {
-		cursors := make([]*Cursor, len(upstream))
-		copy(cursors, upstream)
-		return &MultiBarrier{cursors}
+		return NewCompositeBarrier(upstream)
 	}
 }
diff --git a/composite_barrier.go b/composite_barrier.go
new file mode 100644
index 0000000..67baf10
--- /dev/null
+++ b/composite_barrier.go
@@ -0,0 +1,24 @@
+package disruptor
+
+type CompositeBarrier struct {
+	cursors []*Cursor
+}
+
+func NewCompositeBarrier(upstream []*Cursor) *CompositeBarrier {
+	cursors := make([]*Cursor, len(upstream))
+	copy(cursors, upstream)
+	return &CompositeBarrier{cursors}
+}
+
+func (this *CompositeBarrier) Load() int64 {
+	minimum := MaxSequenceValue
+
+	for _, item := range this.cursors {
+		cursor := item.Load()
+		if cursor < minimum {
+			minimum = cursor
+		}
+	}
+
+	return minimum
+}