Index: trunk/sources/HeuristicLab.Persistence/3.3/Core/DataMemberAccessor.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Core/DataMemberAccessor.cs	(revision 3031)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Core/DataMemberAccessor.cs	(revision 3031)
@@ -0,0 +1,120 @@
+﻿using System;
+using System.Reflection;
+using HeuristicLab.Persistence.Core;
+
+namespace HeuristicLab.Persistence.Core {
+
+  /// <summary>
+  /// Encapsulation and abstraction for access a data member of an object
+  /// regardless of it being a property or field. Additionally a
+  /// default value and an alternate name can be specified.
+  /// </summary>
+  public class DataMemberAccessor {
+
+    /// <summary>
+    /// The function to get the value of the data member.
+    /// </summary>
+    public readonly Func<object> Get;
+
+    /// <summary>
+    /// The function to set the value of the data member.
+    /// </summary>
+    public readonly Action<object> Set;
+
+    /// <summary>
+    /// The name of the data member.
+    /// </summary>
+    public readonly string Name;
+
+    /// <summary>
+    /// The default value of the data member, can remain <c>null</c>
+    /// if no default value. If left null, this will also leave the
+    /// default value for value types (e.g. 0 for <c>int</c>).
+    /// </summary>
+    public readonly object DefaultValue;
+
+
+    /// <summary>
+    /// Create a <see cref="DataMemberAccessor"/> from a FieldInfo or
+    /// PropertyInfo for the give object.
+    /// </summary>
+    /// <param name="memberInfo">The member info.</param>
+    /// <param name="name">The name.</param>
+    /// <param name="defaultvalue">The defaultvalue.</param>
+    /// <param name="obj">The object.</param>
+    public DataMemberAccessor(MemberInfo memberInfo, string name, object defaultvalue, object obj) {
+      Name = name;
+      DefaultValue = defaultvalue;
+      if (memberInfo.MemberType == MemberTypes.Field) {
+        FieldInfo fieldInfo = (FieldInfo)memberInfo;
+        Get = () => fieldInfo.GetValue(obj);
+        Set = value => fieldInfo.SetValue(obj, value);
+      } else if (memberInfo.MemberType == MemberTypes.Property) {
+        PropertyInfo propertyInfo = (PropertyInfo)memberInfo;
+        if (!propertyInfo.CanRead || !propertyInfo.CanWrite) {
+          throw new PersistenceException(
+            "Storable properties must implement both a Get and a Set Accessor. ");
+        }
+        Get = () => propertyInfo.GetValue(obj, null);
+        Set = value => propertyInfo.SetValue(obj, value, null);
+      } else {
+        throw new PersistenceException(
+          "The Storable attribute can only be applied to fields and properties.");
+      }
+    }
+
+    /// <summary>
+    /// Wrap existing getter and setter functions.
+    /// </summary>
+    /// <param name="name">The name.</param>
+    /// <param name="defaultValue">The default value.</param>
+    /// <param name="getter">The getter.</param>
+    /// <param name="setter">The setter.</param>
+    public DataMemberAccessor(string name, object defaultValue,
+        Func<object> getter, Action<object> setter) {
+      Name = name;
+      DefaultValue = defaultValue;
+      Get = getter;
+      Set = setter;
+    }
+
+    /// <summary>
+    /// Create an empty accessor that just encapsulates an object
+    /// without access.
+    /// </summary>
+    /// <param name="o">The object</param>
+    public DataMemberAccessor(object o) {
+      Name = null;
+      DefaultValue = null;
+      Get = () => o;
+      Set = null;
+    }
+
+    /// <summary>
+    /// Create an empty accessor that just encapsulates an object
+    /// without access.
+    /// </summary>
+    /// <param name="o">The object</param>
+    /// <param name="name">The object's name.</param>
+    public DataMemberAccessor(object o, string name) {
+      Name = name;
+      DefaultValue = null;
+      Get = () => o;
+      Set = null;
+    }
+
+    /// <summary>
+    /// Returns a <see cref="System.String"/> that represents this instance.
+    /// </summary>
+    /// <returns>
+    /// A <see cref="System.String"/> that represents this instance.
+    /// </returns>
+    public override string ToString() {
+      return String.Format("DataMemberAccessor({0}, {1}, {2}, {3})",
+        Name,
+        DefaultValue ?? "<null>",
+        Get.Method, Set.Method);
+    }
+  }
+
+}
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/DataMemberAccessor.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/DataMemberAccessor.cs	(revision 3030)
+++ 	(revision )
@@ -1,120 +1,0 @@
-﻿using System;
-using System.Reflection;
-using HeuristicLab.Persistence.Core;
-
-namespace HeuristicLab.Persistence.Default.CompositeSerializers.Storable {
-
-  /// <summary>
-  /// Encapsulation and abstraction for access a data member of an object
-  /// regardless of it being a property or field. Addicionally a
-  /// default value and an alternate name can be specified.
-  /// </summary>
-  public class DataMemberAccessor {
-
-    /// <summary>
-    /// The function to get the value of the data member.
-    /// </summary>
-    public readonly Func<object> Get;
-
-    /// <summary>
-    /// The function to set the value of the data member.
-    /// </summary>
-    public readonly Action<object> Set;
-
-    /// <summary>
-    /// The name of the data member.
-    /// </summary>
-    public readonly string Name;
-
-    /// <summary>
-    /// The default value of the data member, can remain <c>null</c>
-    /// if no default value. If left null, this will also leave the
-    /// default value for value types (e.g. 0 for <c>int</c>).
-    /// </summary>
-    public readonly object DefaultValue;
-
-
-    /// <summary>
-    /// Create a <see cref="DataMemberAccessor"/> from a FieldInfo or
-    /// PropertyInfo for the give object.
-    /// </summary>
-    /// <param name="memberInfo">The member info.</param>
-    /// <param name="name">The name.</param>
-    /// <param name="defaultvalue">The defaultvalue.</param>
-    /// <param name="obj">The object.</param>
-    public DataMemberAccessor(MemberInfo memberInfo, string name, object defaultvalue, object obj) {
-      Name = name;
-      DefaultValue = defaultvalue;
-      if (memberInfo.MemberType == MemberTypes.Field) {
-        FieldInfo fieldInfo = (FieldInfo)memberInfo;
-        Get = () => fieldInfo.GetValue(obj);
-        Set = value => fieldInfo.SetValue(obj, value);
-      } else if (memberInfo.MemberType == MemberTypes.Property) {
-        PropertyInfo propertyInfo = (PropertyInfo)memberInfo;
-        if (!propertyInfo.CanRead || !propertyInfo.CanWrite) {
-          throw new PersistenceException(
-            "Storable properties must implement both a Get and a Set Accessor. ");
-        }
-        Get = () => propertyInfo.GetValue(obj, null);
-        Set = value => propertyInfo.SetValue(obj, value, null);
-      } else {
-        throw new PersistenceException(
-          "The Storable attribute can only be applied to fields and properties.");
-      }
-    }
-
-    /// <summary>
-    /// Wrap existing getter and setter functions.
-    /// </summary>
-    /// <param name="name">The name.</param>
-    /// <param name="defaultValue">The default value.</param>
-    /// <param name="getter">The getter.</param>
-    /// <param name="setter">The setter.</param>
-    public DataMemberAccessor(string name, object defaultValue,
-        Func<object> getter, Action<object> setter) {
-      Name = name;
-      DefaultValue = defaultValue;
-      Get = getter;
-      Set = setter;
-    }
-
-    /// <summary>
-    /// Create an empty accessor that just encapsulates an object
-    /// without access.
-    /// </summary>
-    /// <param name="o">The object</param>
-    public DataMemberAccessor(object o) {
-      Name = null;
-      DefaultValue = null;
-      Get = () => o;
-      Set = null;
-    }
-
-    /// <summary>
-    /// Create an empty accessor that just encapsulates an object
-    /// without access.
-    /// </summary>
-    /// <param name="o">The object</param>
-    /// <param name="name">The object's name.</param>
-    public DataMemberAccessor(object o, string name) {
-      Name = name;
-      DefaultValue = null;
-      Get = () => o;
-      Set = null;
-    }
-
-    /// <summary>
-    /// Returns a <see cref="System.String"/> that represents this instance.
-    /// </summary>
-    /// <returns>
-    /// A <see cref="System.String"/> that represents this instance.
-    /// </returns>
-    public override string ToString() {
-      return String.Format("DataMemberAccessor({0}, {1}, {2}, {3})",
-        Name,
-        DefaultValue ?? "<null>",
-        Get.Method, Set.Method);
-    }
-  }
-
-}
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs	(revision 3030)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs	(revision 3031)
@@ -16,5 +16,5 @@
     /// Specify how members are selected for serialization.
     /// </summary>
