// Path: src/chap6/Environment.java
// public interface Environment {
//     void put(String name, Object value);
//     Object get(String name);
// }
// 
// Path: src/chap7/FuncEvaluator.java
// @Reviser public static interface EnvEx extends Environment {
//     void putNew(String name, Object value);
//     Environment where(String name);
//     void setOuter(Environment e);
// }


import chap6.Environment;
import chap7.FuncEvaluator.EnvEx;
package chap9;

public class StoneObject {
    public static class AccessException extends Exception {}
    protected Environment env;
    public StoneObject(Environment e) { env = e; }
    @Override public String toString() { return "<object:" + hashCode() + ">"; }
    public Object read(String member) throws AccessException {
        return getEnv(member).get(member);
    }
    public void write(String member, Object value) throws AccessException {
// Path: src/chap6/Environment.java
// public interface Environment {
//     void put(String name, Object value);
//     Object get(String name);
// }
// 
// Path: src/chap7/FuncEvaluator.java
// @Reviser public static interface EnvEx extends Environment {
//     void putNew(String name, Object value);
//     Environment where(String name);
//     void setOuter(Environment e);
// }


// Path: src/chap9/StoneObject.java
import chap6.Environment;
import chap7.FuncEvaluator.EnvEx;

package chap9;

public class StoneObject {
    public static class AccessException extends Exception {}
    protected Environment env;
    public StoneObject(Environment e) { env = e; }
    @Override public String toString() { return "<object:" + hashCode() + ">"; }
    public Object read(String member) throws AccessException {
        return getEnv(member).get(member);
    }
    public void write(String member, Object value) throws AccessException {
        ((EnvEx)getEnv(member)).putNew(member, value);