+ Image getAlbumImage();
+
+ /**
+ * Returns whether this album contains any other albums or images.
+ *
+ * @return {@code true} if this album is empty, {@code false} otherwise
+ */
+ boolean isEmpty();
+
+ /**
+ * Returns whether this album is an identitiy’s root album.
+ *
+ * @return {@code true} if this album is an identity’s root album, {@code
+ * false} otherwise
+ */
+ boolean isRoot();
+
+ /**
+ * Returns the parent album of this album.
+ *
+ * @return The parent album of this album, or {@code null} if this album does
+ * not have a parent
+ */
+ Album getParent();
+
+ /**
+ * Returns the title of this album.
+ *
+ * @return The title of this album
+ */
+ String getTitle();
+
+ /**
+ * Returns the description of this album.
+ *
+ * @return The description of this album
+ */
+ String getDescription();
+
+ AlbumBuilder newAlbumBuilder() throws IllegalStateException;
+
+ ImageBuilder newImageBuilder() throws IllegalStateException;
+
+ /**
+ * Returns a modifier for this album.
+ *
+ * @return A modifier for this album
+ * @throws IllegalStateException
+ * if this album can not be modified
+ */
+ Modifier modify() throws IllegalStateException;
+
+ void remove() throws IllegalStateException;
+
+ /**
+ * Allows modifying an album. Modifications are only performed once {@link
+ * #update()} has succesfully returned a new album with the modifications
+ * made.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ interface Modifier {
+
+ Modifier setTitle(String title);
+
+ Modifier setDescription(String description);
+
+ Modifier setAlbumImage(String imageId);
+
+ Album update() throws IllegalStateException;
+