+sub _set_defaults {
+ my ($self, %params) = @_;
+
+ while (my ($key, $value) = each %params) {
+ $self->settings(@{ $self->settings || [] }, { key => $key, value => $value }) if !$self->_get_setting($key);
+ }
+
+ return $self;
+}
+
+sub clone_and_reset_deep {
+ my ($self) = @_;
+
+ my $clone = $self->clone_and_reset;
+ $clone->settings(map { $_->clone_and_reset } $self->settings);
+ $clone->is_default(0);
+ $clone->name('');
+ return $clone;
+}
+
+sub flatten {
+ my ($self) = @_;
+
+ return map {
+ $_->key => $_->value
+ } $self->settings;
+}
+