public Element compose(AggEdge edge, float x, float y, float width, float height) {
		CompositeElement composite; 
		
		// Use existing if we already have it assembled
		if (edgeTable.containsKey(edge)) {
			composite = edgeTable.get(edge);
			composite.clear();
		}
		// Create new shape
		else {
			composite = new EdgeBox(edge, width, height);
			edgeTable.put(edge, composite);
		}
				
		// Step through all the overlays in the manager
		for (Iterator<Overlay> i = overlays.iterator(); i.hasNext();) {
		
			// Retrieve the overlay
			Overlay overlay = i.next();
			
			// See if we can skip this overlay 
			if (overlay.getType() != Overlay.Type.EdgeOverlay) continue;
			if (!overlay.isVisible()) continue;
			if (overlay.getAlpha() <= 0.0) continue;
			
			// We cannot skip it---build it
			Element elem = overlay.buildEdgeElement(edge);
			if (elem != null) { 
				composite.addChild(elem);
			}
			else {
				assert (false);
			}
		}
		
		// Set geometric allocations 
		composite.setPosition(x, y);
		composite.setBounds(width, height);
		
		// Add event listener
		composite.getRoot().addInputEventListener(new EdgeCompositorMouseEventListener(edge));
		
		return composite;
	}