    001    package org.junit.rules;
    002
    003    import org.junit.runner.Description;
    004    import org.junit.runners.model.Statement;
    005
    006    /**
    007     * Runs a collection of rules on a statement.
    008     *
    009     * @since 4.9
    010     */
    011    public class RunRules extends Statement {
    012        private final Statement statement;
    013
    014        public RunRules(Statement base, Iterable<TestRule> rules, Description description) {
    015            statement = applyAll(base, rules, description);
    016        }
    017
    018        @Override
    019        public void evaluate() throws Throwable {
    020            statement.evaluate();
    021        }
    022
    023        private static Statement applyAll(Statement result, Iterable<TestRule> rules,
    024                Description description) {
    025            for (TestRule each : rules) {
    026                result = each.apply(result, description);
    027            }
    028            return result;
    029        }
    030    }