class WDSObjectField implements IField {

    @Override
    public <T> T in(final IObject env)
            throws ReadValueException, InvalidArgumentException {
        if (null == env) {
            throw new InvalidArgumentException("Environment should not be null.");
        }
        Object value = null;
        try {
            for (IObject rule : this.rules) {
                List<String> args = (ArrayList<String>) rule.getValue(this.args);
                String name = (String) rule.getValue(this.strategyName);
                IFunction<StrategyAndArgs, Object> func = this.strategyExecutors.get(name);
                if (null == func) {
                    func = this.strategyExecutors.get(OUTER_STRATEGY_NAME);
                }
                value = func.execute(
                        new StrategyAndArgs(this.strategies.get(name), env, args, value)
                );
            }
        } catch (Exception e) {
            throw new ReadValueException("Could not apply rules.", e);
        }
        if (null == value) {
            return null;
        }

        return (T) value;
    }

    public  WDSObjectField(final List<IObject> methodRules);

}