tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 1077HTML 1008Markdown 12TOML 83209 Definiciones

Update benches to API changes

edd994fd39750e366114cf4d5a66f7092a97edfa · por msiglreith · (hace 7 años) · padre a1b7dbfa3 · ver el árbol en este commit

Delta semántico · 240

benches/complex.rs

benches/generated/absolute_layout_align_items_and_justify_content_center.rs

benches/generated/absolute_layout_align_items_and_justify_content_center_and_bottom_position.rs

benches/generated/absolute_layout_align_items_and_justify_content_center_and_left_position.rs

benches/generated/absolute_layout_align_items_and_justify_content_center_and_right_position.rs

benches/generated/absolute_layout_align_items_and_justify_content_center_and_top_position.rs

benches/generated/absolute_layout_align_items_and_justify_content_flex_end.rs

benches/generated/absolute_layout_align_items_center.rs

benches/generated/absolute_layout_align_items_center_on_child_only.rs

benches/generated/absolute_layout_child_order.rs

benches/generated/absolute_layout_in_wrap_reverse_column_container.rs

benches/generated/absolute_layout_in_wrap_reverse_column_container_flex_end.rs

benches/generated/absolute_layout_in_wrap_reverse_row_container.rs

benches/generated/absolute_layout_in_wrap_reverse_row_container_flex_end.rs

benches/generated/absolute_layout_justify_content_center.rs

benches/generated/absolute_layout_no_size.rs

benches/generated/absolute_layout_percentage_bottom_based_on_parent_height.rs

benches/generated/absolute_layout_start_top_end_bottom.rs

benches/generated/absolute_layout_width_height_end_bottom.rs

benches/generated/absolute_layout_width_height_start_top.rs

benches/generated/absolute_layout_width_height_start_top_end_bottom.rs

benches/generated/absolute_layout_within_border.rs

benches/generated/align_baseline.rs

benches/generated/align_baseline_child_multiline.rs

benches/generated/align_baseline_nested_child.rs

benches/generated/align_center_should_size_based_on_content.rs

benches/generated/align_flex_start_with_shrinking_children.rs

benches/generated/align_flex_start_with_shrinking_children_with_stretch.rs

benches/generated/align_flex_start_with_stretching_children.rs

benches/generated/align_items_center.rs

benches/generated/align_items_center_child_with_margin_bigger_than_parent.rs

benches/generated/align_items_center_child_without_margin_bigger_than_parent.rs

benches/generated/align_items_center_with_child_margin.rs

benches/generated/align_items_center_with_child_top.rs

benches/generated/align_items_flex_end.rs

benches/generated/align_items_flex_end_child_with_margin_bigger_than_parent.rs

benches/generated/align_items_flex_end_child_without_margin_bigger_than_parent.rs

benches/generated/align_items_flex_start.rs

benches/generated/align_items_min_max.rs

benches/generated/align_items_stretch.rs

benches/generated/align_self_baseline.rs

benches/generated/align_self_center.rs

benches/generated/align_self_flex_end.rs

benches/generated/align_self_flex_end_override_flex_start.rs

benches/generated/align_self_flex_start.rs

benches/generated/align_strech_should_size_based_on_parent.rs

benches/generated/border_center_child.rs

benches/generated/border_flex_child.rs

benches/generated/border_no_child.rs

benches/generated/border_stretch_child.rs

benches/generated/child_min_max_width_flexing.rs

benches/generated/container_with_unsized_child.rs

benches/generated/display_none.rs

benches/generated/display_none_fixed_size.rs

benches/generated/display_none_with_child.rs

benches/generated/display_none_with_margin.rs

benches/generated/display_none_with_position.rs

benches/generated/flex_basis_and_main_dimen_set_when_flexing.rs

benches/generated/flex_basis_flex_grow_column.rs

benches/generated/flex_basis_flex_grow_row.rs

benches/generated/flex_basis_flex_shrink_column.rs

benches/generated/flex_basis_flex_shrink_row.rs

benches/generated/flex_basis_larger_than_content_column.rs

benches/generated/flex_basis_larger_than_content_row.rs

benches/generated/flex_basis_overrides_main_size.rs

benches/generated/flex_basis_slightly_smaller_then_content_with_flex_grow_large_size.rs

benches/generated/flex_basis_smaller_than_content_column.rs

benches/generated/flex_basis_smaller_than_content_row.rs

benches/generated/flex_basis_smaller_than_main_dimen_column.rs

benches/generated/flex_basis_smaller_than_main_dimen_row.rs

benches/generated/flex_basis_smaller_then_content_with_flex_grow_large_size.rs

benches/generated/flex_basis_smaller_then_content_with_flex_grow_small_size.rs

benches/generated/flex_basis_smaller_then_content_with_flex_grow_unconstraint_size.rs

benches/generated/flex_basis_smaller_then_content_with_flex_grow_very_large_size.rs

benches/generated/flex_basis_unconstraint_column.rs

benches/generated/flex_basis_unconstraint_row.rs

benches/generated/flex_direction_column.rs

benches/generated/flex_direction_column_no_height.rs

benches/generated/flex_direction_column_reverse.rs

benches/generated/flex_direction_row.rs

benches/generated/flex_direction_row_no_width.rs

benches/generated/flex_direction_row_reverse.rs

benches/generated/flex_grow_child.rs

benches/generated/flex_grow_flex_basis_percent_min_max.rs

benches/generated/flex_grow_height_maximized.rs

benches/generated/flex_grow_in_at_most_container.rs

benches/generated/flex_grow_less_than_factor_one.rs

benches/generated/flex_grow_root_minimized.rs

benches/generated/flex_grow_shrink_at_most.rs

benches/generated/flex_grow_to_min.rs

benches/generated/flex_grow_within_constrained_max_column.rs

benches/generated/flex_grow_within_constrained_max_row.rs

benches/generated/flex_grow_within_constrained_max_width.rs

benches/generated/flex_grow_within_constrained_min_column.rs

benches/generated/flex_grow_within_constrained_min_max_column.rs

benches/generated/flex_grow_within_constrained_min_row.rs

benches/generated/flex_grow_within_max_width.rs

benches/generated/flex_root_ignored.rs

benches/generated/flex_shrink_by_outer_margin_with_max_size.rs

benches/generated/flex_shrink_flex_grow_child_flex_shrink_other_child.rs

benches/generated/flex_shrink_flex_grow_row.rs

benches/generated/flex_shrink_to_zero.rs

benches/generated/flex_wrap_align_stretch_fits_one_row.rs

benches/generated/flex_wrap_children_with_min_main_overriding_flex_basis.rs

benches/generated/flex_wrap_wrap_to_child_height.rs

benches/generated/justify_content_column_center.rs

benches/generated/justify_content_column_flex_end.rs

benches/generated/justify_content_column_flex_start.rs

benches/generated/justify_content_column_min_height_and_margin_bottom.rs

benches/generated/justify_content_column_min_height_and_margin_top.rs

benches/generated/justify_content_column_space_around.rs

benches/generated/justify_content_column_space_between.rs

benches/generated/justify_content_column_space_evenly.rs

benches/generated/justify_content_min_max.rs

benches/generated/justify_content_min_width_with_padding_child_width_greater_than_parent.rs

benches/generated/justify_content_min_width_with_padding_child_width_lower_than_parent.rs

benches/generated/justify_content_overflow_min_max.rs

benches/generated/justify_content_row_center.rs

benches/generated/justify_content_row_flex_end.rs

benches/generated/justify_content_row_flex_start.rs

benches/generated/justify_content_row_max_width_and_margin.rs

benches/generated/justify_content_row_min_width_and_margin.rs

benches/generated/justify_content_row_space_around.rs

benches/generated/justify_content_row_space_between.rs

benches/generated/justify_content_row_space_evenly.rs

benches/generated/margin_and_flex_column.rs

benches/generated/margin_and_flex_row.rs

benches/generated/margin_and_stretch_column.rs

benches/generated/margin_and_stretch_row.rs

benches/generated/margin_auto_bottom.rs

benches/generated/margin_auto_bottom_and_top.rs

benches/generated/margin_auto_bottom_and_top_justify_center.rs

benches/generated/margin_auto_left.rs

benches/generated/margin_auto_left_and_right.rs

benches/generated/margin_auto_left_and_right_column.rs

benches/generated/margin_auto_left_and_right_column_and_center.rs

benches/generated/margin_auto_left_and_right_strech.rs

benches/generated/margin_auto_left_child_bigger_than_parent.rs

benches/generated/margin_auto_left_fix_right_child_bigger_than_parent.rs

benches/generated/margin_auto_left_right_child_bigger_than_parent.rs

benches/generated/margin_auto_left_stretching_child.rs

benches/generated/margin_auto_mutiple_children_column.rs

benches/generated/margin_auto_mutiple_children_row.rs

benches/generated/margin_auto_right.rs

benches/generated/margin_auto_top.rs

benches/generated/margin_auto_top_and_bottom_strech.rs

benches/generated/margin_auto_top_stretching_child.rs

benches/generated/margin_bottom.rs

benches/generated/margin_fix_left_auto_right_child_bigger_than_parent.rs

benches/generated/margin_left.rs

benches/generated/margin_right.rs

benches/generated/margin_should_not_be_part_of_max_height.rs

benches/generated/margin_should_not_be_part_of_max_width.rs

benches/generated/margin_top.rs

benches/generated/margin_with_sibling_column.rs

benches/generated/margin_with_sibling_row.rs

benches/generated/max_height.rs

benches/generated/max_height_overrides_height.rs

benches/generated/max_height_overrides_height_on_root.rs

benches/generated/max_width.rs

benches/generated/max_width_overrides_width.rs

benches/generated/max_width_overrides_width_on_root.rs

benches/generated/min_height.rs

benches/generated/min_height_overrides_height.rs

benches/generated/min_height_overrides_height_on_root.rs

benches/generated/min_max_percent_no_width_height.rs

benches/generated/min_width.rs

benches/generated/min_width_overrides_width.rs

benches/generated/min_width_overrides_width_on_root.rs

benches/generated/nested_overflowing_child.rs

benches/generated/nested_overflowing_child_in_constraint_parent.rs

benches/generated/overflow_cross_axis.rs

benches/generated/overflow_main_axis.rs

benches/generated/padding_align_end_child.rs

benches/generated/padding_center_child.rs

benches/generated/padding_flex_child.rs

benches/generated/padding_no_child.rs

benches/generated/padding_stretch_child.rs

benches/generated/parent_wrap_child_size_overflowing_parent.rs

benches/generated/percent_absolute_position.rs

benches/generated/percent_within_flex_grow.rs

benches/generated/percentage_absolute_position.rs

benches/generated/percentage_container_in_wrapping_container.rs