-    public StorableClassType Type { get; set; }
+    public StorableClassType Type { get; private set; }
 
     /// <summary>
@@ -31,6 +31,5 @@
     /// <see cref="StorableClassType.MarkedOnly"/>.
     /// </summary>
-    public StorableClassAttribute() {
-    }
+    public StorableClassAttribute() { }
 
   }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableHookAttribute.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableHookAttribute.cs	(revision 3030)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableHookAttribute.cs	(revision 3031)
@@ -19,15 +19,5 @@
   /// </summary>
   [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
-  public sealed class StorableHookAttribute : Attribute {
-
-    private sealed class HookDesignator {
-      public Type Type { get; set; }
-      public HookType HookType { get; set; }
-      public HookDesignator() { }
-      public HookDesignator(Type type, HookType hookType) {
-        Type = type;
-        HookType = HookType;
-      }
-    }
+  public sealed class StorableHookAttribute : Attribute {    
 
     private readonly HookType hookType;
@@ -40,5 +30,4 @@
     }
 
-
     /// <summary>
     /// Mark method as <c>StorableSerializer</c> hook to be run
@@ -48,57 +37,5 @@
     public StorableHookAttribute(HookType hookType) {
       this.hookType = hookType;
-    }
-
-    private static readonly BindingFlags declaredInstanceMembers =
-      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly;
-
-    private static readonly object[] emptyArgs = new object[] { };
-
-    private static Dictionary<HookDesignator, List<MethodInfo>> hookCache =
-      new Dictionary<HookDesignator, List<MethodInfo>>();
-
-
-    /// <summary>
-    /// Invoke <c>hookType</c> hook on <c>obj</c>.
-    /// </summary>
-    /// <param name="hookType">Type of the hook.</param>
-    /// <param name="obj">The object.</param>
-    public static void InvokeHook(HookType hookType, object obj) {
-      if (obj == null)
-        throw new ArgumentNullException("Cannot invoke hooks on null");
-      foreach (MethodInfo mi in GetHooks(hookType, obj.GetType())) {
-        mi.Invoke(obj, emptyArgs);
-      }
     }    
-
-    private static IEnumerable<MethodInfo> GetHooks(HookType hookType, Type type) {
-      lock (hookCache) {
-        List<MethodInfo> hooks;
-        var designator = new HookDesignator(type, hookType);
-        hookCache.TryGetValue(designator, out hooks);
-        if (hooks != null)
-          return hooks;
-        hooks = new List<MethodInfo>(CollectHooks(hookType, type));
-        hookCache.Add(designator, hooks);
-        return hooks;
-      }
-    }
-
-    private static IEnumerable<MethodInfo> CollectHooks(HookType hookType, Type type) {  
-      if (type.BaseType != null)
-        foreach (var mi in CollectHooks(hookType, type.BaseType))
-          yield return mi;
-      foreach (MemberInfo memberInfo in type.GetMembers(declaredInstanceMembers)) {
-        foreach (StorableHookAttribute hook in memberInfo.GetCustomAttributes(typeof(StorableHookAttribute), false)) {
-          if (hook != null && hook.HookType == hookType) {
-            MethodInfo methodInfo = memberInfo as MethodInfo;
-            if (memberInfo.MemberType != MemberTypes.Method || memberInfo == null)
-              throw new ArgumentException("Storable hooks must be methods");
-            yield return methodInfo;
-          }
-        }
-      }
-    }
-
   }
 }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs	(revision 3030)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs	(revision 3031)
