jgongo
3/3/2013 - 12:32 PM

Creation of simple Core Data stack using Typhoon 1.1.2

Creation of simple Core Data stack using Typhoon 1.1.2

#import "Assembly+CoreData.h"
#import <Typhoon/Typhoon.h>
#import <CoreData/CoreData.h>


#pragma mark NSPersistentStoreCoordinator configuration

@interface NSPersistentStoreCoordinator (InjectedConfiguration)
- (void)configureStoreCoordinatorUsingDefaultComponentFactory;
- (void)configureStoreCoordinatorUsingDefaultComponentFactoryWithLightweightMigration;
@end


@implementation NSPersistentStoreCoordinator (InjectedConfiguration)

- (void)configureStoreCoordinatorUsingDefaultComponentFactory
{
    NSURL *storeURL = [[TyphoonComponentFactory defaultFactory] componentForKey:@"storeURL"];
    [self addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:nil];
}

- (void)configureStoreCoordinatorUsingDefaultComponentFactoryWithLightweightMigration
{
    NSURL *storeURL = [[TyphoonComponentFactory defaultFactory] componentForKey:@"storeURL"];
    [self addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:nil];
}

@end


#pragma mark - Assembly Core Data stack definition

@implementation Assembly (CoreData)

#pragma mark Managed object model creation

- (id)mainBundle
{
    return [TyphoonDefinition withClass:[NSBundle class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(mainBundle);
    }];
}

- (id)modelURL
{
    return [TyphoonDefinition withClass:[NSBundle class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(URLForResource:withExtension:);
        [initializer injectParameterAt:0 withValueAsText:@"model" requiredTypeOrNil:[NSString class]];
        [initializer injectParameterAt:1 withValueAsText:@"momd"  requiredTypeOrNil:[NSString class]];
    } properties:^(TyphoonDefinition *definition) {
        definition.factory = [self mainBundle];
    }];
}

- (id)managedObjectModel
{
    return [TyphoonDefinition withClass:[NSManagedObjectModel class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(initWithContentsOfURL:);
        [initializer injectParameterAtIndex:0 withDefinition:[self modelURL]];
    }];
}

#pragma mark Persistent store coordinator creation

- (id)fileManager
{
    return [TyphoonDefinition withClass:[NSFileManager class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(defaultManager);
    }];
}

- (id)applicationDocumentsDirectories
{
    return [TyphoonDefinition withClass:[NSArray class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(URLsForDirectory:inDomains:);
        [initializer injectParameterAt:0 withValueAsText:@"9" requiredTypeOrNil:nil]; // NSDocumentDirectory
        [initializer injectParameterAt:1 withValueAsText:@"1" requiredTypeOrNil:nil]; // NSUserDomainMask
    } properties:^(TyphoonDefinition *definition) {
        definition.factory = [self fileManager];
    }];
}

- (id)applicationDocumentsDirectory
{
    return [TyphoonDefinition withClass:[NSURL class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(lastObject);
    } properties:^(TyphoonDefinition *definition) {
        definition.factory = [self applicationDocumentsDirectories];
    }];
}

- (id)storeURL
{
    return [TyphoonDefinition withClass:[NSURL class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(URLByAppendingPathComponent:);
        [initializer injectParameterAt:0 withValueAsText:@"database.sqlite" requiredTypeOrNil:[NSString class]];
    } properties:^(TyphoonDefinition *definition) {
        definition.factory = [self applicationDocumentsDirectory];
    }];
}

- (id)persistentStoreCoordinator
{
    return [TyphoonDefinition withClass:[NSPersistentStoreCoordinator class] initialization:^(TyphoonInitializer *initializer) {
        initializer.selector = @selector(initWithManagedObjectModel:);
        [initializer injectParameterAtIndex:0 withDefinition:[self managedObjectModel]];
    } properties:^(TyphoonDefinition *definition) {
        definition.afterPropertyInjection = @selector(configureStoreCoordinatorUsingDefaultComponentFactory);
    }];
}

#pragma mark Managed object context creation

- (id)managedObjectContext
{
    return [TyphoonDefinition withClass:[NSManagedObjectContext class] properties:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(persistentStoreCoordinator) withDefinition:[self persistentStoreCoordinator]];
        definition.scope = TyphoonScopeSingleton;
    }];
}

@end