benches/generated/percentage_flex_basis.rs

benches/generated/percentage_flex_basis_cross.rs

benches/generated/percentage_flex_basis_cross_max_height.rs

benches/generated/percentage_flex_basis_cross_max_width.rs

benches/generated/percentage_flex_basis_cross_min_height.rs

benches/generated/percentage_flex_basis_cross_min_width.rs

benches/generated/percentage_flex_basis_main_max_height.rs

benches/generated/percentage_flex_basis_main_max_width.rs

benches/generated/percentage_flex_basis_main_min_width.rs

benches/generated/percentage_margin_should_calculate_based_only_on_width.rs

benches/generated/percentage_multiple_nested_with_padding_margin_and_percentage_values.rs

benches/generated/percentage_padding_should_calculate_based_only_on_width.rs

benches/generated/percentage_position_bottom_right.rs

benches/generated/percentage_position_left_top.rs

benches/generated/percentage_size_based_on_parent_inner_size.rs

benches/generated/percentage_size_of_flex_basis.rs

benches/generated/percentage_width_height.rs

benches/generated/percentage_width_height_undefined_parent_size.rs

benches/generated/relative_position_should_not_nudge_siblings.rs

benches/generated/rounding_flex_basis_flex_grow_row_prime_number_width.rs

benches/generated/rounding_flex_basis_flex_grow_row_width_of_100.rs

benches/generated/rounding_flex_basis_flex_shrink_row.rs

benches/generated/rounding_flex_basis_overrides_main_size.rs

benches/generated/rounding_fractial_input_1.rs

benches/generated/rounding_fractial_input_2.rs

benches/generated/rounding_fractial_input_3.rs

benches/generated/rounding_fractial_input_4.rs

benches/generated/rounding_total_fractial.rs

benches/generated/rounding_total_fractial_nested.rs

benches/generated/size_defined_by_child.rs

benches/generated/size_defined_by_child_with_border.rs

benches/generated/size_defined_by_child_with_padding.rs

benches/generated/size_defined_by_grand_child.rs

benches/generated/width_smaller_then_content_with_flex_grow_large_size.rs

benches/generated/width_smaller_then_content_with_flex_grow_small_size.rs

benches/generated/width_smaller_then_content_with_flex_grow_unconstraint_size.rs

benches/generated/width_smaller_then_content_with_flex_grow_very_large_size.rs

benches/generated/wrap_column.rs

benches/generated/wrap_nodes_with_content_sizing_margin_cross.rs

benches/generated/wrap_nodes_with_content_sizing_overflowing_margin.rs

benches/generated/wrap_reverse_column.rs

benches/generated/wrap_reverse_column_fixed_size.rs

benches/generated/wrap_reverse_row.rs

benches/generated/wrap_reverse_row_align_content_center.rs

benches/generated/wrap_reverse_row_align_content_flex_start.rs

benches/generated/wrap_reverse_row_align_content_space_around.rs

benches/generated/wrap_reverse_row_align_content_stretch.rs

benches/generated/wrap_reverse_row_single_line_different_size.rs

benches/generated/wrap_row.rs

benches/generated/wrap_row_align_items_center.rs

benches/generated/wrap_row_align_items_flex_end.rs

benches/generated/wrapped_column_max_height.rs

benches/generated/wrapped_column_max_height_flex.rs

benches/generated/wrapped_row_within_align_items_center.rs

benches/generated/wrapped_row_within_align_items_flex_end.rs

benches/generated/wrapped_row_within_align_items_flex_start.rs

scripts/gentest/src/main.rs

240 archivos · +8641 −6336

diff --git a/benches/complex.rs b/benches/complex.rs
index 09b1c5c2b..05bd3b741 100644
--- a/benches/complex.rs
+++ b/benches/complex.rs
@@ -3,123 +3,102 @@ use criterion::{criterion_group, criterion_main, Criterion};
 fn stretch_benchmarks(c: &mut Criterion) {
     c.bench_function("deep hierarchy", |b| {
         b.iter(|| {
-            stretch::node::Node::new(
-                stretch::style::Style { ..Default::default() },
-                vec![
-                    &stretch::node::Node::new(
-                        stretch::style::Style { ..Default::default() },
-                        vec![
-                            &stretch::node::Node::new(
-                                stretch::style::Style { ..Default::default() },
-                                vec![
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                ],
-                            ),
-                            &stretch::node::Node::new(
-                                stretch::style::Style { ..Default::default() },
-                                vec![
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                ],
-                            ),
-                        ],
-                    ),
-                    &stretch::node::Node::new(
-                        stretch::style::Style { ..Default::default() },
-                        vec![
-                            &stretch::node::Node::new(
-                                stretch::style::Style { ..Default::default() },
-                                vec![
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                ],
-                            ),
-                            &stretch::node::Node::new(
-                                stretch::style::Style { ..Default::default() },
-                                vec![
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                    &stretch::node::Node::new(
-                                        stretch::style::Style {
-                                            size: stretch::geometry::Size {
-                                                width: stretch::style::Dimension::Points(10.0),
-                                                height: stretch::style::Dimension::Points(10.0),
-                                            },
-                                            ..Default::default()
-                                        },
-                                        vec![],
-                                    ),
-                                ],
-                            ),
-                        ],
-                    ),
-                ],
-            )
-            .compute_layout(stretch::geometry::Size::undefined())
-            .unwrap()
+            let mut stretch = stretch::node::Stretch::new();
+
+            let node111 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+            let node112 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+
+            let node121 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+            let node122 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+
+            let node11 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node111, node112]).unwrap();
+            let node12 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node121, node122]).unwrap();
+            let node1 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node11, node12]).unwrap();
+
+            let node211 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+            let node212 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+
+            let node221 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+            let node222 = stretch.new_node(
+                stretch::style::Style {
+                    size: stretch::geometry::Size {
+                        width: stretch::style::Dimension::Points(10.0),
+                        height: stretch::style::Dimension::Points(10.0),
+                    },
+                    ..Default::default()
+                },
+                vec![],
+            ).unwrap();
+
+            let node21 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node211, node212]).unwrap();
+            let node22 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node221, node222]).unwrap();
+
+            let node2 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node21, node22]).unwrap();
+            let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node1, node2]).unwrap();
+            stretch.compute_layout(node0, stretch::geometry::Size::undefined()).unwrap()
         })
     });
 }
