@Override
    protected ElementHandler createHandler(String name) {
        if ("name".equals(name)) {
            return new StringValueBuilder(parentContext, new FinishCallback<String>() {

                @Override
                public void handle(String value) {
                    CSGOperationNodeBuilder.this.operation = CSGOperation.valueOf(value);
                }
                
            });
        } else if ("csg_operation".equals(name)) {
            return new CSGOperationNodeBuilder(parentContext, new FinishCallback<CSGOperationNode>() {

                @Override
                public void handle(CSGOperationNode value) {
                    if (CSGOperationNodeBuilder.this.left == null) {
                        CSGOperationNodeBuilder.this.left = value;
                    } else if (CSGOperationNodeBuilder.this.right == null) {
                        CSGOperationNodeBuilder.this.right = value;
                    } else {
                        throw new IllegalStateException("CSG operation has more than two arguments!");
                    }
                }
                
            });
        } else if ("csg_object".equals(name)) {
            return new SceneObjectsBuilder(parentContext, new FinishCallback<List<SceneObject>>() {

                @Override
                public void handle(List<SceneObject> value) {
                    if (value.isEmpty()) {
                        throw new IllegalArgumentException("Empty CSG object!");
                    }
                    if (value.size() > 1) {
                        throw new IllegalArgumentException("Multiple primitives/models are not allowed under csg_object!");
                    }
                    
                    if (CSGOperationNodeBuilder.this.left == null) {
                        CSGOperationNodeBuilder.this.left = new CSGObjectNode(value.get(0));
                    } else if (CSGOperationNodeBuilder.this.right == null) {
                        CSGOperationNodeBuilder.this.right = new CSGObjectNode(value.get(0));
                    } else {
                        throw new IllegalStateException("CSG operation has more than two arguments!");
                    }
                }
                
            });
        }
        return null;
    }