+ }
+ else {
+ # you need to check error_message() for details.
+ return ();
+ }
+}
+
+sub build {
+ my $self = shift;
+ my $content = { $self->content };
+ my $skel = shift;
+ my $data;
+ if (ref($skel) ne 'HASH') { croak 'Failed to build non-hash' };
+ foreach my $k (keys(%$skel)) {
+ my $val = $skel->{$k};
+ # Rules for building from the skeleton:
+ # 1. If the value is a hashref, build it recursively.
+ if(ref($val) eq 'HASH') {
+ $data->{$k} = $self->build($val);
+ }
+ # 2. If the value starts with an underscore, it's treated as a method name.
+ elsif($val =~ /^_/ and $self->can($val)) {
+ $data->{$k} = $self->can($val)->($self);
+ }
+ # 3. If the value is undefined, keep it undefined.
+ elsif(!defined($val)) {
+ $data->{$k} = undef;
+ }
+ # 4. If the value is the name of a key in $self->content, look up that value.