@@ -17,5 +17,4 @@
       BindingFlags.NonPublic |
       BindingFlags.DeclaredOnly;
-
 
     public static IEnumerable<StorableMemberInfo> GenerateStorableMembers(Type type, bool inherited) {
@@ -43,4 +42,28 @@
     }
 
+    public static bool IsEmptyOrStorableType(Type type, bool recusrive) {
+      if (IsEmptyType(type, recusrive)) return true;
+      if (!HasStorableClassAttribute(type)) return false;
+      return !recusrive || type.BaseType == null || IsEmptyOrStorableType(type.BaseType, true);
+    }
+
+    public static IEnumerable<MethodInfo> CollectHooks(HookType hookType, Type type) {
+      if (type.BaseType != null)
+        foreach (var mi in CollectHooks(hookType, type.BaseType))
+          yield return mi;
+      foreach (MemberInfo memberInfo in type.GetMembers(DECLARED_INSTANCE_MEMBERS)) {
+        foreach (StorableHookAttribute hook in memberInfo.GetCustomAttributes(typeof(StorableHookAttribute), false)) {
+          if (hook != null && hook.HookType == hookType) {
+            MethodInfo methodInfo = memberInfo as MethodInfo;
+            if (memberInfo.MemberType != MemberTypes.Method || memberInfo == null)
+              throw new ArgumentException("Storable hooks must be methods");
+            yield return methodInfo;
+          }
+        }
+      }
+    }
+
+    #region [Storable] helpers
+
     private static void AddMarkedMembers(Type type, List<StorableMemberInfo> storableMembers) {
       foreach (MemberInfo memberInfo in type.GetMembers(DECLARED_INSTANCE_MEMBERS)) {
@@ -60,9 +83,4 @@
     }
 
-    private static StorableClassAttribute GetStorableClassAttribute(Type type) {
-      return (StorableClassAttribute)type
-        .GetCustomAttributes(typeof(StorableClassAttribute), false)
-        .SingleOrDefault();
-    }
 
     private static IEnumerable<StorableMemberInfo> DisentangleNameMapping(
@@ -107,13 +125,21 @@
     }
 
-    public static bool IsEmptyOrStorableType(Type type, bool recusrive) {
-      if (IsEmptyType(type, recusrive)) return true;
-      if (!HastStorableClassAttribute(type)) return false;
-      return !recusrive || type.BaseType == null || IsEmptyOrStorableType(type.BaseType, true);
+    #endregion
+
+    #region [StorableClass] helpers
+
+    private static StorableClassAttribute GetStorableClassAttribute(Type type) {
+      return (StorableClassAttribute)type
+        .GetCustomAttributes(typeof(StorableClassAttribute), false)
+        .SingleOrDefault();
+    }    
+
+    private static bool HasStorableClassAttribute(Type type) {
+      return type.GetCustomAttributes(typeof(StorableClassAttribute), false).Length > 0;
     }
 
-    private static bool HastStorableClassAttribute(Type type) {
-      return type.GetCustomAttributes(typeof(StorableClassAttribute), false).Length > 0;
-    }
+    #endregion
+
+    #region other helpers
 
     private static bool IsEmptyType(Type type, bool recursive) {
@@ -136,4 +162,7 @@
       return pi.CanWrite;
     }
+
+    #endregion
+
   }
 }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 3030)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 3031)