diff --git a/benches/generated/absolute_layout_align_items_and_justify_content_center.rs b/benches/generated/absolute_layout_align_items_and_justify_content_center.rs
index 7bff6c318..d138330bf 100644
--- a/benches/generated/absolute_layout_align_items_and_justify_content_center.rs
+++ b/benches/generated/absolute_layout_align_items_and_justify_content_center.rs
@@ -1,4 +1,33 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_bottom_position.rs b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_bottom_position.rs
index 7bff6c318..bf853176b 100644
--- a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_bottom_position.rs
+++ b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_bottom_position.rs
@@ -1,4 +1,37 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_left_position.rs b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_left_position.rs
index 7bff6c318..14c30422f 100644
--- a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_left_position.rs
+++ b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_left_position.rs
@@ -1,4 +1,37 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(5f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_right_position.rs b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_right_position.rs
index 7bff6c318..eeadc284b 100644
--- a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_right_position.rs
+++ b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_right_position.rs
@@ -1,4 +1,37 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    end: stretch::style::Dimension::Points(5f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_top_position.rs b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_top_position.rs
index 7bff6c318..a4ce4dbf8 100644
--- a/benches/generated/absolute_layout_align_items_and_justify_content_center_and_top_position.rs
+++ b/benches/generated/absolute_layout_align_items_and_justify_content_center_and_top_position.rs
@@ -1,4 +1,37 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_and_justify_content_flex_end.rs b/benches/generated/absolute_layout_align_items_and_justify_content_flex_end.rs
index 7bff6c318..a4e6494a3 100644
--- a/benches/generated/absolute_layout_align_items_and_justify_content_flex_end.rs
+++ b/benches/generated/absolute_layout_align_items_and_justify_content_flex_end.rs
@@ -1,4 +1,33 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::FlexEnd,
+                justify_content: stretch::style::JustifyContent::FlexEnd,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_center.rs b/benches/generated/absolute_layout_align_items_center.rs
index 7bff6c318..1e1ba5d70 100644
--- a/benches/generated/absolute_layout_align_items_center.rs
+++ b/benches/generated/absolute_layout_align_items_center.rs
@@ -1,4 +1,32 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_align_items_center_on_child_only.rs b/benches/generated/absolute_layout_align_items_center_on_child_only.rs
index 7bff6c318..10463b947 100644
--- a/benches/generated/absolute_layout_align_items_center_on_child_only.rs
+++ b/benches/generated/absolute_layout_align_items_center_on_child_only.rs
@@ -1,4 +1,32 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                align_self: stretch::style::AlignSelf::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_child_order.rs b/benches/generated/absolute_layout_child_order.rs
index 7bff6c318..cc5717e03 100644
--- a/benches/generated/absolute_layout_child_order.rs
+++ b/benches/generated/absolute_layout_child_order.rs
@@ -1,4 +1,59 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_in_wrap_reverse_column_container.rs b/benches/generated/absolute_layout_in_wrap_reverse_column_container.rs
index 7bff6c318..189e6382f 100644
--- a/benches/generated/absolute_layout_in_wrap_reverse_column_container.rs
+++ b/benches/generated/absolute_layout_in_wrap_reverse_column_container.rs
@@ -1,4 +1,33 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_wrap: stretch::style::FlexWrap::WrapReverse,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_in_wrap_reverse_column_container_flex_end.rs b/benches/generated/absolute_layout_in_wrap_reverse_column_container_flex_end.rs
index 7bff6c318..c7ba63cc8 100644
--- a/benches/generated/absolute_layout_in_wrap_reverse_column_container_flex_end.rs
+++ b/benches/generated/absolute_layout_in_wrap_reverse_column_container_flex_end.rs
@@ -1,4 +1,34 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                align_self: stretch::style::AlignSelf::FlexEnd,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_wrap: stretch::style::FlexWrap::WrapReverse,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_in_wrap_reverse_row_container.rs b/benches/generated/absolute_layout_in_wrap_reverse_row_container.rs
index 7bff6c318..6f4df9a56 100644
--- a/benches/generated/absolute_layout_in_wrap_reverse_row_container.rs
+++ b/benches/generated/absolute_layout_in_wrap_reverse_row_container.rs
@@ -1,4 +1,32 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_wrap: stretch::style::FlexWrap::WrapReverse,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_in_wrap_reverse_row_container_flex_end.rs b/benches/generated/absolute_layout_in_wrap_reverse_row_container_flex_end.rs
index 7bff6c318..e08997872 100644
--- a/benches/generated/absolute_layout_in_wrap_reverse_row_container_flex_end.rs
+++ b/benches/generated/absolute_layout_in_wrap_reverse_row_container_flex_end.rs
@@ -1,4 +1,33 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                align_self: stretch::style::AlignSelf::FlexEnd,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_wrap: stretch::style::FlexWrap::WrapReverse,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_justify_content_center.rs b/benches/generated/absolute_layout_justify_content_center.rs
index 7bff6c318..e34b18c33 100644
--- a/benches/generated/absolute_layout_justify_content_center.rs
+++ b/benches/generated/absolute_layout_justify_content_center.rs
@@ -1,4 +1,32 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    height: stretch::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(110f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_no_size.rs b/benches/generated/absolute_layout_no_size.rs
index 7bff6c318..ae23636e3 100644
--- a/benches/generated/absolute_layout_no_size.rs
+++ b/benches/generated/absolute_layout_no_size.rs
@@ -1,4 +1,23 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style { position_type: stretch::style::PositionType::Absolute, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_percentage_bottom_based_on_parent_height.rs b/benches/generated/absolute_layout_percentage_bottom_based_on_parent_height.rs
index 7bff6c318..66d344367 100644
--- a/benches/generated/absolute_layout_percentage_bottom_based_on_parent_height.rs
+++ b/benches/generated/absolute_layout_percentage_bottom_based_on_parent_height.rs
@@ -1,4 +1,68 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Percent(0.5f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    bottom: stretch::style::Dimension::Percent(0.5f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                position: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Percent(0.1f32),
+                    bottom: stretch::style::Dimension::Percent(0.1f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_start_top_end_bottom.rs b/benches/generated/absolute_layout_start_top_end_bottom.rs
index 7bff6c318..969f1b826 100644
--- a/benches/generated/absolute_layout_start_top_end_bottom.rs
+++ b/benches/generated/absolute_layout_start_top_end_bottom.rs
@@ -1,4 +1,33 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                position: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_width_height_end_bottom.rs b/benches/generated/absolute_layout_width_height_end_bottom.rs
index 7bff6c318..0b6853597 100644
--- a/benches/generated/absolute_layout_width_height_end_bottom.rs
+++ b/benches/generated/absolute_layout_width_height_end_bottom.rs
@@ -1,4 +1,36 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    end: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_width_height_start_top.rs b/benches/generated/absolute_layout_width_height_start_top.rs
index 7bff6c318..3a389edf3 100644
--- a/benches/generated/absolute_layout_width_height_start_top.rs
+++ b/benches/generated/absolute_layout_width_height_start_top.rs
@@ -1,4 +1,36 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_width_height_start_top_end_bottom.rs b/benches/generated/absolute_layout_width_height_start_top_end_bottom.rs
index 7bff6c318..12941204c 100644
--- a/benches/generated/absolute_layout_width_height_start_top_end_bottom.rs
+++ b/benches/generated/absolute_layout_width_height_start_top_end_bottom.rs
@@ -1,4 +1,38 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/absolute_layout_within_border.rs b/benches/generated/absolute_layout_within_border.rs
index 7bff6c318..448640a95 100644
--- a/benches/generated/absolute_layout_within_border.rs
+++ b/benches/generated/absolute_layout_within_border.rs
@@ -1,4 +1,121 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(0f32),
+                    top: stretch::style::Dimension::Points(0f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    end: stretch::style::Dimension::Points(0f32),
+                    bottom: stretch::style::Dimension::Points(0f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(0f32),
+                    top: stretch::style::Dimension::Points(0f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node3 = stretch
+        .new_node(
+            stretch::style::Style {
+                position_type: stretch::style::PositionType::Absolute,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                position: stretch::geometry::Rect {
+                    end: stretch::style::Dimension::Points(0f32),
+                    bottom: stretch::style::Dimension::Points(0f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                padding: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                border: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1, node2, node3],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_baseline.rs b/benches/generated/align_baseline.rs
index 7bff6c318..32d5b6492 100644
--- a/benches/generated/align_baseline.rs
+++ b/benches/generated/align_baseline.rs
@@ -1,4 +1,44 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Baseline,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_baseline_child_multiline.rs b/benches/generated/align_baseline_child_multiline.rs
index 7bff6c318..1e2e4794e 100644
--- a/benches/generated/align_baseline_child_multiline.rs
+++ b/benches/generated/align_baseline_child_multiline.rs
@@ -1,4 +1,92 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(60f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(25f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node11 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(25f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node12 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(25f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node13 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(25f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_wrap: stretch::style::FlexWrap::Wrap,
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![node10, node11, node12, node13],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Baseline,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_baseline_nested_child.rs b/benches/generated/align_baseline_nested_child.rs
index 7bff6c318..9212d70cf 100644
--- a/benches/generated/align_baseline_nested_child.rs
+++ b/benches/generated/align_baseline_nested_child.rs
@@ -1,4 +1,58 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Baseline,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_center_should_size_based_on_content.rs b/benches/generated/align_center_should_size_based_on_content.rs
index 7bff6c318..05047cf2e 100644
--- a/benches/generated/align_center_should_size_based_on_content.rs
+++ b/benches/generated/align_center_should_size_based_on_content.rs
@@ -1,4 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node00 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![node000])
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                flex_grow: 0f32,
+                flex_shrink: 1f32,
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_flex_start_with_shrinking_children.rs b/benches/generated/align_flex_start_with_shrinking_children.rs
index 7bff6c318..28f322d41 100644
--- a/benches/generated/align_flex_start_with_shrinking_children.rs
+++ b/benches/generated/align_flex_start_with_shrinking_children.rs
@@ -1,4 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node00 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![node000])
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style { align_items: stretch::style::AlignItems::FlexStart, ..Default::default() },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(500f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_flex_start_with_shrinking_children_with_stretch.rs b/benches/generated/align_flex_start_with_shrinking_children_with_stretch.rs
index 7bff6c318..28f322d41 100644
--- a/benches/generated/align_flex_start_with_shrinking_children_with_stretch.rs
+++ b/benches/generated/align_flex_start_with_shrinking_children_with_stretch.rs
@@ -1,4 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node00 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![node000])
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style { align_items: stretch::style::AlignItems::FlexStart, ..Default::default() },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(500f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_flex_start_with_stretching_children.rs b/benches/generated/align_flex_start_with_stretching_children.rs
index 7bff6c318..9b6a16c78 100644
--- a/benches/generated/align_flex_start_with_stretching_children.rs
+++ b/benches/generated/align_flex_start_with_stretching_children.rs
@@ -1,4 +1,24 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node00 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![node000])
+        .unwrap();
+    let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node00]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(500f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_center.rs b/benches/generated/align_items_center.rs
index 7bff6c318..b2a6d5b38 100644
--- a/benches/generated/align_items_center.rs
+++ b/benches/generated/align_items_center.rs
@@ -1,4 +1,31 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_center_child_with_margin_bigger_than_parent.rs b/benches/generated/align_items_center_child_with_margin_bigger_than_parent.rs
index 7bff6c318..0a80ef374 100644
--- a/benches/generated/align_items_center_child_with_margin_bigger_than_parent.rs
+++ b/benches/generated/align_items_center_child_with_margin_bigger_than_parent.rs
@@ -1,4 +1,43 @@
-pub fn compute() -> stretch::result::Layout {
+pub fn compute() {
     let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style { align_items: stretch::style::AlignItems::Center, ..Default::default() },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
     stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_center_child_without_margin_bigger_than_parent.rs b/benches/generated/align_items_center_child_without_margin_bigger_than_parent.rs
index 9578e1f42..3d9ae8521 100644
--- a/benches/generated/align_items_center_child_without_margin_bigger_than_parent.rs
+++ b/benches/generated/align_items_center_child_without_margin_bigger_than_parent.rs
@@ -1,30 +1,38 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(50f32),
-                height: stretch::style::Dimension::Points(50f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(70f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style { align_items: stretch::style::AlignItems::Center, ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(70f32),
-                        height: stretch::style::Dimension::Points(70f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_center_with_child_margin.rs b/benches/generated/align_items_center_with_child_margin.rs
index 8ab63932e..ad7531a97 100644
--- a/benches/generated/align_items_center_with_child_margin.rs
+++ b/benches/generated/align_items_center_with_child_margin.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(10f32),
@@ -20,8 +12,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_center_with_child_top.rs b/benches/generated/align_items_center_with_child_top.rs
index fcce99933..aa02b5a5a 100644
--- a/benches/generated/align_items_center_with_child_top.rs
+++ b/benches/generated/align_items_center_with_child_top.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(10f32),
@@ -23,8 +15,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_flex_end.rs b/benches/generated/align_items_flex_end.rs
index 2c4f4e612..8092addbf 100644
--- a/benches/generated/align_items_flex_end.rs
+++ b/benches/generated/align_items_flex_end.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::FlexEnd,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(10f32),
@@ -19,8 +11,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::FlexEnd,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_flex_end_child_with_margin_bigger_than_parent.rs b/benches/generated/align_items_flex_end_child_with_margin_bigger_than_parent.rs
index 70d91cf62..d732a09a7 100644
--- a/benches/generated/align_items_flex_end_child_with_margin_bigger_than_parent.rs
+++ b/benches/generated/align_items_flex_end_child_with_margin_bigger_than_parent.rs
@@ -1,35 +1,43 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(50f32),
-                height: stretch::style::Dimension::Points(50f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style { align_items: stretch::style::AlignItems::FlexEnd, ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Points(10f32),
-                        end: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_flex_end_child_without_margin_bigger_than_parent.rs b/benches/generated/align_items_flex_end_child_without_margin_bigger_than_parent.rs
index 8151feab7..9100de942 100644
--- a/benches/generated/align_items_flex_end_child_without_margin_bigger_than_parent.rs
+++ b/benches/generated/align_items_flex_end_child_without_margin_bigger_than_parent.rs
@@ -1,30 +1,38 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(50f32),
-                height: stretch::style::Dimension::Points(50f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(70f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style { align_items: stretch::style::AlignItems::FlexEnd, ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(70f32),
-                        height: stretch::style::Dimension::Points(70f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_flex_start.rs b/benches/generated/align_items_flex_start.rs
index 6b13da747..8fdb11038 100644
--- a/benches/generated/align_items_flex_start.rs
+++ b/benches/generated/align_items_flex_start.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::FlexStart,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(10f32),
@@ -19,8 +11,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::FlexStart,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_min_max.rs b/benches/generated/align_items_min_max.rs
index 87fd6bb35..e64b3a318 100644
--- a/benches/generated/align_items_min_max.rs
+++ b/benches/generated/align_items_min_max.rs
@@ -1,20 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            min_size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            max_size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(60f32),
@@ -24,8 +11,29 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_items_stretch.rs b/benches/generated/align_items_stretch.rs
index 4953b1f1a..6f0775b32 100644
--- a/benches/generated/align_items_stretch.rs
+++ b/benches/generated/align_items_stretch.rs
@@ -1,21 +1,26 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_self_baseline.rs b/benches/generated/align_self_baseline.rs
index 222ea0805..d1af909a0 100644
--- a/benches/generated/align_self_baseline.rs
+++ b/benches/generated/align_self_baseline.rs
@@ -1,50 +1,58 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                align_self: stretch::style::AlignSelf::Baseline,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    align_self: stretch::style::AlignSelf::Baseline,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                align_self: stretch::style::AlignSelf::Baseline,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    align_self: stretch::style::AlignSelf::Baseline,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(50f32),
-                            height: stretch::style::Dimension::Points(10f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_self_center.rs b/benches/generated/align_self_center.rs
index 7dfee01a6..4810115a5 100644
--- a/benches/generated/align_self_center.rs
+++ b/benches/generated/align_self_center.rs
@@ -1,14 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 align_self: stretch::style::AlignSelf::Center,
                 size: stretch::geometry::Size {
@@ -19,8 +12,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_self_flex_end.rs b/benches/generated/align_self_flex_end.rs
index 2d7a8f50d..7ef08d5f6 100644
--- a/benches/generated/align_self_flex_end.rs
+++ b/benches/generated/align_self_flex_end.rs
@@ -1,14 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 align_self: stretch::style::AlignSelf::FlexEnd,
                 size: stretch::geometry::Size {
@@ -19,8 +12,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_self_flex_end_override_flex_start.rs b/benches/generated/align_self_flex_end_override_flex_start.rs
index 73fa5691f..e45ea85a1 100644
--- a/benches/generated/align_self_flex_end_override_flex_start.rs
+++ b/benches/generated/align_self_flex_end_override_flex_start.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::FlexStart,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 align_self: stretch::style::AlignSelf::FlexEnd,
                 size: stretch::geometry::Size {
@@ -20,8 +12,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::FlexStart,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_self_flex_start.rs b/benches/generated/align_self_flex_start.rs
index 346d85572..90405d24c 100644
--- a/benches/generated/align_self_flex_start.rs
+++ b/benches/generated/align_self_flex_start.rs
@@ -1,14 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 align_self: stretch::style::AlignSelf::FlexStart,
                 size: stretch::geometry::Size {
@@ -19,8 +12,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/align_strech_should_size_based_on_parent.rs b/benches/generated/align_strech_should_size_based_on_parent.rs
index d7ffe3f77..c437e4cd6 100644
--- a/benches/generated/align_strech_should_size_based_on_parent.rs
+++ b/benches/generated/align_strech_should_size_based_on_parent.rs
@@ -1,36 +1,44 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node00 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![node000])
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 justify_content: stretch::style::JustifyContent::Center,
                 flex_grow: 0f32,
                 flex_shrink: 1f32,
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            height: stretch::style::Dimension::Points(20f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/border_center_child.rs b/benches/generated/border_center_child.rs
index dbdcff8b5..2533d2c4f 100644
--- a/benches/generated/border_center_child.rs
+++ b/benches/generated/border_center_child.rs
@@ -1,21 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            border: stretch::geometry::Rect {
-                top: stretch::style::Dimension::Points(10f32),
-                bottom: stretch::style::Dimension::Points(20f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(10f32),
@@ -25,8 +11,27 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                border: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/border_flex_child.rs b/benches/generated/border_flex_child.rs
index 1b52d7fda..b38f0b7d7 100644
--- a/benches/generated/border_flex_child.rs
+++ b/benches/generated/border_flex_child.rs
@@ -1,29 +1,34 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            border: stretch::geometry::Rect {
-                start: stretch::style::Dimension::Points(10f32),
-                end: stretch::style::Dimension::Points(10f32),
-                top: stretch::style::Dimension::Points(10f32),
-                bottom: stretch::style::Dimension::Points(10f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_grow: 1f32,
                 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                border: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/border_no_child.rs b/benches/generated/border_no_child.rs
index b1e92c3eb..252e96a05 100644
--- a/benches/generated/border_no_child.rs
+++ b/benches/generated/border_no_child.rs
@@ -1,17 +1,19 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            border: stretch::geometry::Rect {
-                start: stretch::style::Dimension::Points(10f32),
-                end: stretch::style::Dimension::Points(10f32),
-                top: stretch::style::Dimension::Points(10f32),
-                bottom: stretch::style::Dimension::Points(10f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                border: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/border_stretch_child.rs b/benches/generated/border_stretch_child.rs
index 911284d11..2caa759c1 100644
--- a/benches/generated/border_stretch_child.rs
+++ b/benches/generated/border_stretch_child.rs
@@ -1,28 +1,33 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            border: stretch::geometry::Rect {
-                start: stretch::style::Dimension::Points(10f32),
-                end: stretch::style::Dimension::Points(10f32),
-                top: stretch::style::Dimension::Points(10f32),
-                bottom: stretch::style::Dimension::Points(10f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                border: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/child_min_max_width_flexing.rs b/benches/generated/child_min_max_width_flexing.rs
index 86b32d035..036e539d7 100644
--- a/benches/generated/child_min_max_width_flexing.rs
+++ b/benches/generated/child_min_max_width_flexing.rs
@@ -1,42 +1,47 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(120f32),
-                height: stretch::style::Dimension::Points(50f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 0f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 0f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
-                    min_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(60f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 0f32,
+                flex_basis: stretch::style::Dimension::Percent(0.5f32),
+                max_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 0f32,
-                    flex_basis: stretch::style::Dimension::Percent(0.5f32),
-                    max_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(120f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/container_with_unsized_child.rs b/benches/generated/container_with_unsized_child.rs
index 38976f6fb..79bb29bf3 100644
--- a/benches/generated/container_with_unsized_child.rs
+++ b/benches/generated/container_with_unsized_child.rs
@@ -1,15 +1,18 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(stretch::style::Style { ..Default::default() }, vec![])],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/display_none.rs b/benches/generated/display_none.rs
index a03bb6d39..f5620a1bc 100644
--- a/benches/generated/display_none.rs
+++ b/benches/generated/display_none.rs
@@ -1,21 +1,24 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style { display: stretch::style::Display::None, flex_grow: 1f32, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-            &stretch::node::Node::new(
-                stretch::style::Style { display: stretch::style::Display::None, flex_grow: 1f32, ..Default::default() },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/display_none_fixed_size.rs b/benches/generated/display_none_fixed_size.rs
index eb5129772..117fdc31c 100644
--- a/benches/generated/display_none_fixed_size.rs
+++ b/benches/generated/display_none_fixed_size.rs
@@ -1,29 +1,32 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                display: stretch::style::Display::None,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    display: stretch::style::Display::None,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(20f32),
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/display_none_with_child.rs b/benches/generated/display_none_with_child.rs
index 8f79cf87b..df9e56cf8 100644
--- a/benches/generated/display_none_with_child.rs
+++ b/benches/generated/display_none_with_child.rs
@@ -1,57 +1,64 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Percent(0f32),
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 1f32,
-                    flex_basis: stretch::style::Dimension::Percent(0f32),
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    display: stretch::style::Display::None,
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_shrink: 1f32,
-                    flex_basis: stretch::style::Dimension::Percent(0f32),
-                    ..Default::default()
-                },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        flex_grow: 1f32,
-                        flex_shrink: 1f32,
-                        flex_basis: stretch::style::Dimension::Percent(0f32),
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 1f32,
-                    flex_basis: stretch::style::Dimension::Percent(0f32),
+            vec![],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Percent(0f32),
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                display: stretch::style::Display::None,
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/display_none_with_margin.rs b/benches/generated/display_none_with_margin.rs
index 64f0bd1d3..d15ed613a 100644
--- a/benches/generated/display_none_with_margin.rs
+++ b/benches/generated/display_none_with_margin.rs
@@ -1,36 +1,39 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                display: stretch::style::Display::None,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(10f32),
+                    end: stretch::style::Dimension::Points(10f32),
+                    top: stretch::style::Dimension::Points(10f32),
+                    bottom: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    display: stretch::style::Display::None,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(20f32),
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Points(10f32),
-                        end: stretch::style::Dimension::Points(10f32),
-                        top: stretch::style::Dimension::Points(10f32),
-                        bottom: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/display_none_with_position.rs b/benches/generated/display_none_with_position.rs
index 5092060ef..6c8f9b929 100644
--- a/benches/generated/display_none_with_position.rs
+++ b/benches/generated/display_none_with_position.rs
@@ -1,29 +1,32 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                display: stretch::style::Display::None,
+                flex_grow: 1f32,
+                position: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    display: stretch::style::Display::None,
-                    flex_grow: 1f32,
-                    position: stretch::geometry::Rect {
-                        top: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_and_main_dimen_set_when_flexing.rs b/benches/generated/flex_basis_and_main_dimen_set_when_flexing.rs
index 3bad40549..df6d1fc21 100644
--- a/benches/generated/flex_basis_and_main_dimen_set_when_flexing.rs
+++ b/benches/generated/flex_basis_and_main_dimen_set_when_flexing.rs
@@ -1,38 +1,46 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(10f32),
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(10f32),
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(10f32),
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(0f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(10f32),
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(0f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_flex_grow_column.rs b/benches/generated/flex_basis_flex_grow_column.rs
index 84a9cbf40..fc5a26bf2 100644
--- a/benches/generated/flex_basis_flex_grow_column.rs
+++ b/benches/generated/flex_basis_flex_grow_column.rs
@@ -1,26 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(50f32),
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(50f32),
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_flex_grow_row.rs b/benches/generated/flex_basis_flex_grow_row.rs
index 23980b599..1e1e500b3 100644
--- a/benches/generated/flex_basis_flex_grow_row.rs
+++ b/benches/generated/flex_basis_flex_grow_row.rs
@@ -1,25 +1,28 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(50f32),
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(50f32),
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_flex_shrink_column.rs b/benches/generated/flex_basis_flex_shrink_column.rs
index 2ece95f25..e3f3a916d 100644
--- a/benches/generated/flex_basis_flex_shrink_column.rs
+++ b/benches/generated/flex_basis_flex_shrink_column.rs
@@ -1,25 +1,30 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style { flex_basis: stretch::style::Dimension::Points(100f32), ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style { flex_basis: stretch::style::Dimension::Points(50f32), ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_basis: stretch::style::Dimension::Points(100f32), ..Default::default() },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_basis: stretch::style::Dimension::Points(50f32), ..Default::default() },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_flex_shrink_row.rs b/benches/generated/flex_basis_flex_shrink_row.rs
index cf2ccfb4e..d5ca89b7d 100644
--- a/benches/generated/flex_basis_flex_shrink_row.rs
+++ b/benches/generated/flex_basis_flex_shrink_row.rs
@@ -1,24 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style { flex_basis: stretch::style::Dimension::Points(100f32), ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style { flex_basis: stretch::style::Dimension::Points(50f32), ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_basis: stretch::style::Dimension::Points(100f32), ..Default::default() },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_basis: stretch::style::Dimension::Points(50f32), ..Default::default() },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_larger_than_content_column.rs b/benches/generated/flex_basis_larger_than_content_column.rs
index 184eeb5c4..abe232d00 100644
--- a/benches/generated/flex_basis_larger_than_content_column.rs
+++ b/benches/generated/flex_basis_larger_than_content_column.rs
@@ -1,29 +1,40 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_direction: stretch::style::FlexDirection::Column,
                 flex_basis: stretch::style::Dimension::Points(50f32),
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(100f32),
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_larger_than_content_row.rs b/benches/generated/flex_basis_larger_than_content_row.rs
index 1bb28529a..b537e9159 100644
--- a/benches/generated/flex_basis_larger_than_content_row.rs
+++ b/benches/generated/flex_basis_larger_than_content_row.rs
@@ -1,28 +1,39 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(10f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_direction: stretch::style::FlexDirection::Column,
                 flex_basis: stretch::style::Dimension::Points(50f32),
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_overrides_main_size.rs b/benches/generated/flex_basis_overrides_main_size.rs
index 11aaf4c0f..bf965d942 100644
--- a/benches/generated/flex_basis_overrides_main_size.rs
+++ b/benches/generated/flex_basis_overrides_main_size.rs
@@ -1,50 +1,48 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(50f32),
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(20f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(50f32),
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_slightly_smaller_then_content_with_flex_grow_large_size.rs b/benches/generated/flex_basis_slightly_smaller_then_content_with_flex_grow_large_size.rs
index 6505faa67..c957e6253 100644
--- a/benches/generated/flex_basis_slightly_smaller_then_content_with_flex_grow_large_size.rs
+++ b/benches/generated/flex_basis_slightly_smaller_then_content_with_flex_grow_large_size.rs
@@ -1,50 +1,64 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(60f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(70f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(60f32),
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_than_content_column.rs b/benches/generated/flex_basis_smaller_than_content_column.rs
index ddc57bae7..2a54eabea 100644
--- a/benches/generated/flex_basis_smaller_than_content_column.rs
+++ b/benches/generated/flex_basis_smaller_than_content_column.rs
@@ -1,29 +1,40 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_direction: stretch::style::FlexDirection::Column,
                 flex_basis: stretch::style::Dimension::Points(50f32),
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(100f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_than_content_row.rs b/benches/generated/flex_basis_smaller_than_content_row.rs
index 97bab5d65..749cdd5bd 100644
--- a/benches/generated/flex_basis_smaller_than_content_row.rs
+++ b/benches/generated/flex_basis_smaller_than_content_row.rs
@@ -1,28 +1,39 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_direction: stretch::style::FlexDirection::Column,
                 flex_basis: stretch::style::Dimension::Points(50f32),
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(100f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_than_main_dimen_column.rs b/benches/generated/flex_basis_smaller_than_main_dimen_column.rs
index 45eb3e189..5b0b366d7 100644
--- a/benches/generated/flex_basis_smaller_than_main_dimen_column.rs
+++ b/benches/generated/flex_basis_smaller_than_main_dimen_column.rs
@@ -1,11 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_basis: stretch::style::Dimension::Points(10f32),
                 size: stretch::geometry::Size {
@@ -16,8 +12,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_than_main_dimen_row.rs b/benches/generated/flex_basis_smaller_than_main_dimen_row.rs
index 7ab18e9ec..9f03fc7a9 100644
--- a/benches/generated/flex_basis_smaller_than_main_dimen_row.rs
+++ b/benches/generated/flex_basis_smaller_than_main_dimen_row.rs
@@ -1,10 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_basis: stretch::style::Dimension::Points(10f32),
                 size: stretch::geometry::Size {
@@ -15,8 +12,19 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_large_size.rs b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_large_size.rs
index eac0666e3..aad885a41 100644
--- a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_large_size.rs
+++ b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_large_size.rs
@@ -1,50 +1,64 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(70f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_small_size.rs b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_small_size.rs
index 8da420269..c777a41e9 100644
--- a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_small_size.rs
+++ b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_small_size.rs
@@ -1,50 +1,61 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(70f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_unconstraint_size.rs b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_unconstraint_size.rs
index 47f762932..f0466ec23 100644
--- a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_unconstraint_size.rs
+++ b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_unconstraint_size.rs
@@ -1,47 +1,53 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style { ..Default::default() },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(70f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node0, node1]).unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_very_large_size.rs b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_very_large_size.rs
index 830dd1794..713fdefaf 100644
--- a/benches/generated/flex_basis_smaller_then_content_with_flex_grow_very_large_size.rs
+++ b/benches/generated/flex_basis_smaller_then_content_with_flex_grow_very_large_size.rs
@@ -1,50 +1,64 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(200f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(70f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(70f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_direction: stretch::style::FlexDirection::Column,
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node10 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(20f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                ..Default::default()
+            },
+            vec![node10],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_unconstraint_column.rs b/benches/generated/flex_basis_unconstraint_column.rs
index 7090b8cc5..b7689a7f2 100644
--- a/benches/generated/flex_basis_unconstraint_column.rs
+++ b/benches/generated/flex_basis_unconstraint_column.rs
@@ -1,7 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style { flex_direction: stretch::style::FlexDirection::Column, ..Default::default() },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_basis: stretch::style::Dimension::Points(50f32),
                 size: stretch::geometry::Size {
@@ -11,8 +11,13 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style { flex_direction: stretch::style::FlexDirection::Column, ..Default::default() },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_basis_unconstraint_row.rs b/benches/generated/flex_basis_unconstraint_row.rs
index 2ed3089a1..5f1008206 100644
--- a/benches/generated/flex_basis_unconstraint_row.rs
+++ b/benches/generated/flex_basis_unconstraint_row.rs
@@ -1,7 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style { ..Default::default() },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_basis: stretch::style::Dimension::Points(50f32),
                 size: stretch::geometry::Size {
@@ -11,8 +11,8 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node0]).unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_direction_column.rs b/benches/generated/flex_direction_column.rs
index 98084faad..72f13fe44 100644
--- a/benches/generated/flex_direction_column.rs
+++ b/benches/generated/flex_direction_column.rs
@@ -1,47 +1,54 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_direction_column_no_height.rs b/benches/generated/flex_direction_column_no_height.rs
index 4527f6ae9..7e49ed184 100644
--- a/benches/generated/flex_direction_column_no_height.rs
+++ b/benches/generated/flex_direction_column_no_height.rs
@@ -1,43 +1,53 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_direction_column_reverse.rs b/benches/generated/flex_direction_column_reverse.rs
index 8fbb43938..a52c4481c 100644
--- a/benches/generated/flex_direction_column_reverse.rs
+++ b/benches/generated/flex_direction_column_reverse.rs
@@ -1,47 +1,54 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::ColumnReverse,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::ColumnReverse,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_direction_row.rs b/benches/generated/flex_direction_row.rs
index ef4c9ebe6..139cf2669 100644
--- a/benches/generated/flex_direction_row.rs
+++ b/benches/generated/flex_direction_row.rs
@@ -1,46 +1,44 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_direction_row_no_width.rs b/benches/generated/flex_direction_row_no_width.rs
index 651c3536b..f965e6abe 100644
--- a/benches/generated/flex_direction_row_no_width.rs
+++ b/benches/generated/flex_direction_row_no_width.rs
@@ -1,42 +1,43 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_direction_row_reverse.rs b/benches/generated/flex_direction_row_reverse.rs
index e04aebdb9..cb6958548 100644
--- a/benches/generated/flex_direction_row_reverse.rs
+++ b/benches/generated/flex_direction_row_reverse.rs
@@ -1,47 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::RowReverse,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::RowReverse,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_child.rs b/benches/generated/flex_grow_child.rs
index ad07e94f4..aa1fc871c 100644
--- a/benches/generated/flex_grow_child.rs
+++ b/benches/generated/flex_grow_child.rs
@@ -1,7 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style { ..Default::default() },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_grow: 1f32,
                 flex_basis: stretch::style::Dimension::Points(0f32),
@@ -12,8 +12,8 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node0]).unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_flex_basis_percent_min_max.rs b/benches/generated/flex_grow_flex_basis_percent_min_max.rs
index fcf1703db..a3af819cb 100644
--- a/benches/generated/flex_grow_flex_basis_percent_min_max.rs
+++ b/benches/generated/flex_grow_flex_basis_percent_min_max.rs
@@ -1,47 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(120f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 0f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
-                    min_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(60f32),
-                        ..Default::default()
-                    },
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 0f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 0f32,
-                    flex_basis: stretch::style::Dimension::Percent(0.5f32),
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(20f32),
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
-                    max_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(60f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 0f32,
+                flex_basis: stretch::style::Dimension::Percent(0.5f32),
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(120f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_height_maximized.rs b/benches/generated/flex_grow_height_maximized.rs
index a288b5e11..8991b6bde 100644
--- a/benches/generated/flex_grow_height_maximized.rs
+++ b/benches/generated/flex_grow_height_maximized.rs
@@ -1,15 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(500f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(200f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node01 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_direction: stretch::style::FlexDirection::Column,
                 flex_grow: 1f32,
@@ -23,28 +37,22 @@ pub fn compute() -> stretch::result::Layout {
                 },
                 ..Default::default()
             },
-            vec![
-                &stretch::node::Node::new(
-                    stretch::style::Style {
-                        flex_grow: 1f32,
-                        flex_basis: stretch::style::Dimension::Points(200f32),
-                        ..Default::default()
-                    },
-                    vec![],
-                ),
-                &stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                ),
-            ],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node00, node01],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(500f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_in_at_most_container.rs b/benches/generated/flex_grow_in_at_most_container.rs
index c4acc42b9..038fc09a5 100644
--- a/benches/generated/flex_grow_in_at_most_container.rs
+++ b/benches/generated/flex_grow_in_at_most_container.rs
@@ -1,26 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::FlexStart,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(0f32),
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
-            stretch::style::Style { ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(0f32),
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node00]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::FlexStart,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_less_than_factor_one.rs b/benches/generated/flex_grow_less_than_factor_one.rs
index 75e6bd4a7..87c885125 100644
--- a/benches/generated/flex_grow_less_than_factor_one.rs
+++ b/benches/generated/flex_grow_less_than_factor_one.rs
@@ -1,33 +1,34 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(500f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 0.2f32,
+                flex_shrink: 0f32,
+                flex_basis: stretch::style::Dimension::Points(40f32),
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 0.2f32,
-                    flex_shrink: 0f32,
-                    flex_basis: stretch::style::Dimension::Points(40f32),
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(stretch::style::Style { flex_grow: 0.2f32, flex_shrink: 0f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node2 = stretch
+        .new_node(stretch::style::Style { flex_grow: 0.4f32, flex_shrink: 0f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_grow: 0.2f32, flex_shrink: 0f32, ..Default::default() },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_grow: 0.4f32, flex_shrink: 0f32, ..Default::default() },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_root_minimized.rs b/benches/generated/flex_grow_root_minimized.rs
index c5ee4752f..fc2717347 100644
--- a/benches/generated/flex_grow_root_minimized.rs
+++ b/benches/generated/flex_grow_root_minimized.rs
@@ -1,19 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(200f32),
                 ..Default::default()
             },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(500f32),
+            vec![],
+        )
+        .unwrap();
+    let node01 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_direction: stretch::style::FlexDirection::Column,
                 flex_grow: 1f32,
@@ -27,28 +37,29 @@ pub fn compute() -> stretch::result::Layout {
                 },
                 ..Default::default()
             },
-            vec![
-                &stretch::node::Node::new(
-                    stretch::style::Style {
-                        flex_grow: 1f32,
-                        flex_basis: stretch::style::Dimension::Points(200f32),
-                        ..Default::default()
-                    },
-                    vec![],
-                ),
-                &stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                ),
-            ],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node00, node01],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(500f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_shrink_at_most.rs b/benches/generated/flex_grow_shrink_at_most.rs
index 5d90b8659..5d3919d00 100644
--- a/benches/generated/flex_grow_shrink_at_most.rs
+++ b/benches/generated/flex_grow_shrink_at_most.rs
@@ -1,21 +1,21 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node00]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
-            stretch::style::Style { ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_to_min.rs b/benches/generated/flex_grow_to_min.rs
index 535c9910e..c12a0be8d 100644
--- a/benches/generated/flex_grow_to_min.rs
+++ b/benches/generated/flex_grow_to_min.rs
@@ -1,35 +1,40 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(500f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() }, vec![])
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style { flex_grow: 1f32, flex_shrink: 1f32, ..Default::default() },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(500f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_constrained_max_column.rs b/benches/generated/flex_grow_within_constrained_max_column.rs
index 6264eedb6..03598e2f0 100644
--- a/benches/generated/flex_grow_within_constrained_max_column.rs
+++ b/benches/generated/flex_grow_within_constrained_max_column.rs
@@ -1,35 +1,43 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Points(100f32),
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(100f32),
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_constrained_max_row.rs b/benches/generated/flex_grow_within_constrained_max_row.rs
index f60a837ca..34dee9943 100644
--- a/benches/generated/flex_grow_within_constrained_max_row.rs
+++ b/benches/generated/flex_grow_within_constrained_max_row.rs
@@ -1,11 +1,26 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(200f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Points(100f32),
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node01 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     height: stretch::style::Dimension::Points(100f32),
@@ -17,28 +32,21 @@ pub fn compute() -> stretch::result::Layout {
                 },
                 ..Default::default()
             },
-            vec![
-                &stretch::node::Node::new(
-                    stretch::style::Style {
-                        flex_shrink: 1f32,
-                        flex_basis: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
-                    vec![],
-                ),
-                &stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(50f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                ),
-            ],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+            vec![node00, node01],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_constrained_max_width.rs b/benches/generated/flex_grow_within_constrained_max_width.rs
index 574ca4306..7e81521c6 100644
--- a/benches/generated/flex_grow_within_constrained_max_width.rs
+++ b/benches/generated/flex_grow_within_constrained_max_width.rs
@@ -1,15 +1,20 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 max_size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(300f32),
@@ -17,19 +22,22 @@ pub fn compute() -> stretch::result::Layout {
                 },
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_constrained_min_column.rs b/benches/generated/flex_grow_within_constrained_min_column.rs
index 77a616fc8..707b967f8 100644
--- a/benches/generated/flex_grow_within_constrained_min_column.rs
+++ b/benches/generated/flex_grow_within_constrained_min_column.rs
@@ -1,27 +1,30 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_constrained_min_max_column.rs b/benches/generated/flex_grow_within_constrained_min_max_column.rs
index eeb3eb2ec..51a229312 100644
--- a/benches/generated/flex_grow_within_constrained_min_max_column.rs
+++ b/benches/generated/flex_grow_within_constrained_min_max_column.rs
@@ -1,26 +1,29 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_constrained_min_row.rs b/benches/generated/flex_grow_within_constrained_min_row.rs
index 9044ca4e3..8a07ac21b 100644
--- a/benches/generated/flex_grow_within_constrained_min_row.rs
+++ b/benches/generated/flex_grow_within_constrained_min_row.rs
@@ -1,27 +1,30 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            min_size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch.new_node(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]).unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(stretch::style::Style { flex_grow: 1f32, ..Default::default() }, vec![]),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_grow_within_max_width.rs b/benches/generated/flex_grow_within_max_width.rs
index e29c417a7..3587ee1ca 100644
--- a/benches/generated/flex_grow_within_max_width.rs
+++ b/benches/generated/flex_grow_within_max_width.rs
@@ -1,15 +1,20 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+            vec![],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 max_size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(100f32),
@@ -17,19 +22,22 @@ pub fn compute() -> stretch::result::Layout {
                 },
                 ..Default::default()
             },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(20f32),
-                        ..Default::default()
-                    },
+            vec![node00],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_root_ignored.rs b/benches/generated/flex_root_ignored.rs
index c85494df7..f5cfdf5ab 100644
--- a/benches/generated/flex_root_ignored.rs
+++ b/benches/generated/flex_root_ignored.rs
@@ -1,39 +1,47 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_basis: stretch::style::Dimension::Points(200f32),
                 ..Default::default()
             },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(500f32),
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_basis: stretch::style::Dimension::Points(200f32),
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(500f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_shrink_by_outer_margin_with_max_size.rs b/benches/generated/flex_shrink_by_outer_margin_with_max_size.rs
index a5744794d..06fc044ef 100644
--- a/benches/generated/flex_shrink_by_outer_margin_with_max_size.rs
+++ b/benches/generated/flex_shrink_by_outer_margin_with_max_size.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size { height: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(80f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(20f32),
@@ -23,8 +15,24 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(80f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_shrink_flex_grow_child_flex_shrink_other_child.rs b/benches/generated/flex_shrink_flex_grow_child_flex_shrink_other_child.rs
index cd23e107a..e02ba8c6e 100644
--- a/benches/generated/flex_shrink_flex_grow_child_flex_shrink_other_child.rs
+++ b/benches/generated/flex_shrink_flex_grow_child_flex_shrink_other_child.rs
@@ -1,42 +1,47 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(500f32),
-                height: stretch::style::Dimension::Points(500f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 0f32,
+                flex_shrink: 1f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 0f32,
-                    flex_shrink: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(500f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(500f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(500f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_shrink_flex_grow_row.rs b/benches/generated/flex_shrink_flex_grow_row.rs
index 25f4b030a..0e8d51303 100644
--- a/benches/generated/flex_shrink_flex_grow_row.rs
+++ b/benches/generated/flex_shrink_flex_grow_row.rs
@@ -1,42 +1,47 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(500f32),
-                height: stretch::style::Dimension::Points(500f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 0f32,
+                flex_shrink: 1f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 0f32,
-                    flex_shrink: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(500f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 0f32,
+                flex_shrink: 1f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 0f32,
-                    flex_shrink: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(500f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(500f32),
+                    height: stretch::style::Dimension::Points(500f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_shrink_to_zero.rs b/benches/generated/flex_shrink_to_zero.rs
index 2f26ae2f0..fd3714b49 100644
--- a/benches/generated/flex_shrink_to_zero.rs
+++ b/benches/generated/flex_shrink_to_zero.rs
@@ -1,48 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(75f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 0f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 0f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 1f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 1f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 0f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 0f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(75f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_wrap_align_stretch_fits_one_row.rs b/benches/generated/flex_wrap_align_stretch_fits_one_row.rs
index e12515360..618648ec9 100644
--- a/benches/generated/flex_wrap_align_stretch_fits_one_row.rs
+++ b/benches/generated/flex_wrap_align_stretch_fits_one_row.rs
@@ -1,37 +1,36 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_wrap: stretch::style::FlexWrap::Wrap,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(150f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_wrap: stretch::style::FlexWrap::Wrap,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(150f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_wrap_children_with_min_main_overriding_flex_basis.rs b/benches/generated/flex_wrap_children_with_min_main_overriding_flex_basis.rs
index 067cf041b..279b543aa 100644
--- a/benches/generated/flex_wrap_children_with_min_main_overriding_flex_basis.rs
+++ b/benches/generated/flex_wrap_children_with_min_main_overriding_flex_basis.rs
@@ -1,43 +1,51 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_wrap: stretch::style::FlexWrap::Wrap,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_basis: stretch::style::Dimension::Points(50f32),
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    min_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(55f32),
-                        ..Default::default()
-                    },
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_basis: stretch::style::Dimension::Points(50f32),
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_basis: stretch::style::Dimension::Points(50f32),
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    min_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(55f32),
-                        ..Default::default()
-                    },
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(55f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_basis: stretch::style::Dimension::Points(50f32),
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(55f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_wrap: stretch::style::FlexWrap::Wrap,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/flex_wrap_wrap_to_child_height.rs b/benches/generated/flex_wrap_wrap_to_child_height.rs
index e9db65c70..71babe9bf 100644
--- a/benches/generated/flex_wrap_wrap_to_child_height.rs
+++ b/benches/generated/flex_wrap_wrap_to_child_height.rs
@@ -1,48 +1,59 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style { flex_direction: stretch::style::FlexDirection::Column, ..Default::default() },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_wrap: stretch::style::FlexWrap::Wrap,
-                    align_items: stretch::style::AlignItems::FlexStart,
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        flex_direction: stretch::style::FlexDirection::Column,
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![&stretch::node::Node::new(
-                        stretch::style::Style {
-                            size: stretch::geometry::Size {
-                                width: stretch::style::Dimension::Points(100f32),
-                                height: stretch::style::Dimension::Points(100f32),
-                                ..Default::default()
-                            },
-                            ..Default::default()
-                        },
-                        vec![],
-                    )],
-                )],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(100f32),
-                        height: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node000],
+        )
+        .unwrap();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_wrap: stretch::style::FlexWrap::Wrap,
+                align_items: stretch::style::AlignItems::FlexStart,
+                ..Default::default()
+            },
+            vec![node00],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style { flex_direction: stretch::style::FlexDirection::Column, ..Default::default() },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_center.rs b/benches/generated/justify_content_column_center.rs
index ab864246b..f5f33548e 100644
--- a/benches/generated/justify_content_column_center.rs
+++ b/benches/generated/justify_content_column_center.rs
@@ -1,48 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_flex_end.rs b/benches/generated/justify_content_column_flex_end.rs
index a65aadf38..14ea7e7b8 100644
--- a/benches/generated/justify_content_column_flex_end.rs
+++ b/benches/generated/justify_content_column_flex_end.rs
@@ -1,48 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::FlexEnd,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::FlexEnd,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_flex_start.rs b/benches/generated/justify_content_column_flex_start.rs
index 98084faad..72f13fe44 100644
--- a/benches/generated/justify_content_column_flex_start.rs
+++ b/benches/generated/justify_content_column_flex_start.rs
@@ -1,47 +1,54 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_min_height_and_margin_bottom.rs b/benches/generated/justify_content_column_min_height_and_margin_bottom.rs
index 2b971ec83..112f2cd6f 100644
--- a/benches/generated/justify_content_column_min_height_and_margin_bottom.rs
+++ b/benches/generated/justify_content_column_min_height_and_margin_bottom.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::Center,
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(50f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(20f32),
@@ -23,8 +15,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::Center,
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_min_height_and_margin_top.rs b/benches/generated/justify_content_column_min_height_and_margin_top.rs
index 7defa1773..21ffdf9fe 100644
--- a/benches/generated/justify_content_column_min_height_and_margin_top.rs
+++ b/benches/generated/justify_content_column_min_height_and_margin_top.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::Center,
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(50f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(20f32),
@@ -20,8 +12,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::Center,
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_space_around.rs b/benches/generated/justify_content_column_space_around.rs
index d21ac0ee8..4ca8357fa 100644
--- a/benches/generated/justify_content_column_space_around.rs
+++ b/benches/generated/justify_content_column_space_around.rs
@@ -1,48 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::SpaceAround,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::SpaceAround,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_space_between.rs b/benches/generated/justify_content_column_space_between.rs
index 0ee68ef8b..7d3b6b7f6 100644
--- a/benches/generated/justify_content_column_space_between.rs
+++ b/benches/generated/justify_content_column_space_between.rs
@@ -1,48 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::SpaceBetween,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::SpaceBetween,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_column_space_evenly.rs b/benches/generated/justify_content_column_space_evenly.rs
index 9bd621fc9..16d2cec55 100644
--- a/benches/generated/justify_content_column_space_evenly.rs
+++ b/benches/generated/justify_content_column_space_evenly.rs
@@ -1,48 +1,55 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::SpaceEvenly,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::SpaceEvenly,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_min_max.rs b/benches/generated/justify_content_min_max.rs
index 7404ce0df..2bd090923 100644
--- a/benches/generated/justify_content_min_max.rs
+++ b/benches/generated/justify_content_min_max.rs
@@ -1,20 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(200f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(60f32),
@@ -24,8 +11,29 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_min_width_with_padding_child_width_greater_than_parent.rs b/benches/generated/justify_content_min_width_with_padding_child_width_greater_than_parent.rs
index 9005acef6..3104c9cc5 100644
--- a/benches/generated/justify_content_min_width_with_padding_child_width_greater_than_parent.rs
+++ b/benches/generated/justify_content_min_width_with_padding_child_width_greater_than_parent.rs
@@ -1,44 +1,50 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(1000f32),
-                height: stretch::style::Dimension::Points(1584f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(300f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(400f32),
+                    ..Default::default()
+                },
+                padding: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(100f32),
+                    end: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
-            stretch::style::Style { ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    justify_content: stretch::style::JustifyContent::Center,
-                    min_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(400f32),
-                        ..Default::default()
-                    },
-                    padding: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Points(100f32),
-                        end: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![node000],
+        )
+        .unwrap();
+    let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node00]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(1000f32),
+                    height: stretch::style::Dimension::Points(1584f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(300f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_min_width_with_padding_child_width_lower_than_parent.rs b/benches/generated/justify_content_min_width_with_padding_child_width_lower_than_parent.rs
index 0539821b2..62604773d 100644
--- a/benches/generated/justify_content_min_width_with_padding_child_width_lower_than_parent.rs
+++ b/benches/generated/justify_content_min_width_with_padding_child_width_lower_than_parent.rs
@@ -1,44 +1,50 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(1080f32),
-                height: stretch::style::Dimension::Points(1584f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node000 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(199f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node00 = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(400f32),
+                    ..Default::default()
+                },
+                padding: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Points(100f32),
+                    end: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
-            stretch::style::Style { ..Default::default() },
-            vec![&stretch::node::Node::new(
-                stretch::style::Style {
-                    justify_content: stretch::style::JustifyContent::Center,
-                    min_size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(400f32),
-                        ..Default::default()
-                    },
-                    padding: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Points(100f32),
-                        end: stretch::style::Dimension::Points(100f32),
-                        ..Default::default()
-                    },
+            vec![node000],
+        )
+        .unwrap();
+    let node0 = stretch.new_node(stretch::style::Style { ..Default::default() }, vec![node00]).unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(1080f32),
+                    height: stretch::style::Dimension::Points(1584f32),
                     ..Default::default()
                 },
-                vec![&stretch::node::Node::new(
-                    stretch::style::Style {
-                        size: stretch::geometry::Size {
-                            width: stretch::style::Dimension::Points(199f32),
-                            height: stretch::style::Dimension::Points(100f32),
-                            ..Default::default()
-                        },
-                        ..Default::default()
-                    },
-                    vec![],
-                )],
-            )],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_overflow_min_max.rs b/benches/generated/justify_content_overflow_min_max.rs
index 37fc79042..4f1d89255 100644
--- a/benches/generated/justify_content_overflow_min_max.rs
+++ b/benches/generated/justify_content_overflow_min_max.rs
@@ -1,57 +1,64 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            justify_content: stretch::style::JustifyContent::Center,
-            min_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 0f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            max_size: stretch::geometry::Size {
-                height: stretch::style::Dimension::Points(110f32),
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 0f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 0f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_shrink: 0f32,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 0f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                justify_content: stretch::style::JustifyContent::Center,
+                min_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_shrink: 0f32,
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                max_size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(110f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_center.rs b/benches/generated/justify_content_row_center.rs
index c7e9cedbb..11329ff8e 100644
--- a/benches/generated/justify_content_row_center.rs
+++ b/benches/generated/justify_content_row_center.rs
@@ -1,47 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_flex_end.rs b/benches/generated/justify_content_row_flex_end.rs
index ae23c6983..4abfb36a1 100644
--- a/benches/generated/justify_content_row_flex_end.rs
+++ b/benches/generated/justify_content_row_flex_end.rs
@@ -1,47 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::FlexEnd,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::FlexEnd,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_flex_start.rs b/benches/generated/justify_content_row_flex_start.rs
index ef4c9ebe6..139cf2669 100644
--- a/benches/generated/justify_content_row_flex_start.rs
+++ b/benches/generated/justify_content_row_flex_start.rs
@@ -1,46 +1,44 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_max_width_and_margin.rs b/benches/generated/justify_content_row_max_width_and_margin.rs
index 8a1daa786..6a6ed7258 100644
--- a/benches/generated/justify_content_row_max_width_and_margin.rs
+++ b/benches/generated/justify_content_row_max_width_and_margin.rs
@@ -1,12 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size { width: stretch::style::Dimension::Points(100f32), ..Default::default() },
-            max_size: stretch::geometry::Size { width: stretch::style::Dimension::Points(80f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(20f32),
@@ -20,8 +15,24 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                max_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(80f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_min_width_and_margin.rs b/benches/generated/justify_content_row_min_width_and_margin.rs
index 125e7248c..7aabb8955 100644
--- a/benches/generated/justify_content_row_min_width_and_margin.rs
+++ b/benches/generated/justify_content_row_min_width_and_margin.rs
@@ -1,11 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            min_size: stretch::geometry::Size { width: stretch::style::Dimension::Points(50f32), ..Default::default() },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(20f32),
@@ -19,8 +15,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                min_size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_space_around.rs b/benches/generated/justify_content_row_space_around.rs
index 9928a30ff..5a47dd606 100644
--- a/benches/generated/justify_content_row_space_around.rs
+++ b/benches/generated/justify_content_row_space_around.rs
@@ -1,47 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::SpaceAround,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::SpaceAround,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_space_between.rs b/benches/generated/justify_content_row_space_between.rs
index 5c7e47cd8..087093bc4 100644
--- a/benches/generated/justify_content_row_space_between.rs
+++ b/benches/generated/justify_content_row_space_between.rs
@@ -1,47 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::SpaceBetween,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
-                    ..Default::default()
-                },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size { width: stretch::style::Dimension::Points(10f32), ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::SpaceBetween,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/justify_content_row_space_evenly.rs b/benches/generated/justify_content_row_space_evenly.rs
index e4afaf12c..525b5b614 100644
--- a/benches/generated/justify_content_row_space_evenly.rs
+++ b/benches/generated/justify_content_row_space_evenly.rs
@@ -1,47 +1,54 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::SpaceEvenly,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    height: stretch::style::Dimension::Points(10f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        height: stretch::style::Dimension::Points(10f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::SpaceEvenly,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_and_flex_column.rs b/benches/generated/margin_and_flex_column.rs
index 933671e38..ff23b1f58 100644
--- a/benches/generated/margin_and_flex_column.rs
+++ b/benches/generated/margin_and_flex_column.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_grow: 1f32,
                 margin: stretch::geometry::Rect {
@@ -20,8 +12,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_and_flex_row.rs b/benches/generated/margin_and_flex_row.rs
index 16e5f22c9..43b9f0351 100644
--- a/benches/generated/margin_and_flex_row.rs
+++ b/benches/generated/margin_and_flex_row.rs
@@ -1,14 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_grow: 1f32,
                 margin: stretch::geometry::Rect {
@@ -19,8 +12,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_and_stretch_column.rs b/benches/generated/margin_and_stretch_column.rs
index a951b0f48..b65e87b8e 100644
--- a/benches/generated/margin_and_stretch_column.rs
+++ b/benches/generated/margin_and_stretch_column.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_grow: 1f32,
                 margin: stretch::geometry::Rect {
@@ -20,8 +12,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_and_stretch_row.rs b/benches/generated/margin_and_stretch_row.rs
index 531a520d7..e0893aef9 100644
--- a/benches/generated/margin_and_stretch_row.rs
+++ b/benches/generated/margin_and_stretch_row.rs
@@ -1,14 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(100f32),
-                height: stretch::style::Dimension::Points(100f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 flex_grow: 1f32,
                 margin: stretch::geometry::Rect {
@@ -19,8 +12,20 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(100f32),
+                    height: stretch::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_bottom.rs b/benches/generated/margin_auto_bottom.rs
index b3e5f38d5..8abcb5af6 100644
--- a/benches/generated/margin_auto_bottom.rs
+++ b/benches/generated/margin_auto_bottom.rs
@@ -1,40 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect { bottom: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { bottom: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_bottom_and_top.rs b/benches/generated/margin_auto_bottom_and_top.rs
index 269538db8..b0f937944 100644
--- a/benches/generated/margin_auto_bottom_and_top.rs
+++ b/benches/generated/margin_auto_bottom_and_top.rs
@@ -1,44 +1,49 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Auto,
+                    bottom: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        top: stretch::style::Dimension::Auto,
-                        bottom: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_bottom_and_top_justify_center.rs b/benches/generated/margin_auto_bottom_and_top_justify_center.rs
index 73ce614d3..a4139dd01 100644
--- a/benches/generated/margin_auto_bottom_and_top_justify_center.rs
+++ b/benches/generated/margin_auto_bottom_and_top_justify_center.rs
@@ -1,44 +1,49 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Auto,
+                    bottom: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        top: stretch::style::Dimension::Auto,
-                        bottom: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left.rs b/benches/generated/margin_auto_left.rs
index bc855a09f..ab3d65685 100644
--- a/benches/generated/margin_auto_left.rs
+++ b/benches/generated/margin_auto_left.rs
@@ -1,40 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect { start: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { start: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_and_right.rs b/benches/generated/margin_auto_left_and_right.rs
index d50b03935..60e74843d 100644
--- a/benches/generated/margin_auto_left_and_right.rs
+++ b/benches/generated/margin_auto_left_and_right.rs
@@ -1,43 +1,48 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Auto,
+                    end: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Auto,
-                        end: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_and_right_column.rs b/benches/generated/margin_auto_left_and_right_column.rs
index c2961bd8e..ab74ad490 100644
--- a/benches/generated/margin_auto_left_and_right_column.rs
+++ b/benches/generated/margin_auto_left_and_right_column.rs
@@ -1,44 +1,49 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Auto,
+                    end: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Auto,
-                        end: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_and_right_column_and_center.rs b/benches/generated/margin_auto_left_and_right_column_and_center.rs
index c2961bd8e..ab74ad490 100644
--- a/benches/generated/margin_auto_left_and_right_column_and_center.rs
+++ b/benches/generated/margin_auto_left_and_right_column_and_center.rs
@@ -1,44 +1,49 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Auto,
+                    end: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Auto,
-                        end: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_and_right_strech.rs b/benches/generated/margin_auto_left_and_right_strech.rs
index d50b03935..60e74843d 100644
--- a/benches/generated/margin_auto_left_and_right_strech.rs
+++ b/benches/generated/margin_auto_left_and_right_strech.rs
@@ -1,43 +1,48 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    start: stretch::style::Dimension::Auto,
+                    end: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        start: stretch::style::Dimension::Auto,
-                        end: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_child_bigger_than_parent.rs b/benches/generated/margin_auto_left_child_bigger_than_parent.rs
index 79968a944..2e422ba5b 100644
--- a/benches/generated/margin_auto_left_child_bigger_than_parent.rs
+++ b/benches/generated/margin_auto_left_child_bigger_than_parent.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(52f32),
-                height: stretch::style::Dimension::Points(52f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(72f32),
@@ -20,8 +12,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(52f32),
+                    height: stretch::style::Dimension::Points(52f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_fix_right_child_bigger_than_parent.rs b/benches/generated/margin_auto_left_fix_right_child_bigger_than_parent.rs
index 3dba2c107..5fd650186 100644
--- a/benches/generated/margin_auto_left_fix_right_child_bigger_than_parent.rs
+++ b/benches/generated/margin_auto_left_fix_right_child_bigger_than_parent.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(52f32),
-                height: stretch::style::Dimension::Points(52f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(72f32),
@@ -24,8 +16,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(52f32),
+                    height: stretch::style::Dimension::Points(52f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_right_child_bigger_than_parent.rs b/benches/generated/margin_auto_left_right_child_bigger_than_parent.rs
index 84cf30239..545e7ef40 100644
--- a/benches/generated/margin_auto_left_right_child_bigger_than_parent.rs
+++ b/benches/generated/margin_auto_left_right_child_bigger_than_parent.rs
@@ -1,15 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            justify_content: stretch::style::JustifyContent::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(52f32),
-                height: stretch::style::Dimension::Points(52f32),
-                ..Default::default()
-            },
-            ..Default::default()
-        },
-        vec![&stretch::node::Node::new(
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
             stretch::style::Style {
                 size: stretch::geometry::Size {
                     width: stretch::style::Dimension::Points(72f32),
@@ -24,8 +16,21 @@ pub fn compute() -> stretch::result::Layout {
                 ..Default::default()
             },
             vec![],
-        )],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                justify_content: stretch::style::JustifyContent::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(52f32),
+                    height: stretch::style::Dimension::Points(52f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            vec![node0],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_left_stretching_child.rs b/benches/generated/margin_auto_left_stretching_child.rs
index 27781564c..80ac5482b 100644
--- a/benches/generated/margin_auto_left_stretching_child.rs
+++ b/benches/generated/margin_auto_left_stretching_child.rs
@@ -1,38 +1,43 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Percent(0f32),
+                margin: stretch::geometry::Rect { start: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 1f32,
-                    flex_basis: stretch::style::Dimension::Percent(0f32),
-                    margin: stretch::geometry::Rect { start: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_mutiple_children_column.rs b/benches/generated/margin_auto_mutiple_children_column.rs
index 881381392..a69786adf 100644
--- a/benches/generated/margin_auto_mutiple_children_column.rs
+++ b/benches/generated/margin_auto_mutiple_children_column.rs
@@ -1,53 +1,60 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
+                margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_mutiple_children_row.rs b/benches/generated/margin_auto_mutiple_children_row.rs
index 1c6d95d06..2e3d2c02b 100644
--- a/benches/generated/margin_auto_mutiple_children_row.rs
+++ b/benches/generated/margin_auto_mutiple_children_row.rs
@@ -1,52 +1,59 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect { end: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { end: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { end: stretch::style::Dimension::Auto, ..Default::default() },
+                margin: stretch::geometry::Rect { end: stretch::style::Dimension::Auto, ..Default::default() },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node2 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1, node2],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_right.rs b/benches/generated/margin_auto_right.rs
index 4906ea4a5..82b0830b8 100644
--- a/benches/generated/margin_auto_right.rs
+++ b/benches/generated/margin_auto_right.rs
@@ -1,40 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect { end: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { end: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_top.rs b/benches/generated/margin_auto_top.rs
index 564ba0f79..cb240b22e 100644
--- a/benches/generated/margin_auto_top.rs
+++ b/benches/generated/margin_auto_top.rs
@@ -1,40 +1,45 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_top_and_bottom_strech.rs b/benches/generated/margin_auto_top_and_bottom_strech.rs
index 284b52760..d38cd89b2 100644
--- a/benches/generated/margin_auto_top_and_bottom_strech.rs
+++ b/benches/generated/margin_auto_top_and_bottom_strech.rs
@@ -1,44 +1,49 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_direction: stretch::style::FlexDirection::Column,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
+                    ..Default::default()
+                },
+                margin: stretch::geometry::Rect {
+                    top: stretch::style::Dimension::Auto,
+                    bottom: stretch::style::Dimension::Auto,
+                    ..Default::default()
+                },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
-                    margin: stretch::geometry::Rect {
-                        top: stretch::style::Dimension::Auto,
-                        bottom: stretch::style::Dimension::Auto,
-                        ..Default::default()
-                    },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_direction: stretch::style::FlexDirection::Column,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_auto_top_stretching_child.rs b/benches/generated/margin_auto_top_stretching_child.rs
index 0ffef3da1..2bc2f223b 100644
--- a/benches/generated/margin_auto_top_stretching_child.rs
+++ b/benches/generated/margin_auto_top_stretching_child.rs
@@ -1,38 +1,43 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            align_items: stretch::style::AlignItems::Center,
-            size: stretch::geometry::Size {
-                width: stretch::style::Dimension::Points(200f32),
-                height: stretch::style::Dimension::Points(200f32),
+pub fn compute() {
+    let mut stretch = stretch::Stretch::new();
+    let node0 = stretch
+        .new_node(
+            stretch::style::Style {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: stretch::style::Dimension::Percent(0f32),
+                margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
                 ..Default::default()
             },
-            ..Default::default()
-        },
-        vec![
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    flex_grow: 1f32,
-                    flex_shrink: 1f32,
-                    flex_basis: stretch::style::Dimension::Percent(0f32),
-                    margin: stretch::geometry::Rect { top: stretch::style::Dimension::Auto, ..Default::default() },
+            vec![],
+        )
+        .unwrap();
+    let node1 = stretch
+        .new_node(
+            stretch::style::Style {
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(50f32),
+                    height: stretch::style::Dimension::Points(50f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-            &stretch::node::Node::new(
-                stretch::style::Style {
-                    size: stretch::geometry::Size {
-                        width: stretch::style::Dimension::Points(50f32),
-                        height: stretch::style::Dimension::Points(50f32),
-                        ..Default::default()
-                    },
+                ..Default::default()
+            },
+            vec![],
+        )
+        .unwrap();
+    let node = stretch
+        .new_node(
+            stretch::style::Style {
+                align_items: stretch::style::AlignItems::Center,
+                size: stretch::geometry::Size {
+                    width: stretch::style::Dimension::Points(200f32),
+                    height: stretch::style::Dimension::Points(200f32),
                     ..Default::default()
                 },
-                vec![],
-            ),
-        ],
-    )
-    .compute_layout(stretch::geometry::Size::undefined())
-    .unwrap()
+                ..Default::default()
+            },
+            vec![node0, node1],
+        )
+        .unwrap();
+    stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
 }
diff --git a/benches/generated/margin_bottom.rs b/benches/generated/margin_bottom.rs
index 6ac077a5c..825664427 100644
--- a/benches/generated/margin_bottom.rs
+++ b/benches/generated/margin_bottom.rs
@@ -1,16 +1,7 @@
-pub fn compute() -> stretch::result::Layout {
-    stretch::node::Node::new(
-        stretch::style::Style {
-            flex_directi

El parche sigue, pero se cortó acá: pedí el commit por git para verlo entero.