// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/Situation.java
// public interface Situation {
// 
//     public long getUID();
//     public SituationEvent getActivation();
//     public SituationEvent getDeactivation();
//     public void setDeactivation(SituationEvent deactivation);
//     public boolean isActive();
//     public List<? extends Participation> getParticipations();
//     public SituationType getType();
// }
// 
// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/bindings/SnapshotPolicy.java
// public enum SnapshotPolicy {
//     Shallow,
//     Deep
// }


import br.ufes.inf.lprm.situation.model.Situation;
import br.ufes.inf.lprm.situation.model.bindings.SnapshotPolicy;
import java.lang.reflect.Field;
import java.util.*;
    public Snapshot(String label, Field field, SnapshotPolicy policy) {
        this.label  = label;
        this.field  = field;
        this.policy = policy;
    }

    @Override
    public String getLabel() {
        return label;
    }

    public Field getField() {
        return field;
    }

    @Override
    public SnapshotPolicy getPolicy() {
        return policy;
    }

    private List<Field> fieldsFromClass(Class clazz) {
        List<Field> fields = new ArrayList<Field>();
        Class superclazz = clazz.getSuperclass();
        if (superclazz != null) {
            fields.addAll(fieldsFromClass(superclazz));
        }
        for (Field field: clazz.getDeclaredFields()) fields.add(field);
        return fields;
    }

// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/Situation.java
// public interface Situation {
// 
//     public long getUID();
//     public SituationEvent getActivation();
//     public SituationEvent getDeactivation();
//     public void setDeactivation(SituationEvent deactivation);
//     public boolean isActive();
//     public List<? extends Participation> getParticipations();
//     public SituationType getType();
// }
// 
// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/bindings/SnapshotPolicy.java
// public enum SnapshotPolicy {
//     Shallow,
//     Deep
// }


// Path: scene-core/src/main/java/br/ufes/inf/lprm/scene/model/Snapshot.java
import br.ufes.inf.lprm.situation.model.Situation;
import br.ufes.inf.lprm.situation.model.bindings.SnapshotPolicy;
import java.lang.reflect.Field;
import java.util.*;

    public Snapshot(String label, Field field, SnapshotPolicy policy) {
        this.label  = label;
        this.field  = field;
        this.policy = policy;
    }

    @Override
    public String getLabel() {
        return label;
    }

    public Field getField() {
        return field;
    }

    @Override
    public SnapshotPolicy getPolicy() {
        return policy;
    }

    private List<Field> fieldsFromClass(Class clazz) {
        List<Field> fields = new ArrayList<Field>();
        Class superclazz = clazz.getSuperclass();
        if (superclazz != null) {
            fields.addAll(fieldsFromClass(superclazz));
        }
        for (Field field: clazz.getDeclaredFields()) fields.add(field);
        return fields;
    }

    public void set(Situation situation, Object src) throws IllegalAccessException, InstantiationException {