public Element compose(AggNode node, float yPos, float width, float height, boolean horz) {

		CompositeElement composite; 
		
		// Use existing if we already have it assembled
		if (nodeTable.containsKey(node)) {
			composite = nodeTable.get(node);
			composite.clear();
		}
		// Create new shape
		else {
			composite = new NodeBox(node, width, height);
			nodeTable.put(node, 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.NodeOverlay) continue;
			if (!overlay.isVisible()) continue;
			if (overlay.getAlpha() <= 0.0) continue;
			
			// We cannot skip it---build it
			Element elem = overlay.buildNodeElement(node, horz);
			if (elem != null) {
				composite.addChild(elem);
			}
		}
		
		// Set geometric allocations 
		composite.setPosition(0, yPos);
		composite.setBounds(width, height);
		
		// Add event listener
		composite.getRoot().addInputEventListener(new NodeCompositorMouseEventListener(node, horz));
		
		return composite;
	}