@@ -43,5 +43,5 @@
 
     public IEnumerable<Tag> CreateMetaInfo(object o) {
-      StorableHookAttribute.InvokeHook(HookType.BeforeSerialization, o);
+      InvokeHook(HookType.BeforeSerialization, o);
       return new Tag[] { };
     }
@@ -79,5 +79,5 @@
         }
       }
-      StorableHookAttribute.InvokeHook(HookType.AfterDeserialization, instance);
+      InvokeHook(HookType.AfterDeserialization, instance);
     }
 
@@ -89,4 +89,6 @@
       BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
 
+    private static readonly object[] emptyArgs = new object[] { };
+
     private sealed class TypeQuery {
       public Type Type { get; private set; }
@@ -95,4 +97,14 @@
         this.Type = type;
         this.Inherited = inherited;
+      }
+    }
+
+    private sealed class HookDesignator {
+      public Type Type { get; set; }
+      public HookType HookType { get; set; }
+      public HookDesignator() { }
+      public HookDesignator(Type type, HookType hookType) {
+        Type = type;
+        HookType = HookType;
       }
     }
@@ -107,4 +119,7 @@
     private Dictionary<Type, ConstructorInfo> constructorCache =
       new Dictionary<Type, ConstructorInfo>();
+    
+    private Dictionary<HookDesignator, List<MethodInfo>> hookCache =
+      new Dictionary<HookDesignator, List<MethodInfo>>();
 
     #endregion
@@ -150,5 +165,28 @@
     }
 
+    private void InvokeHook(HookType hookType, object obj) {
+      if (obj == null)
+        throw new ArgumentNullException("Cannot invoke hooks on null");
+      foreach (MethodInfo mi in GetHooks(hookType, obj.GetType())) {
+        mi.Invoke(obj, emptyArgs);
+      }
+    }
+
+    private IEnumerable<MethodInfo> GetHooks(HookType hookType, Type type) {
+      lock (hookCache) {
+        List<MethodInfo> hooks;
+        var designator = new HookDesignator(type, hookType);
+        hookCache.TryGetValue(designator, out hooks);
+        if (hooks != null)
+          return hooks;
+        hooks = new List<MethodInfo>(StorableReflection.CollectHooks(hookType, type));
+        hookCache.Add(designator, hooks);
+        return hooks;
+      }
+    }
+
     #endregion
+
+    
     
   }
Index: trunk/sources/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj	(revision 3030)
+++ trunk/sources/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj	(revision 3031)
@@ -122,5 +122,5 @@
     <Compile Include="Default\CompositeSerializers\Storable\StorableMemberInfo.cs" />
     <Compile Include="Default\CompositeSerializers\Storable\StorableClassType.cs" />
-    <Compile Include="Default\CompositeSerializers\Storable\DataMemberAccessor.cs" />
+    <Compile Include="Core\DataMemberAccessor.cs" />
     <Compile Include="Default\CompositeSerializers\Storable\StorableClassAttribute.cs" />
     <Compile Include="Default\CompositeSerializers\Storable\StorableAttribute.cs" />
