  */
 import TraceLog
 
-internal let ErrorDomain      = "FSErrorDomain"
-internal let DefaultBundleKey = "TCCConfiguration"
+// Default values for override methods
+public let defaultBundleKey = "TCCConfiguration"
+public let defaultDefaults  = [String: AnyObject]()
 
-internal enum ErrorDomainCode: Int {
-    case InitializationErrorCode     = 100
-    case MissingConfigurationKey     = 101
-    case InvalidConfigurationKeyType = 102
+internal enum Error: ErrorType {
+    case FailedInitialization(message: String)
 }
 
-@objc(CCConfiguration)
-public class Configuration : NSObject {
-
+/**
+    Main Configuration implementation
+*/
+public class Configuration<P: NSObjectProtocol> {
+    
     /**
      *  This method should return a dictionary keyed by property name
      *  with the values for defaults in the instance. Value types must

     * @default TCCConfiguration
     */
    public class func bundleKey () -> String {
        return DefaultBundleKey
    }

    
    /**
     *  Creates an implementation and instance of
     *  configuration instance for the protocol
     *  specified.
     */
    @objc
    @warn_unused_result
    public final class func configurationForProtocol (objcProtocol: Protocol) -> AnyObject? {
        return instance(objcProtocol)
    }
    
    /**

     *  to the correct type.
     */
    public class func defaults () -> [String: AnyObject] {
        return defaultDefaults
    }
    
    /**
