PIVOT-1012, PIVOT-999:  Many more places can use the "Utils" methods
to do parameter validation.  Use the "forEach" method with a bunch of
ListenerList implementations.

Code cleanup:  Add a "checkSkin" method in Component that does
the common check to make sure the skin being installed implements
the correct interface for the component.

Update all the places that were doing this check to use this new
method.

Some local variable renaming.

Add some message text to some exceptions that previously had none.

Add a new "setRange" method to Slider using the "Span(Sequence<?>)"
constructor.  Add Javadoc to that constructor.

Reflow some comments that had been wrapped weirdly.


git-svn-id: https://svn.apache.org/repos/asf/pivot/trunk@1819096 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/wtk/src/org/apache/pivot/wtk/CalendarButton.java b/wtk/src/org/apache/pivot/wtk/CalendarButton.java
index 408ce89..34ca0dc 100644
--- a/wtk/src/org/apache/pivot/wtk/CalendarButton.java
+++ b/wtk/src/org/apache/pivot/wtk/CalendarButton.java
@@ -139,10 +139,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof CalendarButton.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + CalendarButton.Skin.class.getName());
-        }
+        checkSkin(skin, CalendarButton.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/Clipboard.java b/wtk/src/org/apache/pivot/wtk/Clipboard.java
index 0bd858e..a6f2191 100644
--- a/wtk/src/org/apache/pivot/wtk/Clipboard.java
+++ b/wtk/src/org/apache/pivot/wtk/Clipboard.java
@@ -20,6 +20,8 @@
 import java.awt.datatransfer.ClipboardOwner;
 import java.awt.datatransfer.Transferable;
 
+import org.apache.pivot.util.Utils;
+
 /**
  * Singleton class providing a means of sharing data between components and
  * applications.
@@ -47,18 +49,18 @@
      * @return The current clipboard content manifest.
      */
     public static Manifest getContent() {
-        Manifest contentLocal = Clipboard.content;
+        Manifest currentContent = Clipboard.content;
 
-        if (contentLocal == null) {
+        if (currentContent == null) {
             try {
                 java.awt.datatransfer.Clipboard awtClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
-                contentLocal = new RemoteManifest(awtClipboard.getContents(null));
+                currentContent = new RemoteManifest(awtClipboard.getContents(null));
             } catch (SecurityException exception) {
                 // No-op
             }
         }
 
-        return contentLocal;
+        return currentContent;
     }
 
     /**
@@ -80,9 +82,7 @@
      */
     public static void setContent(LocalManifest content,
         ClipboardContentListener clipboardContentListener) {
-        if (content == null) {
-            throw new IllegalArgumentException("content is null");
-        }
+        Utils.checkNull(content, "content");
 
         try {
             java.awt.datatransfer.Clipboard awtClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
diff --git a/wtk/src/org/apache/pivot/wtk/ColorChooserButton.java b/wtk/src/org/apache/pivot/wtk/ColorChooserButton.java
index cfcb756..715d798 100644
--- a/wtk/src/org/apache/pivot/wtk/ColorChooserButton.java
+++ b/wtk/src/org/apache/pivot/wtk/ColorChooserButton.java
@@ -61,10 +61,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof ColorChooserButton.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + ColorChooserButton.Skin.class.getName());
-        }
+        checkSkin(skin, ColorChooserButton.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/Component.java b/wtk/src/org/apache/pivot/wtk/Component.java
index 8732b30..a5a92a7 100644
--- a/wtk/src/org/apache/pivot/wtk/Component.java
+++ b/wtk/src/org/apache/pivot/wtk/Component.java
@@ -716,6 +716,21 @@
     }
 
     /**
+     * Check if the given skin is correct with respect to the necessary skin class.
+     * <p> Meant to be called from the subclass' {@link #setSkin} method.
+     *
+     * @param skin The skin object to check.
+     * @param expectedClass What the skin class should be.
+     * @throws IllegalArgumentException if the skin object doesn't implement the given skin interface.
+     */
+    protected final void checkSkin(Skin skin, Class<?> expectedClass) {
+        if (!expectedClass.isInstance(skin)) {
+            throw new IllegalArgumentException("Skin class must implement "
+                + expectedClass.getName());
+        }
+    }
+
+    /**
      * Installs the skin for the given component class, as defined by the
      * current theme.
      *
diff --git a/wtk/src/org/apache/pivot/wtk/Container.java b/wtk/src/org/apache/pivot/wtk/Container.java
index 58e5652..d85dd4b 100644
--- a/wtk/src/org/apache/pivot/wtk/Container.java
+++ b/wtk/src/org/apache/pivot/wtk/Container.java
@@ -24,8 +24,10 @@
 
 import org.apache.pivot.collections.ArrayList;
 import org.apache.pivot.collections.Sequence;
+import org.apache.pivot.util.BooleanResult;
 import org.apache.pivot.util.ImmutableIterator;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.wtk.effects.Decorator;
 
 /**
@@ -37,31 +39,23 @@
         ContainerListener {
         @Override
         public void componentInserted(Container container, int index) {
-            for (ContainerListener listener : this) {
-                listener.componentInserted(container, index);
-            }
+            forEach(listener -> listener.componentInserted(container, index));
         }
 
         @Override
         public void componentsRemoved(Container container, int index, Sequence<Component> components) {
-            for (ContainerListener listener : this) {
-                listener.componentsRemoved(container, index, components);
-            }
+            forEach(listener -> listener.componentsRemoved(container, index, components));
         }
 
         @Override
         public void componentMoved(Container container, int from, int to) {
-            for (ContainerListener listener : this) {
-                listener.componentMoved(container, from, to);
-            }
+            forEach(listener -> listener.componentMoved(container, from, to));
         }
 
         @Override
         public void focusTraversalPolicyChanged(Container container,
             FocusTraversalPolicy previousFocusTraversalPolicy) {
-            for (ContainerListener listener : this) {
-                listener.focusTraversalPolicyChanged(container, previousFocusTraversalPolicy);
-            }
+            forEach(listener -> listener.focusTraversalPolicyChanged(container, previousFocusTraversalPolicy));
         }
     }
 
@@ -69,48 +63,40 @@
         implements ContainerMouseListener {
         @Override
         public boolean mouseMove(Container container, int x, int y) {
-            boolean consumed = false;
+            BooleanResult consumed = new BooleanResult(false);
 
-            for (ContainerMouseListener listener : this) {
-                consumed |= listener.mouseMove(container, x, y);
-            }
+            forEach(listener -> consumed.or(listener.mouseMove(container, x, y)));
 
-            return consumed;
+            return consumed.get();
         }
 
         @Override
         public boolean mouseDown(Container container, Mouse.Button button, int x, int y) {
-            boolean consumed = false;
+            BooleanResult consumed = new BooleanResult(false);
 
-            for (ContainerMouseListener listener : this) {
-                consumed |= listener.mouseDown(container, button, x, y);
-            }
+            forEach(listener -> consumed.or(listener.mouseDown(container, button, x, y)));
 
-            return consumed;
+            return consumed.get();
         }
 
         @Override
         public boolean mouseUp(Container container, Mouse.Button button, int x, int y) {
-            boolean consumed = false;
+            BooleanResult consumed = new BooleanResult(false);
 
-            for (ContainerMouseListener listener : this) {
-                consumed |= listener.mouseUp(container, button, x, y);
-            }
+            forEach(listener -> consumed.or(listener.mouseUp(container, button, x, y)));
 
-            return consumed;
+            return consumed.get();
         }
 
         @Override
         public boolean mouseWheel(Container container, Mouse.ScrollType scrollType,
             int scrollAmount, int wheelRotation, int x, int y) {
-            boolean consumed = false;
+            BooleanResult consumed = new BooleanResult(false);
 
-            for (ContainerMouseListener listener : this) {
-                consumed |= listener.mouseWheel(container, scrollType, scrollAmount, wheelRotation,
-                    x, y);
-            }
+            forEach(listener -> consumed.or(listener.mouseWheel(container, scrollType,
+                    scrollAmount, wheelRotation, x, y)));
 
-            return consumed;
+            return consumed.get();
         }
     }
 
@@ -144,9 +130,7 @@
     @Override
     public void insert(Component component, int index) {
         assertEventDispatchThread();
-        if (component == null) {
-            throw new IllegalArgumentException("component is null.");
-        }
+        Utils.checkNull(component, "component");
 
         if (component instanceof Container && ((Container) component).isAncestor(this)) {
             throw new IllegalArgumentException("Component already exists in ancestry.");
@@ -318,9 +302,7 @@
     }
 
     public Component getNamedComponent(String name) {
-        if (name == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(name, "name");
 
         Component namedComponent = null;
 
diff --git a/wtk/src/org/apache/pivot/wtk/DesktopApplicationContext.java b/wtk/src/org/apache/pivot/wtk/DesktopApplicationContext.java
index 8180bd3..c231ba3 100644
--- a/wtk/src/org/apache/pivot/wtk/DesktopApplicationContext.java
+++ b/wtk/src/org/apache/pivot/wtk/DesktopApplicationContext.java
@@ -40,6 +40,7 @@
 import org.apache.pivot.collections.HashMap;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.collections.immutable.ImmutableMap;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.wtk.media.Image;
 import org.apache.pivot.wtk.media.Picture;
 
@@ -836,12 +837,10 @@
      * @throws IllegalStateException if the application is being displayed full screen.
      */
     public static void sizeHostToFit(Window window) {
-        if (window == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(window, "window");
 
         if (isFullScreen()) {
-            throw new IllegalStateException();
+            throw new IllegalStateException("Full screen window cannot be sized to fit.");
         }
 
         Dimensions size = window.getPreferredSize();
diff --git a/wtk/src/org/apache/pivot/wtk/Dialog.java b/wtk/src/org/apache/pivot/wtk/Dialog.java
index 34102a3..7f6fdc7 100644
--- a/wtk/src/org/apache/pivot/wtk/Dialog.java
+++ b/wtk/src/org/apache/pivot/wtk/Dialog.java
@@ -17,7 +17,9 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.util.Vote;
+import org.apache.pivot.util.VoteResult;
 
 /**
  * Window class whose primary purpose is to facilitate interaction between an
@@ -28,9 +30,7 @@
         DialogListener {
         @Override
         public void modalChanged(Dialog dialog) {
-            for (DialogListener listener : this) {
-                listener.modalChanged(dialog);
-            }
+            forEach(listener -> listener.modalChanged(dialog));
         }
     }
 
@@ -38,27 +38,21 @@
         implements DialogStateListener {
         @Override
         public Vote previewDialogClose(Dialog dialog, boolean result) {
-            Vote vote = Vote.APPROVE;
+            VoteResult vote = new VoteResult(Vote.APPROVE);
 
-            for (DialogStateListener listener : this) {
-                vote = vote.tally(listener.previewDialogClose(dialog, result));
-            }
+            forEach(listener -> vote.tally(listener.previewDialogClose(dialog, result)));
 
-            return vote;
+            return vote.get();
         }
 
         @Override
         public void dialogCloseVetoed(Dialog dialog, Vote reason) {
-            for (DialogStateListener listener : this) {
-                listener.dialogCloseVetoed(dialog, reason);
-            }
+            forEach(listener -> listener.dialogCloseVetoed(dialog, reason));
         }
 
         @Override
         public void dialogClosed(Dialog dialog, boolean modal) {
-            for (DialogStateListener listener : this) {
-                listener.dialogClosed(dialog, modal);
-            }
+            forEach(listener -> listener.dialogClosed(dialog, modal));
         }
     }
 
@@ -150,9 +144,7 @@
      * dialog is closed.
      */
     public final void open(Window owner, DialogCloseListener dialogCloseListenerArgument) {
-        if (owner == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(owner, "owner");
 
         open(owner.getDisplay(), owner, dialogCloseListenerArgument);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/FileBrowser.java b/wtk/src/org/apache/pivot/wtk/FileBrowser.java
index 7096eef..5cb2715 100644
--- a/wtk/src/org/apache/pivot/wtk/FileBrowser.java
+++ b/wtk/src/org/apache/pivot/wtk/FileBrowser.java
@@ -24,6 +24,7 @@
 import org.apache.pivot.io.FileList;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Component representing a file browser.
@@ -42,46 +43,34 @@
         implements FileBrowserListener {
         @Override
         public void rootDirectoryChanged(FileBrowser fileBrowser, File previousRootDirectory) {
-            for (FileBrowserListener listener : this) {
-                listener.rootDirectoryChanged(fileBrowser, previousRootDirectory);
-            }
+            forEach(listener -> listener.rootDirectoryChanged(fileBrowser, previousRootDirectory));
         }
 
         @Override
         public void selectedFileAdded(FileBrowser fileBrowser, File file) {
-            for (FileBrowserListener listener : this) {
-                listener.selectedFileAdded(fileBrowser, file);
-            }
+            forEach(listener -> listener.selectedFileAdded(fileBrowser, file));
         }
 
         @Override
         public void selectedFileRemoved(FileBrowser fileBrowser, File file) {
-            for (FileBrowserListener listener : this) {
-                listener.selectedFileRemoved(fileBrowser, file);
-            }
+            forEach(listener -> listener.selectedFileRemoved(fileBrowser, file));
         }
 
         @Override
         public void selectedFilesChanged(FileBrowser fileBrowser,
             Sequence<File> previousSelectedFiles) {
-            for (FileBrowserListener listener : this) {
-                listener.selectedFilesChanged(fileBrowser, previousSelectedFiles);
-            }
+            forEach(listener -> listener.selectedFilesChanged(fileBrowser, previousSelectedFiles));
         }
 
         @Override
         public void multiSelectChanged(FileBrowser fileBrowser) {
-            for (FileBrowserListener listener : this) {
-                listener.multiSelectChanged(fileBrowser);
-            }
+            forEach(listener -> listener.multiSelectChanged(fileBrowser));
         }
 
         @Override
         public void disabledFileFilterChanged(FileBrowser fileBrowser,
             Filter<File> previousDisabledFileFilter) {
-            for (FileBrowserListener listener : this) {
-                listener.disabledFileFilterChanged(fileBrowser, previousDisabledFileFilter);
-            }
+            forEach(listener -> listener.disabledFileFilterChanged(fileBrowser, previousDisabledFileFilter));
         }
     }
 
@@ -107,13 +96,11 @@
      * @param rootFolder The root folder full name.
      */
     public FileBrowser(String rootFolder) {
-        if (rootFolder == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(rootFolder, "rootFolder");
 
         rootDirectory = new File(rootFolder);
         if (!rootDirectory.isDirectory()) {
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException(rootFolder + " is not a directory.");
         }
 
         installSkin(FileBrowser.class);
@@ -136,8 +123,10 @@
      * or is not a directory.
      */
     public void setRootDirectory(File rootDirectory) {
-        if (rootDirectory == null || !rootDirectory.isDirectory()) {
-            throw new IllegalArgumentException();
+        Utils.checkNull(rootDirectory, "rootDirectory");
+
+        if (!rootDirectory.isDirectory()) {
+            throw new IllegalArgumentException(rootDirectory.getPath() + " is not a directory.");
         }
 
         if (rootDirectory.exists()) {
@@ -163,14 +152,12 @@
      * or if the file is not in the current root directory.
      */
     public boolean addSelectedFile(final File file) {
-        if (file == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(file, "file");
 
         File fileMutable = file;
         if (fileMutable.isAbsolute()) {
             if (!fileMutable.getParentFile().equals(rootDirectory)) {
-                throw new IllegalArgumentException();
+                throw new IllegalArgumentException(file.getPath() + " is not a child of the root directory.");
             }
         } else {
             fileMutable = new File(rootDirectory, fileMutable.getPath());
@@ -193,9 +180,7 @@
      * @throws IllegalArgumentException if the file argument is {@code null}.
      */
     public boolean removeSelectedFile(File file) {
-        if (file == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(file, "file");
 
         int index = selectedFiles.remove(file);
         if (index != -1) {
@@ -258,9 +243,7 @@
      * current root directory.
      */
     public Sequence<File> setSelectedFiles(Sequence<File> selectedFiles) {
-        if (selectedFiles == null) {
-            throw new IllegalArgumentException("selectedFiles is null.");
-        }
+        Utils.checkNull(selectedFiles, "selectedFiles");
 
         if (!multiSelect && selectedFiles.getLength() > 1) {
             throw new IllegalArgumentException("Multi-select is not enabled.");
@@ -273,16 +256,14 @@
         for (int i = 0, n = selectedFiles.getLength(); i < n; i++) {
             File file = selectedFiles.get(i);
 
-            if (file == null) {
-                throw new IllegalArgumentException("file is null.");
-            }
+            Utils.checkNull(file, "file");
 
             if (!file.isAbsolute()) {
                 file = new File(rootDirectory, file.getPath());
             }
 
             if (!file.getParentFile().equals(rootDirectory)) {
-                throw new IllegalArgumentException();
+                throw new IllegalArgumentException(file.getPath() + " is not a child of the root directory.");
             }
 
             fileList.add(file);
diff --git a/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java b/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java
index 2b6b184..13f09ff 100644
--- a/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java
+++ b/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java
@@ -24,6 +24,7 @@
 import org.apache.pivot.io.FileList;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * File browser sheet.
@@ -119,13 +120,8 @@
      * @param rootFolder The root folder full name.
      */
     public FileBrowserSheet(Mode mode, String rootFolder) {
-        if (mode == null) {
-            throw new IllegalArgumentException();
-        }
-
-        if (rootFolder == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(mode, "mode");
+        Utils.checkNullOrEmpty(rootFolder, "rootFolder");
 
         this.mode = mode;
 
@@ -139,9 +135,7 @@
     }
 
     public void setMode(Mode mode) {
-        if (mode == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(mode, "mode");
 
         Mode previousMode = this.mode;
 
@@ -162,26 +156,23 @@
      * @throws IllegalArgumentException if the folder argument is {@code null}.
      */
     public void setRootFolder(String rootFolder) {
-        if (rootFolder == null) {
-            throw new IllegalArgumentException("Root folder is null.");
-        }
+        Utils.checkNullOrEmpty(rootFolder, "rootFolder");
 
-        rootDirectory = new File(rootFolder);
-        if (!rootDirectory.isDirectory()) {
+        File rootFile = new File(rootFolder);
+        if (!rootFile.isDirectory()) {
             // Give some grace here to allow setting the root directory
             // to a regular file and have it work (by using its parent)
-            rootDirectory = rootDirectory.getParentFile();
-            if (rootDirectory == null || !rootDirectory.isDirectory()) {
-                throw new IllegalArgumentException("Root folder is not a directory.");
+            rootFile = rootFile.getParentFile();
+            if (rootFile == null || !rootFile.isDirectory()) {
+                throw new IllegalArgumentException(rootFolder + " is not a directory.");
             }
         }
+        this.rootDirectory = rootFile;
 
     }
 
     public void setRootDirectory(File rootDirectory) {
-        if (rootDirectory == null) {
-            throw new IllegalArgumentException("Root directory is null.");
-        }
+        Utils.checkNull(rootDirectory, "rootDirectory");
 
         if (!rootDirectory.isDirectory()) {
             // Give some grace here to allow setting the root directory
@@ -259,9 +250,7 @@
      * current root directory.
      */
     public Sequence<File> setSelectedFiles(Sequence<File> selectedFiles) {
-        if (selectedFiles == null) {
-            throw new IllegalArgumentException("selectedFiles is null.");
-        }
+        Utils.checkNull(selectedFiles, "selectedFiles");
 
         if (mode != Mode.OPEN_MULTIPLE && selectedFiles.getLength() > 1) {
             throw new IllegalArgumentException("Multi-select is not enabled.");
@@ -274,16 +263,14 @@
         for (int i = 0, n = selectedFiles.getLength(); i < n; i++) {
             File file = selectedFiles.get(i);
 
-            if (file == null) {
-                throw new IllegalArgumentException("file is null.");
-            }
+            Utils.checkNull(file, "file");
 
             if (!file.isAbsolute()) {
                 file = new File(rootDirectory, file.getPath());
             }
 
             if (!file.getParentFile().equals(rootDirectory)) {
-                throw new IllegalArgumentException();
+                throw new IllegalArgumentException(file.getPath() + " is not a child of the root directory.");
             }
 
             fileList.add(file);
diff --git a/wtk/src/org/apache/pivot/wtk/FillPane.java b/wtk/src/org/apache/pivot/wtk/FillPane.java
index 96697d5..21a4877 100644
--- a/wtk/src/org/apache/pivot/wtk/FillPane.java
+++ b/wtk/src/org/apache/pivot/wtk/FillPane.java
@@ -17,6 +17,7 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Container that fills the space it has been given inside its parent and then
@@ -67,9 +68,7 @@
         FillPaneListener {
         @Override
         public void orientationChanged(FillPane fillPane) {
-            for (FillPaneListener listener : this) {
-                listener.orientationChanged(fillPane);
-            }
+            forEach(listener -> listener.orientationChanged(fillPane));
         }
     }
 
@@ -91,9 +90,7 @@
     }
 
     public void setOrientation(Orientation orientation) {
-        if (orientation == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(orientation, "orientation");
 
         if (this.orientation != orientation) {
             this.orientation = orientation;
diff --git a/wtk/src/org/apache/pivot/wtk/Form.java b/wtk/src/org/apache/pivot/wtk/Form.java
index d93e6a9..7e2bff4 100644
--- a/wtk/src/org/apache/pivot/wtk/Form.java
+++ b/wtk/src/org/apache/pivot/wtk/Form.java
@@ -27,6 +27,7 @@
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.util.ImmutableIterator;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * A container that arranges field components in a form layout. Each field has
@@ -74,9 +75,7 @@
 
         @Override
         public void insert(Component field, int index) {
-            if (field == null) {
-                throw new IllegalArgumentException();
-            }
+            Utils.checkNull(field, "field");
 
             if (field.getParent() != null) {
                 throw new IllegalArgumentException("Field already has a parent.");
@@ -165,7 +164,7 @@
         @Override
         public void insert(Section section, int index) {
             if (section.form != null) {
-                throw new IllegalArgumentException("section already has a form.");
+                throw new IllegalArgumentException("Section already has a Form.");
             }
 
             sections.insert(section, index);
@@ -274,9 +273,7 @@
          * <tt>null</tt> for no message.
          */
         public Flag(MessageType messageType, String message) {
-            if (messageType == null) {
-                throw new IllegalArgumentException("messageType is null.");
-            }
+            Utils.checkNull(messageType, "messageType");
 
             this.messageType = messageType;
             this.message = message;
@@ -298,9 +295,7 @@
          * @throws IllegalArgumentException if the message type is {@code null}.
          */
         public void setMessageType(MessageType messageType) {
-            if (messageType == null) {
-                throw new IllegalArgumentException();
-            }
+            Utils.checkNull(messageType, "messageType");
 
             this.messageType = messageType;
         }
@@ -326,6 +321,8 @@
         }
 
         public static Flag decode(String flag) {
+            Utils.checkNullOrEmpty(flag, "flag");
+
             Dictionary<String, ?> map;
             try {
                 map = JSONSerializer.parseMap(flag);
@@ -333,13 +330,13 @@
                 throw new IllegalArgumentException(exception);
             }
 
-            String messageType = (String) map.get(MESSAGE_TYPE_KEY);
+            String messageType = map.getString(MESSAGE_TYPE_KEY);
             if (messageType == null) {
                 throw new IllegalArgumentException(MESSAGE_TYPE_KEY + " is required.");
             }
 
-            Flag value = new Flag(MessageType.valueOf(messageType.toUpperCase(Locale.ENGLISH)),
-                (String) map.get(MESSAGE_KEY));
+            Flag value = new Flag(MessageType.fromString(messageType),
+                map.getString(MESSAGE_KEY));
 
             return value;
         }
@@ -353,37 +350,27 @@
         FormListener {
         @Override
         public void sectionInserted(Form form, int index) {
-            for (FormListener listener : this) {
-                listener.sectionInserted(form, index);
-            }
+            forEach(listener -> listener.sectionInserted(form, index));
         }
 
         @Override
         public void sectionsRemoved(Form form, int index, Sequence<Section> removed) {
-            for (FormListener listener : this) {
-                listener.sectionsRemoved(form, index, removed);
-            }
+            forEach(listener -> listener.sectionsRemoved(form, index, removed));
         }
 
         @Override
         public void sectionHeadingChanged(Form.Section section) {
-            for (FormListener listener : this) {
-                listener.sectionHeadingChanged(section);
-            }
+            forEach(listener -> listener.sectionHeadingChanged(section));
         }
 
         @Override
         public void fieldInserted(Section section, int index) {
-            for (FormListener listener : this) {
-                listener.fieldInserted(section, index);
-            }
+            forEach(listener -> listener.fieldInserted(section, index));
         }
 
         @Override
         public void fieldsRemoved(Section section, int index, Sequence<Component> fields) {
-            for (FormListener listener : this) {
-                listener.fieldsRemoved(section, index, fields);
-            }
+            forEach(listener -> listener.fieldsRemoved(section, index, fields));
         }
     }
 
@@ -391,23 +378,17 @@
         implements FormAttributeListener {
         @Override
         public void labelChanged(Form form, Component component, String previousLabel) {
-            for (FormAttributeListener listener : this) {
-                listener.labelChanged(form, component, previousLabel);
-            }
+            forEach(listener -> listener.labelChanged(form, component, previousLabel));
         }
 
         @Override
         public void requiredChanged(Form form, Component field) {
-            for (FormAttributeListener listener : this) {
-                listener.requiredChanged(form, field);
-            }
+            forEach(listener -> listener.requiredChanged(form, field));
         }
 
         @Override
         public void flagChanged(Form form, Component component, Form.Flag previousFlag) {
-            for (FormAttributeListener listener : this) {
-                listener.flagChanged(form, component, previousFlag);
-            }
+            forEach(listener -> listener.flagChanged(form, component, previousFlag));
         }
     }
 
@@ -615,10 +596,6 @@
     }
 
     public static final void setFlag(Component component, String flag) {
-        if (flag == null) {
-            throw new IllegalArgumentException("flag is null.");
-        }
-
         setFlag(component, Flag.decode(flag));
     }
 
diff --git a/wtk/src/org/apache/pivot/wtk/GridPane.java b/wtk/src/org/apache/pivot/wtk/GridPane.java
index 57539ba..299439f 100644
--- a/wtk/src/org/apache/pivot/wtk/GridPane.java
+++ b/wtk/src/org/apache/pivot/wtk/GridPane.java
@@ -273,44 +273,32 @@
         GridPaneListener {
         @Override
         public void columnCountChanged(GridPane gridPane, int previousColumnCount) {
-            for (GridPaneListener listener : this) {
-                listener.columnCountChanged(gridPane, previousColumnCount);
-            }
+            forEach(listener -> listener.columnCountChanged(gridPane, previousColumnCount));
         }
 
         @Override
         public void rowInserted(GridPane gridPane, int index) {
-            for (GridPaneListener listener : this) {
-                listener.rowInserted(gridPane, index);
-            }
+            forEach(listener -> listener.rowInserted(gridPane, index));
         }
 
         @Override
         public void rowsRemoved(GridPane gridPane, int index, Sequence<GridPane.Row> rows) {
-            for (GridPaneListener listener : this) {
-                listener.rowsRemoved(gridPane, index, rows);
-            }
+            forEach(listener -> listener.rowsRemoved(gridPane, index, rows));
         }
 
         @Override
         public void cellInserted(GridPane.Row row, int column) {
-            for (GridPaneListener listener : this) {
-                listener.cellInserted(row, column);
-            }
+            forEach(listener -> listener.cellInserted(row, column));
         }
 
         @Override
         public void cellsRemoved(GridPane.Row row, int column, Sequence<Component> removed) {
-            for (GridPaneListener listener : this) {
-                listener.cellsRemoved(row, column, removed);
-            }
+            forEach(listener -> listener.cellsRemoved(row, column, removed));
         }
 
         @Override
         public void cellUpdated(GridPane.Row row, int column, Component previousComponent) {
-            for (GridPaneListener listener : this) {
-                listener.cellUpdated(row, column, previousComponent);
-            }
+            forEach(listener -> listener.cellUpdated(row, column, previousComponent));
         }
     }
 
@@ -334,9 +322,7 @@
      * @param columnCount Number of columns for this grid.
      */
     public GridPane(int columnCount) {
-        if (columnCount < 0) {
-            throw new IllegalArgumentException("columnCount is negative.");
-        }
+        Utils.checkNonNegative(columnCount, "columnCount");
 
         setColumnCount(columnCount);
 
@@ -345,10 +331,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof GridPane.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + GridPane.Skin.class.getName());
-        }
+        checkSkin(skin, GridPane.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/Label.java b/wtk/src/org/apache/pivot/wtk/Label.java
index 396ac9a..d4ef6a1 100644
--- a/wtk/src/org/apache/pivot/wtk/Label.java
+++ b/wtk/src/org/apache/pivot/wtk/Label.java
@@ -52,16 +52,12 @@
         LabelListener {
         @Override
         public void textChanged(Label label, String previousText) {
-            for (LabelListener listener : this) {
-                listener.textChanged(label, previousText);
-            }
+            forEach(listener -> listener.textChanged(label, previousText));
         }
 
         @Override
         public void maximumLengthChanged(Label label, int previousMaximumLength) {
-            for (LabelListener listener : this) {
-                listener.maximumLengthChanged(label, previousMaximumLength);
-            }
+            forEach(listener -> listener.maximumLengthChanged(label, previousMaximumLength));
         }
 
     }
@@ -70,24 +66,18 @@
         implements LabelBindingListener {
         @Override
         public void textKeyChanged(Label label, String previousTextKey) {
-            for (LabelBindingListener listener : this) {
-                listener.textKeyChanged(label, previousTextKey);
-            }
+            forEach(listener -> listener.textKeyChanged(label, previousTextKey));
         }
 
         @Override
         public void textBindTypeChanged(Label label, BindType previousTextBindType) {
-            for (LabelBindingListener listener : this) {
-                listener.textBindTypeChanged(label, previousTextBindType);
-            }
+            forEach(listener -> listener.textBindTypeChanged(label, previousTextBindType));
         }
 
         @Override
         public void textBindMappingChanged(Label label,
             Label.TextBindMapping previousTextBindMapping) {
-            for (LabelBindingListener listener : this) {
-                listener.textBindMappingChanged(label, previousTextBindMapping);
-            }
+            forEach(listener -> listener.textBindMappingChanged(label, previousTextBindMapping));
         }
     }
 
@@ -174,9 +164,7 @@
      * @throws IllegalArgumentException if the length given is negative.
      */
     public void setMaximumLength(int maximumLength) {
-        if (maximumLength < 0) {
-            throw new IllegalArgumentException("maximumLength is negative.");
-        }
+        Utils.checkNonNegative(maximumLength, "maximumLength");
 
         int previousMaximumLength = this.maximumLength;
         if (previousMaximumLength != maximumLength) {
@@ -245,7 +233,7 @@
                 value = textBindMapping.toString(value);
             }
 
-            setText(value != null ? (String) value : "");
+            setTextOrEmpty((String)value);
         }
     }
 
diff --git a/wtk/src/org/apache/pivot/wtk/ListButton.java b/wtk/src/org/apache/pivot/wtk/ListButton.java
index 24b569e..81836e1 100644
--- a/wtk/src/org/apache/pivot/wtk/ListButton.java
+++ b/wtk/src/org/apache/pivot/wtk/ListButton.java
@@ -45,39 +45,29 @@
         implements ListButtonListener {
         @Override
         public void listDataChanged(ListButton listButton, List<?> previousListData) {
-            for (ListButtonListener listener : this) {
-                listener.listDataChanged(listButton, previousListData);
-            }
+            forEach(listener -> listener.listDataChanged(listButton, previousListData));
         }
 
         @Override
         public void itemRendererChanged(ListButton listButton,
             ListView.ItemRenderer previousItemRenderer) {
-            for (ListButtonListener listener : this) {
-                listener.itemRendererChanged(listButton, previousItemRenderer);
-            }
+            forEach(listener -> listener.itemRendererChanged(listButton, previousItemRenderer));
         }
 
         @Override
         public void repeatableChanged(ListButton listButton) {
-            for (ListButtonListener listener : this) {
-                listener.repeatableChanged(listButton);
-            }
+            forEach(listener -> listener.repeatableChanged(listButton));
         }
 
         @Override
         public void disabledItemFilterChanged(ListButton listButton,
             Filter<?> previousDisabledItemFilter) {
-            for (ListButtonListener listener : this) {
-                listener.disabledItemFilterChanged(listButton, previousDisabledItemFilter);
-            }
+            forEach(listener -> listener.disabledItemFilterChanged(listButton, previousDisabledItemFilter));
         }
 
         @Override
         public void listSizeChanged(ListButton listButton, int previousListSize) {
-            for (ListButtonListener listener : this) {
-                listener.listSizeChanged(listButton, previousListSize);
-            }
+            forEach(listener -> listener.listSizeChanged(listButton, previousListSize));
         }
     }
 
@@ -85,37 +75,27 @@
         implements ListButtonItemListener {
         @Override
         public void itemInserted(ListButton listButton, int index) {
-            for (ListButtonItemListener listener : this) {
-                listener.itemInserted(listButton, index);
-            }
+            forEach(listener -> listener.itemInserted(listButton, index));
         }
 
         @Override
         public void itemsRemoved(ListButton listButton, int index, int count) {
-            for (ListButtonItemListener listener : this) {
-                listener.itemsRemoved(listButton, index, count);
-            }
+            forEach(listener -> listener.itemsRemoved(listButton, index, count));
         }
 
         @Override
         public void itemUpdated(ListButton listButton, int index) {
-            for (ListButtonItemListener listener : this) {
-                listener.itemUpdated(listButton, index);
-            }
+            forEach(listener -> listener.itemUpdated(listButton, index));
         }
 
         @Override
         public void itemsCleared(ListButton listButton) {
-            for (ListButtonItemListener listener : this) {
-                listener.itemsCleared(listButton);
-            }
+            forEach(listener -> listener.itemsCleared(listButton));
         }
 
         @Override
         public void itemsSorted(ListButton listButton) {
-            for (ListButtonItemListener listener : this) {
-                listener.itemsSorted(listButton);
-            }
+            forEach(listener -> listener.itemsSorted(listButton));
         }
     }
 
@@ -123,16 +103,12 @@
         ListenerList<ListButtonSelectionListener> implements ListButtonSelectionListener {
         @Override
         public void selectedIndexChanged(ListButton listButton, int previousSelectedIndex) {
-            for (ListButtonSelectionListener listener : this) {
-                listener.selectedIndexChanged(listButton, previousSelectedIndex);
-            }
+            forEach(listener -> listener.selectedIndexChanged(listButton, previousSelectedIndex));
         }
 
         @Override
         public void selectedItemChanged(ListButton listButton, Object previousSelectedItem) {
-            for (ListButtonSelectionListener listener : this) {
-                listener.selectedItemChanged(listButton, previousSelectedItem);
-            }
+            forEach(listener -> listener.selectedItemChanged(listButton, previousSelectedItem));
         }
     }
 
@@ -140,47 +116,35 @@
         ListenerList<ListButtonBindingListener> implements ListButtonBindingListener {
         @Override
         public void listDataKeyChanged(ListButton listButton, String previousListDataKey) {
-            for (ListButtonBindingListener listener : this) {
-                listener.listDataKeyChanged(listButton, previousListDataKey);
-            }
+            forEach(listener -> listener.listDataKeyChanged(listButton, previousListDataKey));
         }
 
         @Override
         public void listDataBindTypeChanged(ListButton listButton, BindType previousListDataBindType) {
-            for (ListButtonBindingListener listener : this) {
-                listener.listDataBindTypeChanged(listButton, previousListDataBindType);
-            }
+            forEach(listener -> listener.listDataBindTypeChanged(listButton, previousListDataBindType));
         }
 
         @Override
         public void listDataBindMappingChanged(ListButton listButton,
             ListView.ListDataBindMapping previousListDataBindMapping) {
-            for (ListButtonBindingListener listener : this) {
-                listener.listDataBindMappingChanged(listButton, previousListDataBindMapping);
-            }
+            forEach(listener -> listener.listDataBindMappingChanged(listButton, previousListDataBindMapping));
         }
 
         @Override
         public void selectedItemKeyChanged(ListButton listButton, String previousSelectedItemKey) {
-            for (ListButtonBindingListener listener : this) {
-                listener.selectedItemKeyChanged(listButton, previousSelectedItemKey);
-            }
+            forEach(listener -> listener.selectedItemKeyChanged(listButton, previousSelectedItemKey));
         }
 
         @Override
         public void selectedItemBindTypeChanged(ListButton listButton,
             BindType previousSelectedItemBindType) {
-            for (ListButtonBindingListener listener : this) {
-                listener.selectedItemBindTypeChanged(listButton, previousSelectedItemBindType);
-            }
+            forEach(listener -> listener.selectedItemBindTypeChanged(listButton, previousSelectedItemBindType));
         }
 
         @Override
         public void selectedItemBindMappingChanged(ListButton listButton,
             ListView.ItemBindMapping previousSelectedItemBindMapping) {
-            for (ListButtonBindingListener listener : this) {
-                listener.selectedItemBindMappingChanged(listButton, previousSelectedItemBindMapping);
-            }
+            forEach(listener -> listener.selectedItemBindMappingChanged(listButton, previousSelectedItemBindMapping));
         }
     }
 
@@ -340,10 +304,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof ListButton.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + ListButton.Skin.class.getName());
-        }
+        checkSkin(skin, ListButton.Skin.class);
 
         super.setSkin(skin);
     }
@@ -440,9 +401,7 @@
 
         try {
             setListData((List<?>) jsonSerializer.readObject(listData.openStream()));
-        } catch (SerializationException exception) {
-            throw new IllegalArgumentException(exception);
-        } catch (IOException exception) {
+        } catch (SerializationException | IOException exception) {
             throw new IllegalArgumentException(exception);
         }
     }
@@ -633,9 +592,7 @@
     }
 
     public void setListDataBindType(BindType listDataBindType) {
-        if (listDataBindType == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(listDataBindType, "listDataBindType");
 
         BindType previousListDataBindType = this.listDataBindType;
 
@@ -676,9 +633,7 @@
     }
 
     public void setSelectedItemBindType(BindType selectedItemBindType) {
-        if (selectedItemBindType == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(selectedItemBindType, "selectedItemBindType");
 
         BindType previousSelectedItemBindType = this.selectedItemBindType;
         if (previousSelectedItemBindType != selectedItemBindType) {
diff --git a/wtk/src/org/apache/pivot/wtk/ListView.java b/wtk/src/org/apache/pivot/wtk/ListView.java
index 0ab24d6..5f12698 100644
--- a/wtk/src/org/apache/pivot/wtk/ListView.java
+++ b/wtk/src/org/apache/pivot/wtk/ListView.java
@@ -728,10 +728,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof ListView.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + ListView.Skin.class.getName());
-        }
+        checkSkin(skin, ListView.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/LocalManifest.java b/wtk/src/org/apache/pivot/wtk/LocalManifest.java
index 5544165..5b1de38 100644
--- a/wtk/src/org/apache/pivot/wtk/LocalManifest.java
+++ b/wtk/src/org/apache/pivot/wtk/LocalManifest.java
@@ -24,6 +24,7 @@
 import org.apache.pivot.collections.ArrayList;
 import org.apache.pivot.collections.HashMap;
 import org.apache.pivot.io.FileList;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.wtk.media.Image;
 import org.apache.pivot.wtk.media.Picture;
 
@@ -43,9 +44,7 @@
     }
 
     public void putText(String textArgument) {
-        if (textArgument == null) {
-            throw new IllegalArgumentException("text is null.");
-        }
+        Utils.checkNull(textArgument, "text");
 
         this.text = textArgument;
     }
@@ -61,9 +60,7 @@
     }
 
     public void putImage(Image imageArgument) {
-        if (imageArgument == null) {
-            throw new IllegalArgumentException("image is null.");
-        }
+        Utils.checkNull(imageArgument, "image");
 
         this.image = imageArgument;
     }
@@ -79,9 +76,7 @@
     }
 
     public void putFileList(FileList fileListArgument) {
-        if (fileListArgument == null) {
-            throw new IllegalArgumentException("fileList is null.");
-        }
+        Utils.checkNull(fileListArgument, "fileList");
 
         this.fileList = fileListArgument;
     }
diff --git a/wtk/src/org/apache/pivot/wtk/MenuButton.java b/wtk/src/org/apache/pivot/wtk/MenuButton.java
index 9c59c59..716b19a 100644
--- a/wtk/src/org/apache/pivot/wtk/MenuButton.java
+++ b/wtk/src/org/apache/pivot/wtk/MenuButton.java
@@ -63,10 +63,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof MenuButton.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + MenuButton.Skin.class.getName());
-        }
+        checkSkin(skin, MenuButton.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/Meter.java b/wtk/src/org/apache/pivot/wtk/Meter.java
index acb200d..1610cb7 100644
--- a/wtk/src/org/apache/pivot/wtk/Meter.java
+++ b/wtk/src/org/apache/pivot/wtk/Meter.java
@@ -17,6 +17,7 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Component that displays progress information.
@@ -26,23 +27,17 @@
         MeterListener {
         @Override
         public void orientationChanged(Meter meter) {
-            for (MeterListener listener : this) {
-                listener.orientationChanged(meter);
-            }
+            forEach(listener -> listener.orientationChanged(meter));
         }
 
         @Override
         public void percentageChanged(Meter meter, double oldPercentage) {
-            for (MeterListener listener : this) {
-                listener.percentageChanged(meter, oldPercentage);
-            }
+            forEach(listener -> listener.percentageChanged(meter, oldPercentage));
         }
 
         @Override
         public void textChanged(Meter meter, String oldText) {
-            for (MeterListener listener : this) {
-                listener.textChanged(meter, oldText);
-            }
+            forEach(listener -> listener.textChanged(meter, oldText));
         }
     }
 
@@ -92,9 +87,7 @@
     }
 
     public void setOrientation(Orientation orientation) {
-        if (orientation == null) {
-            throw new IllegalArgumentException("orientation is null.");
-        }
+        Utils.checkNull(orientation, "orientation");
 
         if (this.orientation != orientation) {
             this.orientation = orientation;
diff --git a/wtk/src/org/apache/pivot/wtk/Mouse.java b/wtk/src/org/apache/pivot/wtk/Mouse.java
index cde6709..77b28c7 100644
--- a/wtk/src/org/apache/pivot/wtk/Mouse.java
+++ b/wtk/src/org/apache/pivot/wtk/Mouse.java
@@ -18,6 +18,8 @@
 
 import java.awt.MouseInfo;
 
+import org.apache.pivot.util.Utils;
+
 /**
  * Class representing the system mouse.
  */
@@ -80,9 +82,7 @@
      * The mouse pointer must currently be over the component.
      */
     public static void capture(Component capturerArgument) {
-        if (capturerArgument == null) {
-            throw new IllegalArgumentException("capturer is null.");
-        }
+        Utils.checkNull(capturerArgument, "capturer");
 
         if (!capturerArgument.isMouseOver()) {
             throw new IllegalArgumentException("Mouse pointer is not currently over capturer.");
@@ -228,7 +228,7 @@
             }
 
             default: {
-                throw new IllegalArgumentException();
+                throw new IllegalArgumentException("Unknown mouse cursor type " + cursorID);
             }
         }
 
@@ -243,9 +243,7 @@
      * @throws IllegalStateException If the mouse is not currently captured.
      */
     public static void setCursor(Cursor cursor) {
-        if (cursor == null) {
-            throw new IllegalArgumentException("cursor is null.");
-        }
+        Utils.checkNull(cursor, "cursor");
 
         if (capturer == null) {
             throw new IllegalStateException("Mouse is not currently captured.");
@@ -264,12 +262,10 @@
      * if the component is not currently visible.
      */
     public static void setCursor(final Component component) {
-        if (component == null) {
-            throw new IllegalArgumentException("component is null.");
-        }
+        Utils.checkNull(component, "component");
 
         if (!component.isVisible()) {
-            throw new IllegalArgumentException("component is not visible.");
+            throw new IllegalArgumentException("Component for mouse cursor is not visible.");
         }
 
         Component componentOrParent = component;
@@ -369,7 +365,7 @@
             }
 
             default: {
-                throw new IllegalArgumentException();
+                throw new IllegalArgumentException("Unknown mouse cursor type " + cursor.toString());
             }
         }
 
diff --git a/wtk/src/org/apache/pivot/wtk/Prompt.java b/wtk/src/org/apache/pivot/wtk/Prompt.java
index bad04ee..018b28c 100644
--- a/wtk/src/org/apache/pivot/wtk/Prompt.java
+++ b/wtk/src/org/apache/pivot/wtk/Prompt.java
@@ -26,6 +26,7 @@
 import org.apache.pivot.util.ImmutableIterator;
 import org.apache.pivot.util.ListenerList;
 import org.apache.pivot.util.Resources;
+import org.apache.pivot.util.Utils;
 
 /**
  * Class representing a "prompt", a sheet commonly used to facilitate simple
@@ -50,9 +51,7 @@
 
         @Override
         public void insert(Object option, int index) {
-            if (option == null) {
-                throw new IllegalArgumentException("option is null.");
-            }
+            Utils.checkNull(option, "option");
 
             options.insert(option, index);
 
@@ -122,44 +121,32 @@
         PromptListener {
         @Override
         public void messageTypeChanged(Prompt prompt, MessageType previousMessageType) {
-            for (PromptListener listener : this) {
-                listener.messageTypeChanged(prompt, previousMessageType);
-            }
+            forEach(listener -> listener.messageTypeChanged(prompt, previousMessageType));
         }
 
         @Override
         public void messageChanged(Prompt prompt, String previousMessage) {
-            for (PromptListener listener : this) {
-                listener.messageChanged(prompt, previousMessage);
-            }
+            forEach(listener -> listener.messageChanged(prompt, previousMessage));
         }
 
         @Override
         public void bodyChanged(Prompt prompt, Component previousBody) {
-            for (PromptListener listener : this) {
-                listener.bodyChanged(prompt, previousBody);
-            }
+            forEach(listener -> listener.bodyChanged(prompt, previousBody));
         }
 
         @Override
         public void optionInserted(Prompt prompt, int index) {
-            for (PromptListener listener : this) {
-                listener.optionInserted(prompt, index);
-            }
+            forEach(listener -> listener.optionInserted(prompt, index));
         }
 
         @Override
         public void optionsRemoved(Prompt prompt, int index, Sequence<?> removed) {
-            for (PromptListener listener : this) {
-                listener.optionsRemoved(prompt, index, removed);
-            }
+            forEach(listener -> listener.optionsRemoved(prompt, index, removed));
         }
 
         @Override
         public void selectedOptionChanged(Prompt prompt, int previousSelectedOption) {
-            for (PromptListener listener : this) {
-                listener.selectedOptionChanged(prompt, previousSelectedOption);
-            }
+            forEach(listener -> listener.selectedOptionChanged(prompt, previousSelectedOption));
         }
     }
 
@@ -209,9 +196,7 @@
     }
 
     public void setMessageType(MessageType messageType) {
-        if (messageType == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(messageType, "messageType");
 
         MessageType previousMessageType = this.messageType;
         if (previousMessageType != messageType) {
diff --git a/wtk/src/org/apache/pivot/wtk/RadioButtonGroup.java b/wtk/src/org/apache/pivot/wtk/RadioButtonGroup.java
index 0418ffc..050bb81 100644
--- a/wtk/src/org/apache/pivot/wtk/RadioButtonGroup.java
+++ b/wtk/src/org/apache/pivot/wtk/RadioButtonGroup.java
@@ -24,6 +24,7 @@
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ImmutableIterator;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.wtk.Keyboard.KeyCode;
 import org.apache.pivot.wtk.Keyboard.KeyLocation;
 import org.apache.pivot.wtk.Keyboard.Modifier;
@@ -297,9 +298,8 @@
      */
     @Override
     public boolean add(Button button) {
-        if (button == null) {
-            throw new IllegalArgumentException("Button cannot be null");
-        }
+        Utils.checkNull(button, "button");
+
         boolean result = super.add(button);
         if (result) {
             buttonOrder.add(button);
@@ -347,9 +347,8 @@
      * @throws IllegalArgumentException if the button parameter is {@code null}.
      */
     public void insert(Button button, int index) {
-        if (button == null) {
-            throw new IllegalArgumentException("Button cannot be null");
-        }
+        Utils.checkNull(button, "button");
+
         boolean result = super.add(button);
         if (result) {
             buttonOrder.insert(button, index);
diff --git a/wtk/src/org/apache/pivot/wtk/ScrollBar.java b/wtk/src/org/apache/pivot/wtk/ScrollBar.java
index 842c247..4b84ed1 100644
--- a/wtk/src/org/apache/pivot/wtk/ScrollBar.java
+++ b/wtk/src/org/apache/pivot/wtk/ScrollBar.java
@@ -17,9 +17,11 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.collections.Dictionary;
+import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.json.JSONSerializer;
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Component that allows a user to select one of a range of values. Most often
@@ -45,9 +47,7 @@
         }
 
         public Scope(Dictionary<String, ?> scope) {
-            if (scope == null) {
-                throw new IllegalArgumentException("scope is null.");
-            }
+            Utils.checkNull(scope, "scope");
 
             if (!scope.containsKey(START_KEY)) {
                 throw new IllegalArgumentException(START_KEY + " is required.");
@@ -61,9 +61,17 @@
                 throw new IllegalArgumentException(EXTENT_KEY + " is required.");
             }
 
-            start = ((Integer) scope.get(START_KEY)).intValue();
-            end = ((Integer) scope.get(END_KEY)).intValue();
-            extent = ((Integer) scope.get(EXTENT_KEY)).intValue();
+            start = scope.getInt(START_KEY);
+            end = scope.getInt(END_KEY);
+            extent = scope.getInt(EXTENT_KEY);
+        }
+
+        public Scope(Sequence<?> scope) {
+            Utils.checkNull(scope, "scope");
+
+            start = ((Number)scope.get(0)).intValue();
+            end = ((Number)scope.get(1)).intValue();
+            extent = ((Number)scope.get(2)).intValue();
         }
 
         @Override
@@ -72,15 +80,32 @@
         }
 
         public static Scope decode(String value) {
-            if (value == null) {
-                throw new IllegalArgumentException();
-            }
+            Utils.checkNullOrEmpty(value, "scope");
 
             Scope scope;
-            try {
-                scope = new Scope(JSONSerializer.parseMap(value));
-            } catch (SerializationException exception) {
-                throw new IllegalArgumentException(exception);
+            if (value.startsWith("{")) {
+                try {
+                    scope = new Scope(JSONSerializer.parseMap(value));
+                } catch (SerializationException exception) {
+                    throw new IllegalArgumentException(exception);
+                }
+            } else if (value.startsWith("[")) {
+                try {
+                    scope = new Scope(JSONSerializer.parseList(value));
+                } catch (SerializationException exception) {
+                    throw new IllegalArgumentException(exception);
+                }
+            } else {
+                String[] parts = value.split("\\s*[,;]\\s*");
+                if (parts.length != 3) {
+                    throw new IllegalArgumentException("Invalid format for ScrollBar.Scope: " + value);
+                }
+                try {
+                    scope = new Scope(
+                        Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Integer.parseInt(parts[2]));
+                } catch (NumberFormatException ex) {
+                    throw new IllegalArgumentException(ex);
+                }
             }
 
             return scope;
@@ -91,31 +116,23 @@
         ScrollBarListener {
         @Override
         public void orientationChanged(ScrollBar scrollBar, Orientation previousOrientation) {
-            for (ScrollBarListener listener : this) {
-                listener.orientationChanged(scrollBar, previousOrientation);
-            }
+            forEach(listener -> listener.orientationChanged(scrollBar, previousOrientation));
         }
 
         @Override
         public void scopeChanged(ScrollBar scrollBar, int previousStart, int previousEnd,
             int previousExtent) {
-            for (ScrollBarListener listener : this) {
-                listener.scopeChanged(scrollBar, previousStart, previousEnd, previousExtent);
-            }
+            forEach(listener -> listener.scopeChanged(scrollBar, previousStart, previousEnd, previousExtent));
         }
 
         @Override
         public void unitIncrementChanged(ScrollBar scrollBar, int previousUnitIncrement) {
-            for (ScrollBarListener listener : this) {
-                listener.unitIncrementChanged(scrollBar, previousUnitIncrement);
-            }
+            forEach(listener -> listener.unitIncrementChanged(scrollBar, previousUnitIncrement));
         }
 
         @Override
         public void blockIncrementChanged(ScrollBar scrollBar, int previousBlockIncrement) {
-            for (ScrollBarListener listener : this) {
-                listener.blockIncrementChanged(scrollBar, previousBlockIncrement);
-            }
+            forEach(listener -> listener.blockIncrementChanged(scrollBar, previousBlockIncrement));
         }
     }
 
@@ -123,9 +140,7 @@
         implements ScrollBarValueListener {
         @Override
         public void valueChanged(ScrollBar scrollBar, int previousValue) {
-            for (ScrollBarValueListener listener : this) {
-                listener.valueChanged(scrollBar, previousValue);
-            }
+            forEach(listener -> listener.valueChanged(scrollBar, previousValue));
         }
     }
 
@@ -145,9 +160,7 @@
     }
 
     public ScrollBar(Orientation orientation) {
-        if (orientation == null) {
-            throw new IllegalArgumentException("orientation is null");
-        }
+        Utils.checkNull(orientation, "orientation");
 
         this.orientation = orientation;
 
@@ -159,9 +172,7 @@
     }
 
     public void setOrientation(Orientation orientation) {
-        if (orientation == null) {
-            throw new IllegalArgumentException("orientation is null");
-        }
+        Utils.checkNull(orientation, "orientation");
 
         Orientation previousOrientation = this.orientation;
 
@@ -196,26 +207,16 @@
     }
 
     public final void setRange(Span range) {
-        if (range == null) {
-            throw new IllegalArgumentException("range is null.");
-        }
+        Utils.checkNull(range, "range");
 
         setRange(range.start, range.end);
     }
 
     public final void setRange(Dictionary<String, ?> range) {
-        if (range == null) {
-            throw new IllegalArgumentException("range is null.");
-        }
-
         setRange(new Span(range));
     }
 
     public final void setRange(String range) {
-        if (range == null) {
-            throw new IllegalArgumentException("range is null.");
-        }
-
         setRange(Span.decode(range));
     }
 
@@ -238,20 +239,15 @@
 
         if (start != previousStart || end != previousEnd || extent != previousExtent) {
             if (start > value) {
-                throw new IllegalArgumentException(String.format(
-                    "start (%d) is greater than value (%d)",
-                    Integer.valueOf(start), Integer.valueOf(value)));
+                throw new IllegalArgumentException(
+                    "start (" + start + ") is greater than value (" + value + ")");
             }
 
-            if (extent < 0) {
-                throw new IllegalArgumentException(String.format("extent (%d) is negative",
-                    Integer.valueOf(extent)));
-            }
+            Utils.checkNonNegative(extent, "extent");
 
             if (end < value + extent) {
-                throw new IllegalArgumentException(String.format(
-                    "end (%d) is less than value (%d) + extent (%d)",
-                    Integer.valueOf(end), Integer.valueOf(value), Integer.valueOf(extent)));
+                throw new IllegalArgumentException(
+                    "end (" + end + ") is less than value ("+ value + ") + extent (" + extent + ")");
             }
 
             this.start = start;
@@ -263,26 +259,20 @@
     }
 
     public final void setScope(Scope scope) {
-        if (scope == null) {
-            throw new IllegalArgumentException("scope is null.");
-        }
+        Utils.checkNull(scope, "scope");
 
         setScope(scope.start, scope.end, scope.extent);
     }
 
     public final void setScope(Dictionary<String, ?> scope) {
-        if (scope == null) {
-            throw new IllegalArgumentException("scope is null.");
-        }
+        setScope(new Scope(scope));
+    }
 
+    public final void setScope(Sequence<?> scope) {
         setScope(new Scope(scope));
     }
 
     public final void setScope(String scope) {
-        if (scope == null) {
-            throw new IllegalArgumentException("scope is null.");
-        }
-
         setScope(Scope.decode(scope));
     }
 
@@ -295,15 +285,13 @@
 
         if (value != previousValue) {
             if (value < start) {
-                throw new IllegalArgumentException(String.format(
-                    "value (%d) is less than start (%d)",
-                    Integer.valueOf(value), Integer.valueOf(start)));
+                throw new IllegalArgumentException(
+                    "value (" + value + ") is less than start (" + start + ")");
             }
 
             if (value + extent > end) {
-                throw new IllegalArgumentException(String.format(
-                    "value (%d) + extent (%d) is greater than end (%d)",
-                    Integer.valueOf(value), Integer.valueOf(extent), Integer.valueOf(end)));
+                throw new IllegalArgumentException(
+                    "value (" + value + ") + extent (" + extent + ") is greater than end (" + end + ")");
             }
 
             this.value = value;
@@ -317,9 +305,7 @@
     }
 
     public void setUnitIncrement(int unitIncrement) {
-        if (unitIncrement < 0) {
-            throw new IllegalArgumentException("unitIncrement is negative");
-        }
+        Utils.checkNonNegative(unitIncrement, "unitIncrement");
 
         int previousUnitIncrement = this.unitIncrement;
 
@@ -334,9 +320,7 @@
     }
 
     public void setBlockIncrement(int blockIncrement) {
-        if (blockIncrement < 0) {
-            throw new IllegalArgumentException("blockIncrement is negative");
-        }
+        Utils.checkNonNegative(blockIncrement, "blockIncrement");
 
         int previousBlockIncrement = this.blockIncrement;
 
diff --git a/wtk/src/org/apache/pivot/wtk/Sheet.java b/wtk/src/org/apache/pivot/wtk/Sheet.java
index c176088..b20b766 100644
--- a/wtk/src/org/apache/pivot/wtk/Sheet.java
+++ b/wtk/src/org/apache/pivot/wtk/Sheet.java
@@ -17,7 +17,9 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.util.Vote;
+import org.apache.pivot.util.VoteResult;
 
 /**
  * Window class representing a "sheet". A sheet behaves like a dialog that is
@@ -28,33 +30,26 @@
         implements SheetStateListener {
         @Override
         public Vote previewSheetClose(Sheet sheet, boolean result) {
-            Vote vote = Vote.APPROVE;
+            VoteResult vote = new VoteResult(Vote.APPROVE);
 
-            for (SheetStateListener listener : this) {
-                vote = vote.tally(listener.previewSheetClose(sheet, result));
-            }
+            forEach(listener -> vote.tally(listener.previewSheetClose(sheet, result)));
 
-            return vote;
+            return vote.get();
         }
 
         @Override
         public void sheetCloseVetoed(Sheet sheet, Vote reason) {
-            for (SheetStateListener listener : this) {
-                listener.sheetCloseVetoed(sheet, reason);
-            }
+            forEach(listener -> listener.sheetCloseVetoed(sheet, reason));
         }
 
         @Override
         public void sheetClosed(Sheet sheet) {
-            for (SheetStateListener listener : this) {
-                listener.sheetClosed(sheet);
-            }
+            forEach(listener -> listener.sheetClosed(sheet));
         }
     }
 
     private SheetCloseListener sheetCloseListener = null;
     private boolean result = false;
-
     private boolean closing = false;
 
     private SheetStateListenerList sheetStateListeners = new SheetStateListenerList();
@@ -78,9 +73,7 @@
     }
 
     public final void open(Window owner, SheetCloseListener sheetCloseListenerArgument) {
-        if (owner == null) {
-            throw new IllegalArgumentException("owner is null");
-        }
+        Utils.checkNull(owner, "owner");
 
         open(owner.getDisplay(), owner, sheetCloseListenerArgument);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/Slider.java b/wtk/src/org/apache/pivot/wtk/Slider.java
index e11fefd..dd2e422 100644
--- a/wtk/src/org/apache/pivot/wtk/Slider.java
+++ b/wtk/src/org/apache/pivot/wtk/Slider.java
@@ -17,7 +17,9 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.collections.Dictionary;
+import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Allows a user to select one of a range of values.
@@ -27,16 +29,12 @@
         SliderListener {
         @Override
         public void orientationChanged(Slider slider) {
-            for (SliderListener listener : this) {
-                listener.orientationChanged(slider);
-            }
+            forEach(listener -> listener.orientationChanged(slider));
         }
 
         @Override
         public void rangeChanged(Slider slider, int previousStart, int previousEnd) {
-            for (SliderListener listener : this) {
-                listener.rangeChanged(slider, previousStart, previousEnd);
-            }
+            forEach(listener -> listener.rangeChanged(slider, previousStart, previousEnd));
         }
     }
 
@@ -44,9 +42,7 @@
         implements SliderValueListener {
         @Override
         public void valueChanged(Slider slider, int previousValue) {
-            for (SliderValueListener listener : this) {
-                listener.valueChanged(slider, previousValue);
-            }
+            forEach(listener -> listener.valueChanged(slider, previousValue));
         }
     }
 
@@ -90,8 +86,7 @@
 
     public void setRange(int start, int end) {
         if (start > end) {
-            throw new IllegalArgumentException("start " + start + " is greater than maximum " + end
-                + ".");
+            throw new IllegalArgumentException("start " + start + " is greater than maximum " + end + ".");
         }
 
         int previousStart = this.start;
@@ -118,26 +113,20 @@
     }
 
     public final void setRange(Span range) {
-        if (range == null) {
-            throw new IllegalArgumentException("range is null.");
-        }
+        Utils.checkNull(range, "range");
 
         setRange(range.start, range.end);
     }
 
     public final void setRange(Dictionary<String, ?> range) {
-        if (range == null) {
-            throw new IllegalArgumentException("range is null.");
-        }
+        setRange(new Span(range));
+    }
 
+    public final void setRange(Sequence<?> range) {
         setRange(new Span(range));
     }
 
     public final void setRange(String range) {
-        if (range == null) {
-            throw new IllegalArgumentException("range is null.");
-        }
-
         setRange(Span.decode(range));
     }
 
@@ -147,13 +136,11 @@
 
     public void setValue(int value) {
         if (value < start) {
-            throw new IllegalArgumentException("value " + value + " is less than minimum " + start
-                + ".");
+            throw new IllegalArgumentException("value " + value + " is less than minimum " + start + ".");
         }
 
         if (value > end) {
-            throw new IllegalArgumentException("value " + value + " is greater than maximum " + end
-                + ".");
+            throw new IllegalArgumentException("value " + value + " is greater than maximum " + end + ".");
         }
 
         int previousValue = this.value;
@@ -169,9 +156,7 @@
     }
 
     public void setOrientation(Orientation orientation) {
-        if (orientation == null) {
-            throw new IllegalArgumentException("orientation is null.");
-        }
+        Utils.checkNull(orientation, "orientation");
 
         if (this.orientation != orientation) {
             this.orientation = orientation;
diff --git a/wtk/src/org/apache/pivot/wtk/Span.java b/wtk/src/org/apache/pivot/wtk/Span.java
index bf35265..fe220b9 100644
--- a/wtk/src/org/apache/pivot/wtk/Span.java
+++ b/wtk/src/org/apache/pivot/wtk/Span.java
@@ -92,6 +92,14 @@
         end = span.getInt(END_KEY);
     }
 
+    /**
+     * Construct a new span from the given sequence with two
+     * numeric values corresponding to the start and end values
+     * respectively.
+     *
+     * @param span A sequence containing the start and end values.
+     * @throws IllegalArgumentException if the given span is {@code null}.
+     */
     public Span(Sequence<?> span) {
         Utils.checkNull(span, "span");
 
@@ -344,7 +352,7 @@
      * as a JSON list.
      */
     public static Span decode(String value) {
-        Utils.checkNull(value, "value");
+        Utils.checkNullOrEmpty(value, "value");
 
         Span span;
         if (value.startsWith("{")) {
diff --git a/wtk/src/org/apache/pivot/wtk/Spinner.java b/wtk/src/org/apache/pivot/wtk/Spinner.java
index 84770e8..71932f9 100644
--- a/wtk/src/org/apache/pivot/wtk/Spinner.java
+++ b/wtk/src/org/apache/pivot/wtk/Spinner.java
@@ -28,6 +28,7 @@
 import org.apache.pivot.json.JSONSerializer;
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 import org.apache.pivot.wtk.content.SpinnerItemRenderer;
 
 /**
@@ -123,23 +124,17 @@
         SpinnerListener {
         @Override
         public void spinnerDataChanged(Spinner spinner, List<?> previousSpinnerData) {
-            for (SpinnerListener listener : this) {
-                listener.spinnerDataChanged(spinner, previousSpinnerData);
-            }
+            forEach(listener -> listener.spinnerDataChanged(spinner, previousSpinnerData));
         }
 
         @Override
         public void itemRendererChanged(Spinner spinner, Spinner.ItemRenderer previousItemRenderer) {
-            for (SpinnerListener listener : this) {
-                listener.itemRendererChanged(spinner, previousItemRenderer);
-            }
+            forEach(listener -> listener.itemRendererChanged(spinner, previousItemRenderer));
         }
 
         @Override
         public void circularChanged(Spinner spinner) {
-            for (SpinnerListener listener : this) {
-                listener.circularChanged(spinner);
-            }
+            forEach(listener -> listener.circularChanged(spinner));
         }
     }
 
@@ -147,37 +142,27 @@
         implements SpinnerItemListener {
         @Override
         public void itemInserted(Spinner spinner, int index) {
-            for (SpinnerItemListener listener : this) {
-                listener.itemInserted(spinner, index);
-            }
+            forEach(listener -> listener.itemInserted(spinner, index));
         }
 
         @Override
         public void itemsRemoved(Spinner spinner, int index, int count) {
-            for (SpinnerItemListener listener : this) {
-                listener.itemsRemoved(spinner, index, count);
-            }
+            forEach(listener -> listener.itemsRemoved(spinner, index, count));
         }
 
         @Override
         public void itemUpdated(Spinner spinner, int index) {
-            for (SpinnerItemListener listener : this) {
-                listener.itemUpdated(spinner, index);
-            }
+            forEach(listener -> listener.itemUpdated(spinner, index));
         }
 
         @Override
         public void itemsCleared(Spinner spinner) {
-            for (SpinnerItemListener listener : this) {
-                listener.itemsCleared(spinner);
-            }
+            forEach(listener -> listener.itemsCleared(spinner));
         }
 
         @Override
         public void itemsSorted(Spinner spinner) {
-            for (SpinnerItemListener listener : this) {
-                listener.itemsSorted(spinner);
-            }
+            forEach(listener -> listener.itemsSorted(spinner));
         }
     }
 
@@ -185,16 +170,12 @@
         ListenerList<SpinnerSelectionListener> implements SpinnerSelectionListener {
         @Override
         public void selectedIndexChanged(Spinner spinner, int previousSelectedIndex) {
-            for (SpinnerSelectionListener listener : this) {
-                listener.selectedIndexChanged(spinner, previousSelectedIndex);
-            }
+            forEach(listener -> listener.selectedIndexChanged(spinner, previousSelectedIndex));
         }
 
         @Override
         public void selectedItemChanged(Spinner spinner, Object previousSelectedItem) {
-            for (SpinnerSelectionListener listener : this) {
-                listener.selectedItemChanged(spinner, previousSelectedItem);
-            }
+            forEach(listener -> listener.selectedItemChanged(spinner, previousSelectedItem));
         }
     }
 
@@ -202,47 +183,35 @@
         implements SpinnerBindingListener {
         @Override
         public void spinnerDataKeyChanged(Spinner spinner, String previousSpinnerDataKey) {
-            for (SpinnerBindingListener listener : this) {
-                listener.spinnerDataKeyChanged(spinner, previousSpinnerDataKey);
-            }
+            forEach(listener -> listener.spinnerDataKeyChanged(spinner, previousSpinnerDataKey));
         }
 
         @Override
         public void spinnerDataBindTypeChanged(Spinner spinner, BindType previousSpinnerDataBindType) {
-            for (SpinnerBindingListener listener : this) {
-                listener.spinnerDataBindTypeChanged(spinner, previousSpinnerDataBindType);
-            }
+            forEach(listener -> listener.spinnerDataBindTypeChanged(spinner, previousSpinnerDataBindType));
         }
 
         @Override
         public void spinnerDataBindMappingChanged(Spinner spinner,
             Spinner.SpinnerDataBindMapping previousSpinnerDataBindMapping) {
-            for (SpinnerBindingListener listener : this) {
-                listener.spinnerDataBindMappingChanged(spinner, previousSpinnerDataBindMapping);
-            }
+            forEach(listener -> listener.spinnerDataBindMappingChanged(spinner, previousSpinnerDataBindMapping));
         }
 
         @Override
         public void selectedItemKeyChanged(Spinner spinner, String previousSelectedItemKey) {
-            for (SpinnerBindingListener listener : this) {
-                listener.selectedItemKeyChanged(spinner, previousSelectedItemKey);
-            }
+            forEach(listener -> listener.selectedItemKeyChanged(spinner, previousSelectedItemKey));
         }
 
         @Override
         public void selectedItemBindTypeChanged(Spinner spinner,
             BindType previousSelectedItemBindType) {
-            for (SpinnerBindingListener listener : this) {
-                listener.selectedItemBindTypeChanged(spinner, previousSelectedItemBindType);
-            }
+            forEach(listener -> listener.selectedItemBindTypeChanged(spinner, previousSelectedItemBindType));
         }
 
         @Override
         public void selectedItemBindMappingChanged(Spinner spinner,
             ItemBindMapping previousSelectedItemBindMapping) {
-            for (SpinnerBindingListener listener : this) {
-                listener.selectedItemBindMappingChanged(spinner, previousSelectedItemBindMapping);
-            }
+            forEach(listener -> listener.selectedItemBindMappingChanged(spinner, previousSelectedItemBindMapping));
         }
     }
 
@@ -385,9 +354,7 @@
      */
     @SuppressWarnings("unchecked")
     public void setSpinnerData(List<?> spinnerData) {
-        if (spinnerData == null) {
-            throw new IllegalArgumentException("spinnerData is null.");
-        }
+        Utils.checkNull(spinnerData, "spinnerData");
 
         List<?> previousSpinnerData = this.spinnerData;
 
@@ -415,9 +382,7 @@
     }
 
     public final void setSpinnerData(String spinnerData) {
-        if (spinnerData == null) {
-            throw new IllegalArgumentException("spinnerData is null.");
-        }
+        Utils.checkNullOrEmpty(spinnerData, "spinnerData");
 
         try {
             setSpinnerData(JSONSerializer.parseList(spinnerData));
@@ -428,10 +393,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof Spinner.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + Spinner.Skin.class.getName());
-        }
+        checkSkin(skin, Spinner.Skin.class);
 
         super.setSkin(skin);
     }
@@ -449,9 +411,7 @@
      * @param itemRenderer The new item renderer for the list.
      */
     public void setItemRenderer(ItemRenderer itemRenderer) {
-        if (itemRenderer == null) {
-            throw new IllegalArgumentException("itemRenderer is null.");
-        }
+        Utils.checkNull(itemRenderer, "itemRenderer");
 
         ItemRenderer previousItemRenderer = this.itemRenderer;
 
@@ -540,9 +500,7 @@
     }
 
     public void setSpinnerDataBindType(BindType spinnerDataBindType) {
-        if (spinnerDataBindType == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(spinnerDataBindType, "spinnerDataBindType");
 
         BindType previousSpinnerDataBindType = this.spinnerDataBindType;
 
@@ -584,9 +542,7 @@
     }
 
     public void setSelectedItemBindType(BindType selectedItemBindType) {
-        if (selectedItemBindType == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(selectedItemBindType, "selectedItemBindType");
 
         BindType previousSelectedItemBindType = this.selectedItemBindType;
         if (previousSelectedItemBindType != selectedItemBindType) {
diff --git a/wtk/src/org/apache/pivot/wtk/SplitPane.java b/wtk/src/org/apache/pivot/wtk/SplitPane.java
index 7b591fd..2f90d57 100644
--- a/wtk/src/org/apache/pivot/wtk/SplitPane.java
+++ b/wtk/src/org/apache/pivot/wtk/SplitPane.java
@@ -18,6 +18,7 @@
 
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * A <tt>SplitPane</tt> is a container component that splits its size up into
@@ -59,51 +60,37 @@
         SplitPaneListener {
         @Override
         public void topLeftChanged(SplitPane splitPane, Component previousTopLeft) {
-            for (SplitPaneListener listener : this) {
-                listener.topLeftChanged(splitPane, previousTopLeft);
-            }
+            forEach(listener -> listener.topLeftChanged(splitPane, previousTopLeft));
         }
 
         @Override
         public void bottomRightChanged(SplitPane splitPane, Component previousBottomRight) {
-            for (SplitPaneListener listener : this) {
-                listener.bottomRightChanged(splitPane, previousBottomRight);
-            }
+            forEach(listener -> listener.bottomRightChanged(splitPane, previousBottomRight));
         }
 
         @Override
         public void orientationChanged(SplitPane splitPane) {
-            for (SplitPaneListener listener : this) {
-                listener.orientationChanged(splitPane);
-            }
+            forEach(listener -> listener.orientationChanged(splitPane));
         }
 
         @Override
         public void primaryRegionChanged(SplitPane splitPane) {
-            for (SplitPaneListener listener : this) {
-                listener.primaryRegionChanged(splitPane);
-            }
+            forEach(listener -> listener.primaryRegionChanged(splitPane));
         }
 
         @Override
         public void splitRatioChanged(SplitPane splitPane, float previousSplitRatio) {
-            for (SplitPaneListener listener : this) {
-                listener.splitRatioChanged(splitPane, previousSplitRatio);
-            }
+            forEach(listener -> listener.splitRatioChanged(splitPane, previousSplitRatio));
         }
 
         @Override
         public void lockedChanged(SplitPane splitPane) {
-            for (SplitPaneListener listener : this) {
-                listener.lockedChanged(splitPane);
-            }
+            forEach(listener -> listener.lockedChanged(splitPane));
         }
 
         @Override
         public void resizeModeChanged(SplitPane splitPane, ResizeMode previousResizeMode) {
-            for (SplitPaneListener listener : this) {
-                listener.resizeModeChanged(splitPane, previousResizeMode);
-            }
+            forEach(listener -> listener.resizeModeChanged(splitPane, previousResizeMode));
         }
     }
 
@@ -229,9 +216,7 @@
     }
 
     public void setOrientation(Orientation orientation) {
-        if (orientation == null) {
-            throw new IllegalArgumentException("orientation is null.");
-        }
+        Utils.checkNull(orientation, "orientation");
 
         if (this.orientation != orientation) {
             this.orientation = orientation;
@@ -244,9 +229,7 @@
     }
 
     public void setPrimaryRegion(Region primaryRegion) {
-        if (primaryRegion == null) {
-            throw new IllegalArgumentException("primaryRegion is null.");
-        }
+        Utils.checkNull(primaryRegion, "primaryRegion");
 
         if (this.primaryRegion != primaryRegion) {
             this.primaryRegion = primaryRegion;
@@ -287,9 +270,7 @@
     }
 
     public void setResizeMode(ResizeMode resizeMode) {
-        if (resizeMode == null) {
-            throw new IllegalArgumentException("resizeMode is null.");
-        }
+        Utils.checkNull(resizeMode, "resizeMode");
 
         ResizeMode previousResizeMode = this.resizeMode;
 
diff --git a/wtk/src/org/apache/pivot/wtk/TablePane.java b/wtk/src/org/apache/pivot/wtk/TablePane.java
index f0d20e0..8c2ec65 100644
--- a/wtk/src/org/apache/pivot/wtk/TablePane.java
+++ b/wtk/src/org/apache/pivot/wtk/TablePane.java
@@ -23,6 +23,7 @@
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ImmutableIterator;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Container that arranges components in a two-dimensional grid, optionally
@@ -199,9 +200,7 @@
 
         @Override
         public void insert(Component component, int index) {
-            if (component == null) {
-                throw new IllegalArgumentException("Component is null.");
-            }
+            Utils.checkNull(component, "Component");
 
             if (component.getParent() != null) {
                 throw new IllegalArgumentException("Component already has a parent.");
@@ -220,9 +219,7 @@
             Component previousComponent = cells.get(index);
 
             if (component != previousComponent) {
-                if (component == null) {
-                    throw new IllegalArgumentException("Component is null.");
-                }
+                Utils.checkNull(component, "Component");
 
                 if (component.getParent() != null) {
                     throw new IllegalArgumentException("Component already has a parent.");
@@ -473,12 +470,10 @@
 
         @Override
         public void insert(Row row, int index) {
-            if (row == null) {
-                throw new IllegalArgumentException("row is null.");
-            }
+            Utils.checkNull(row, "Row");
 
             if (row.tablePane != null) {
-                throw new IllegalArgumentException("row is already in use by another table pane.");
+                throw new IllegalArgumentException("Row is already in use by another table pane.");
             }
 
             rows.insert(row, index);
@@ -568,13 +563,11 @@
 
         @Override
         public void insert(Column column, int index) {
-            if (column == null) {
-                throw new IllegalArgumentException("column is null.");
-            }
+            Utils.checkNull(column, "Column");
 
             if (column.tablePane != null) {
                 throw new IllegalArgumentException(
-                    "column is already in use by another table pane.");
+                    "Column is already in use by another table pane.");
             }
 
             columns.insert(column, index);
@@ -653,81 +646,59 @@
         TablePaneListener {
         @Override
         public void rowInserted(TablePane tablePane, int index) {
-            for (TablePaneListener listener : this) {
-                listener.rowInserted(tablePane, index);
-            }
+            forEach(listener -> listener.rowInserted(tablePane, index));
         }
 
         @Override
         public void rowsRemoved(TablePane tablePane, int index, Sequence<TablePane.Row> rows) {
-            for (TablePaneListener listener : this) {
-                listener.rowsRemoved(tablePane, index, rows);
-            }
+            forEach(listener -> listener.rowsRemoved(tablePane, index, rows));
         }
 
         @Override
         public void rowHeightChanged(TablePane.Row row, int previousHeight, boolean previousRelative) {
-            for (TablePaneListener listener : this) {
-                listener.rowHeightChanged(row, previousHeight, previousRelative);
-            }
+            forEach(listener -> listener.rowHeightChanged(row, previousHeight, previousRelative));
         }
 
         @Override
         public void rowHighlightedChanged(TablePane.Row row) {
-            for (TablePaneListener listener : this) {
-                listener.rowHighlightedChanged(row);
-            }
+            forEach(listener -> listener.rowHighlightedChanged(row));
         }
 
         @Override
         public void columnInserted(TablePane tablePane, int index) {
-            for (TablePaneListener listener : this) {
-                listener.columnInserted(tablePane, index);
-            }
+            forEach(listener -> listener.columnInserted(tablePane, index));
         }
 
         @Override
         public void columnsRemoved(TablePane tablePane, int index,
             Sequence<TablePane.Column> columns) {
-            for (TablePaneListener listener : this) {
-                listener.columnsRemoved(tablePane, index, columns);
-            }
+            forEach(listener -> listener.columnsRemoved(tablePane, index, columns));
         }
 
         @Override
         public void columnWidthChanged(TablePane.Column column, int previousWidth,
             boolean previousRelative) {
-            for (TablePaneListener listener : this) {
-                listener.columnWidthChanged(column, previousWidth, previousRelative);
-            }
+            forEach(listener -> listener.columnWidthChanged(column, previousWidth, previousRelative));
         }
 
         @Override
         public void columnHighlightedChanged(TablePane.Column column) {
-            for (TablePaneListener listener : this) {
-                listener.columnHighlightedChanged(column);
-            }
+            forEach(listener -> listener.columnHighlightedChanged(column));
         }
 
         @Override
         public void cellInserted(TablePane.Row row, int column) {
-            for (TablePaneListener listener : this) {
-                listener.cellInserted(row, column);
-            }
+            forEach(listener -> listener.cellInserted(row, column));
         }
 
         @Override
         public void cellsRemoved(TablePane.Row row, int column, Sequence<Component> removed) {
-            for (TablePaneListener listener : this) {
-                listener.cellsRemoved(row, column, removed);
-            }
+            forEach(listener -> listener.cellsRemoved(row, column, removed));
         }
 
         @Override
         public void cellUpdated(TablePane.Row row, int column, Component previousComponent) {
-            for (TablePaneListener listener : this) {
-                listener.cellUpdated(row, column, previousComponent);
-            }
+            forEach(listener -> listener.cellUpdated(row, column, previousComponent));
         }
     }
 
@@ -735,17 +706,13 @@
         ListenerList<TablePaneAttributeListener> implements TablePaneAttributeListener {
         @Override
         public void rowSpanChanged(TablePane tablePane, Component component, int previousRowSpan) {
-            for (TablePaneAttributeListener listener : this) {
-                listener.rowSpanChanged(tablePane, component, previousRowSpan);
-            }
+            forEach(listener -> listener.rowSpanChanged(tablePane, component, previousRowSpan));
         }
 
         @Override
         public void columnSpanChanged(TablePane tablePane, Component component,
             int previousColumnSpan) {
-            for (TablePaneAttributeListener listener : this) {
-                listener.columnSpanChanged(tablePane, component, previousColumnSpan);
-            }
+            forEach(listener -> listener.columnSpanChanged(tablePane, component, previousColumnSpan));
         }
     }
 
@@ -774,9 +741,7 @@
      * be made
      */
     public TablePane(Sequence<Column> columns) {
-        if (columns == null) {
-            throw new IllegalArgumentException("columns is null");
-        }
+        Utils.checkNull(columns, "columns");
 
         this.rows = new ArrayList<>();
         this.columns = new ArrayList<>(columns);
@@ -786,10 +751,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TablePane.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TablePane.Skin.class.getName());
-        }
+        checkSkin(skin, TablePane.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/TableView.java b/wtk/src/org/apache/pivot/wtk/TableView.java
index 386c7ff..da37e82 100644
--- a/wtk/src/org/apache/pivot/wtk/TableView.java
+++ b/wtk/src/org/apache/pivot/wtk/TableView.java
@@ -1198,10 +1198,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TableView.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TableView.Skin.class.getName());
-        }
+        checkSkin(skin, TableView.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/TableViewHeader.java b/wtk/src/org/apache/pivot/wtk/TableViewHeader.java
index 012a3d1..1c175bc 100644
--- a/wtk/src/org/apache/pivot/wtk/TableViewHeader.java
+++ b/wtk/src/org/apache/pivot/wtk/TableViewHeader.java
@@ -17,6 +17,7 @@
 package org.apache.pivot.wtk;
 
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Component representing a table view header.
@@ -43,16 +44,12 @@
         ListenerList<TableViewHeaderListener> implements TableViewHeaderListener {
         @Override
         public void tableViewChanged(TableViewHeader tableViewHeader, TableView previousTableView) {
-            for (TableViewHeaderListener listener : this) {
-                listener.tableViewChanged(tableViewHeader, previousTableView);
-            }
+            forEach(listener -> listener.tableViewChanged(tableViewHeader, previousTableView));
         }
 
         @Override
         public void sortModeChanged(TableViewHeader tableViewHeader, SortMode previousSortMode) {
-            for (TableViewHeaderListener listener : this) {
-                listener.sortModeChanged(tableViewHeader, previousSortMode);
-            }
+            forEach(listener -> listener.sortModeChanged(tableViewHeader, previousSortMode));
         }
     }
 
@@ -60,9 +57,7 @@
         ListenerList<TableViewHeaderPressListener> implements TableViewHeaderPressListener {
         @Override
         public void headerPressed(TableViewHeader tableViewHeader, int index) {
-            for (TableViewHeaderPressListener listener : this) {
-                listener.headerPressed(tableViewHeader, index);
-            }
+            forEach(listener -> listener.headerPressed(tableViewHeader, index));
         }
     }
 
@@ -83,10 +78,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TableViewHeader.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TableViewHeader.Skin.class.getName());
-        }
+        checkSkin(skin, TableViewHeader.Skin.class);
 
         super.setSkin(skin);
     }
@@ -109,9 +101,7 @@
     }
 
     public void setSortMode(SortMode sortMode) {
-        if (sortMode == null) {
-            throw new IllegalArgumentException();
-        }
+        Utils.checkNull(sortMode, "sortMode");
 
         SortMode previousSortMode = this.sortMode;
         if (previousSortMode != sortMode) {
diff --git a/wtk/src/org/apache/pivot/wtk/TextArea.java b/wtk/src/org/apache/pivot/wtk/TextArea.java
index 232bbe0..1ce2c50 100644
--- a/wtk/src/org/apache/pivot/wtk/TextArea.java
+++ b/wtk/src/org/apache/pivot/wtk/TextArea.java
@@ -576,10 +576,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TextArea.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TextArea.Skin.class.getName());
-        }
+        checkSkin(skin, TextArea.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/TextInput.java b/wtk/src/org/apache/pivot/wtk/TextInput.java
index 77722ab..29fad1f 100644
--- a/wtk/src/org/apache/pivot/wtk/TextInput.java
+++ b/wtk/src/org/apache/pivot/wtk/TextInput.java
@@ -145,10 +145,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TextInput.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TextInput.Skin.class.getName());
-        }
+        checkSkin(skin, TextInput.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/TextPane.java b/wtk/src/org/apache/pivot/wtk/TextPane.java
index 095957d..3029632 100644
--- a/wtk/src/org/apache/pivot/wtk/TextPane.java
+++ b/wtk/src/org/apache/pivot/wtk/TextPane.java
@@ -321,10 +321,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TextPane.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TextPane.Skin.class.getName());
-        }
+        checkSkin(skin, TextPane.Skin.class);
 
         super.setSkin(skin);
     }
diff --git a/wtk/src/org/apache/pivot/wtk/TreeView.java b/wtk/src/org/apache/pivot/wtk/TreeView.java
index 68db3d8..dcfff2e 100644
--- a/wtk/src/org/apache/pivot/wtk/TreeView.java
+++ b/wtk/src/org/apache/pivot/wtk/TreeView.java
@@ -29,8 +29,9 @@
 import org.apache.pivot.collections.immutable.ImmutableList;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ListenerList;
-import org.apache.pivot.util.Vote;
 import org.apache.pivot.util.Utils;
+import org.apache.pivot.util.Vote;
+import org.apache.pivot.util.VoteResult;
 import org.apache.pivot.wtk.content.TreeViewNodeRenderer;
 
 /**
@@ -214,60 +215,44 @@
 
         @Override
         public void treeDataChanged(TreeView treeView, List<?> previousTreeData) {
-            for (TreeViewListener listener : this) {
-                listener.treeDataChanged(treeView, previousTreeData);
-            }
+            forEach(listener -> listener.treeDataChanged(treeView, previousTreeData));
         }
 
         @Override
         public void nodeRendererChanged(TreeView treeView, NodeRenderer previousNodeRenderer) {
-            for (TreeViewListener listener : this) {
-                listener.nodeRendererChanged(treeView, previousNodeRenderer);
-            }
+            forEach(listener -> listener.nodeRendererChanged(treeView, previousNodeRenderer));
         }
 
         @Override
         public void nodeEditorChanged(TreeView treeView, TreeView.NodeEditor previousNodeEditor) {
-            for (TreeViewListener listener : this) {
-                listener.nodeEditorChanged(treeView, previousNodeEditor);
-            }
+            forEach(listener -> listener.nodeEditorChanged(treeView, previousNodeEditor));
         }
 
         @Override
         public void selectModeChanged(TreeView treeView, SelectMode previousSelectMode) {
-            for (TreeViewListener listener : this) {
-                listener.selectModeChanged(treeView, previousSelectMode);
-            }
+            forEach(listener -> listener.selectModeChanged(treeView, previousSelectMode));
         }
 
         @Override
         public void checkmarksEnabledChanged(TreeView treeView) {
-            for (TreeViewListener listener : this) {
-                listener.checkmarksEnabledChanged(treeView);
-            }
+            forEach(listener -> listener.checkmarksEnabledChanged(treeView));
         }
 
         @Override
         public void showMixedCheckmarkStateChanged(TreeView treeView) {
-            for (TreeViewListener listener : this) {
-                listener.showMixedCheckmarkStateChanged(treeView);
-            }
+            forEach(listener -> listener.showMixedCheckmarkStateChanged(treeView));
         }
 
         @Override
         public void disabledNodeFilterChanged(TreeView treeView,
             Filter<?> previousDisabledNodeFilter) {
-            for (TreeViewListener listener : this) {
-                listener.disabledNodeFilterChanged(treeView, previousDisabledNodeFilter);
-            }
+            forEach(listener -> listener.disabledNodeFilterChanged(treeView, previousDisabledNodeFilter));
         }
 
         @Override
         public void disabledCheckmarkFilterChanged(TreeView treeView,
             Filter<?> previousDisabledCheckmarkFilter) {
-            for (TreeViewListener listener : this) {
-                listener.disabledCheckmarkFilterChanged(treeView, previousDisabledCheckmarkFilter);
-            }
+            forEach(listener -> listener.disabledCheckmarkFilterChanged(treeView, previousDisabledCheckmarkFilter));
         }
     }
 
@@ -278,34 +263,26 @@
         implements TreeViewBranchListener {
         @Override
         public void branchExpanded(TreeView treeView, Path path) {
-            for (TreeViewBranchListener listener : this) {
-                listener.branchExpanded(treeView, path);
-            }
+            forEach(listener -> listener.branchExpanded(treeView, path));
         }
 
         @Override
         public void branchCollapsed(TreeView treeView, Path path) {
-            for (TreeViewBranchListener listener : this) {
-                listener.branchCollapsed(treeView, path);
-            }
+            forEach(listener -> listener.branchCollapsed(treeView, path));
         }
 
         @Override
         public Vote previewBranchExpandedChange(TreeView treeView, Path path) {
-            Vote vote = Vote.APPROVE;
+            VoteResult vote = new VoteResult(Vote.APPROVE);
 
-            for (TreeViewBranchListener listener : this) {
-                vote = vote.tally(listener.previewBranchExpandedChange(treeView, path));
-            }
+            forEach(listener -> vote.tally(listener.previewBranchExpandedChange(treeView, path)));
 
-            return vote;
+            return vote.get();
         }
 
         @Override
         public void branchExpandedChangeVetoed(TreeView treeView, Path path, Vote reason) {
-            for (TreeViewBranchListener listener : this) {
-                listener.branchExpandedChangeVetoed(treeView, path, reason);
-            }
+            forEach(listener -> listener.branchExpandedChangeVetoed(treeView, path, reason));
         }
     }
 
@@ -316,37 +293,27 @@
         implements TreeViewNodeListener {
         @Override
         public void nodeInserted(TreeView treeView, Path path, int index) {
-            for (TreeViewNodeListener listener : this) {
-                listener.nodeInserted(treeView, path, index);
-            }
+            forEach(listener -> listener.nodeInserted(treeView, path, index));
         }
 
         @Override
         public void nodesRemoved(TreeView treeView, Path path, int index, int count) {
-            for (TreeViewNodeListener listener : this) {
-                listener.nodesRemoved(treeView, path, index, count);
-            }
+            forEach(listener -> listener.nodesRemoved(treeView, path, index, count));
         }
 
         @Override
         public void nodeUpdated(TreeView treeView, Path path, int index) {
-            for (TreeViewNodeListener listener : this) {
-                listener.nodeUpdated(treeView, path, index);
-            }
+            forEach(listener -> listener.nodeUpdated(treeView, path, index));
         }
 
         @Override
         public void nodesCleared(TreeView treeView, Path path) {
-            for (TreeViewNodeListener listener : this) {
-                listener.nodesCleared(treeView, path);
-            }
+            forEach(listener -> listener.nodesCleared(treeView, path));
         }
 
         @Override
         public void nodesSorted(TreeView treeView, Path path) {
-            for (TreeViewNodeListener listener : this) {
-                listener.nodesSorted(treeView, path);
-            }
+            forEach(listener -> listener.nodesSorted(treeView, path));
         }
     }
 
@@ -358,9 +325,7 @@
         @Override
         public void nodeCheckStateChanged(TreeView treeView, Path path,
             TreeView.NodeCheckState previousCheckState) {
-            for (TreeViewNodeStateListener listener : this) {
-                listener.nodeCheckStateChanged(treeView, path, previousCheckState);
-            }
+            forEach(listener -> listener.nodeCheckStateChanged(treeView, path, previousCheckState));
         }
     }
 
@@ -371,30 +336,22 @@
         ListenerList<TreeViewSelectionListener> implements TreeViewSelectionListener {
         @Override
         public void selectedPathAdded(TreeView treeView, Path path) {
-            for (TreeViewSelectionListener listener : this) {
-                listener.selectedPathAdded(treeView, path);
-            }
+            forEach(listener -> listener.selectedPathAdded(treeView, path));
         }
 
         @Override
         public void selectedPathRemoved(TreeView treeView, Path path) {
-            for (TreeViewSelectionListener listener : this) {
-                listener.selectedPathRemoved(treeView, path);
-            }
+            forEach(listener -> listener.selectedPathRemoved(treeView, path));
         }
 
         @Override
         public void selectedPathsChanged(TreeView treeView, Sequence<Path> previousSelectedPaths) {
-            for (TreeViewSelectionListener listener : this) {
-                listener.selectedPathsChanged(treeView, previousSelectedPaths);
-            }
+            forEach(listener -> listener.selectedPathsChanged(treeView, previousSelectedPaths));
         }
 
         @Override
         public void selectedNodeChanged(TreeView treeView, Object previousSelectedNode) {
-            for (TreeViewSelectionListener listener : this) {
-                listener.selectedNodeChanged(treeView, previousSelectedNode);
-            }
+            forEach(listener -> listener.selectedNodeChanged(treeView, previousSelectedNode));
         }
     }
 
@@ -691,14 +648,12 @@
 
             int n = paths.getLength();
             try {
-                // Update all affected paths by incrementing the appropriate
-                // path element
+                // Update all affected paths by incrementing the appropriate path element
                 for (int depth = basePath.getLength(); i < n; i++) {
                     Path affectedPath = paths.get(i);
 
                     if (!Sequence.Tree.isDescendant(basePath, affectedPath)) {
-                        // All paths from here forward are guaranteed to be
-                        // unaffected
+                        // All paths from here forward are guaranteed to be unaffected
                         break;
                     }
 
@@ -722,8 +677,7 @@
          * <tt>count</tt> is <tt>2</tt>, then <tt>paths</tt> will be updated to
          * <tt>[[4, 0]]</tt>. No events are fired.
          *
-         * @param paths Sequence of paths guaranteed to be sorted by
-         * "row order".
+         * @param paths Sequence of paths guaranteed to be sorted by "row order".
          * @param basePath The path to the parent of the removed items.
          * @param index The index of the first removed item within the base.
          * @param count The number of items removed.
@@ -761,8 +715,7 @@
                 Path affectedPath = paths.get(i);
 
                 if (!Sequence.Tree.isDescendant(basePath, affectedPath)) {
-                    // All paths from here forward are guaranteed to be
-                    // unaffected
+                    // All paths from here forward are guaranteed to be unaffected
                     break;
                 }
 
@@ -782,8 +735,7 @@
          * then <tt>paths</tt> will be updated to <tt>[[3], [3, 1], [5,
          * 0]]</tt>. No events are fired.
          *
-         * @param paths Sequence of paths guaranteed to be sorted by
-         * "row order".
+         * @param paths Sequence of paths guaranteed to be sorted by "row order".
          * @param basePath The path to the parent of the updated item.
          * @param index The index of the updated item within its parent.
          */
@@ -817,8 +769,7 @@
          * <tt>[3]</tt>, then <tt>paths</tt> will be updated to <tt>[[3], [5,
          * 0]]</tt>. No events are fired.
          *
-         * @param paths Sequence of paths guaranteed to be sorted by
-         * "row order".
+         * @param paths Sequence of paths guaranteed to be sorted by "row order".
          * @param basePath The path whose children were sorted.
          * @return The number of path elements that were updated.
          */
@@ -910,10 +861,7 @@
      */
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof TreeView.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + TreeView.Skin.class.getName());
-        }
+        checkSkin(skin, TreeView.Skin.class);
 
         super.setSkin(skin);
     }
@@ -1143,8 +1091,7 @@
     }
 
     /**
-     * Returns the first selected path, as it would appear in a fully expanded
-     * tree.
+     * Returns the first selected path, as it would appear in a fully expanded tree.
      *
      * @return The first selected path, or <tt>null</tt> if nothing is selected.
      */
@@ -1153,8 +1100,7 @@
     }
 
     /**
-     * Returns the last selected path, as it would appear in a fully expanded
-     * tree.
+     * Returns the last selected path, as it would appear in a fully expanded tree.
      *
      * @return The last selected path, or <tt>null</tt> if nothing is selected.
      */
@@ -1268,8 +1214,8 @@
 
         if (previousTreeDataKey != treeDataKey) {
             this.treeDataKey = treeDataKey;
-            // treeViewBindingListeners.treeDataKeyChanged(this,
-            // previousTreeDataKey); // future use
+            // treeViewBindingListeners.treeDataKeyChanged(this, previousTreeDataKey);
+            // future use
         }
     }
 
@@ -1298,8 +1244,7 @@
     }
 
     /**
-     * @return Whether or not the node at the given path is part of the
-     * current selection.
+     * @return Whether or not the node at the given path is part of the current selection.
      * @param path Path to the node to check.
      */
     public boolean isNodeSelected(Path path) {
@@ -1496,8 +1441,7 @@
      * checked, but one or more of its descendants are."
      *
      * @param path The path to the node.
-     * @param checked <tt>true</tt> to check the node; <tt>false</tt> to uncheck
-     * it.
+     * @param checked <tt>true</tt> to check the node; <tt>false</tt> to uncheck it.
      * @throws IllegalStateException If checkmarks are not enabled (see
      * {@link #getCheckmarksEnabled()}).
      * @see NodeCheckState#MIXED
diff --git a/wtk/src/org/apache/pivot/wtk/Viewport.java b/wtk/src/org/apache/pivot/wtk/Viewport.java
index 34111b3..dff032d 100644
--- a/wtk/src/org/apache/pivot/wtk/Viewport.java
+++ b/wtk/src/org/apache/pivot/wtk/Viewport.java
@@ -19,6 +19,7 @@
 import org.apache.pivot.beans.DefaultProperty;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Utils;
 
 /**
  * Abstract base class for viewport components. Viewports provide a windowed
@@ -47,23 +48,17 @@
 
         @Override
         public void scrollTopChanged(Viewport viewport, int previousScrollTop) {
-            for (ViewportListener listener : this) {
-                listener.scrollTopChanged(viewport, previousScrollTop);
-            }
+            forEach(listener -> listener.scrollTopChanged(viewport, previousScrollTop));
         }
 
         @Override
         public void scrollLeftChanged(Viewport viewport, int previousScrollLeft) {
-            for (ViewportListener listener : this) {
-                listener.scrollLeftChanged(viewport, previousScrollLeft);
-            }
+            forEach(listener -> listener.scrollLeftChanged(viewport, previousScrollLeft));
         }
 
         @Override
         public void viewChanged(Viewport viewport, Component previousView) {
-            for (ViewportListener listener : this) {
-                listener.viewChanged(viewport, previousView);
-            }
+            forEach(listener -> listener.viewChanged(viewport, previousView));
         }
     }
 
@@ -78,10 +73,7 @@
 
     @Override
     protected void setSkin(org.apache.pivot.wtk.Skin skin) {
-        if (!(skin instanceof Viewport.Skin)) {
-            throw new IllegalArgumentException("Skin class must implement "
-                + Viewport.Skin.class.getName());
-        }
+        checkSkin(skin, Viewport.Skin.class);
 
         super.setSkin(skin);
     }