'''
Created on Jul 17, 2014

@author: roj-idl71
'''

import cPickle
import msgpack_numpy
import jsonpickle
import yaml

# import JROMsgpack
# import JROJsonpickle

class Serializer(object):
    
    def __init__(self):
        
        self.serializer = None
    
    def dumps(self, obj, **kwargs):
        
        return self.serializer.dumps(obj, **kwargs)
        
    def loads(self, obj, **kwargs):
        return self.serializer.loads(obj, **kwargs)
        
class cPickleSerializer(Serializer):
    
    def __init__(self):
        self.serializer = cPickle
        
    def dumps(self, obj, **kwargs):
        return self.serializer.dumps(obj, 2)
          
    def loads(self, obj, **kwargs):
        return self.serializer.loads(obj)

class msgpackSerializer(Serializer):
    
    def __init__(self):
        
        self.serializer = msgpack_numpy
    
    def dumps(self, obj, **kwargs):
        return self.serializer.packb(obj)
          
    def loads(self, obj, **kwargs):
        return self.serializer.unpackb(obj)
    
class jsonpickleSerializer(Serializer):
    
    def __init__(self):
        
        self.serializer = jsonpickle
        
    def dumps(self, obj, **kwargs):
        return self.serializer.encode(obj, **kwargs)
         
    def loads(self, obj, **kwargs):
        return self.serializer.decode(obj, **kwargs)

class yamlSerializer(Serializer):
    
    def __init__(self):
        
        self.serializer = yaml
        
    def dumps(self, obj, **kwargs):
        return self.serializer.dump(obj, **kwargs)
         
    def loads(self, obj, **kwargs):
        return self.serializer.load(obj, **kwargs)

class DynamicSerializer(Serializer):
    
    def __init__(self, mode = 'cPickle'):
        
        if mode == 'cPickle':
            self.serializer = cPickleSerializer()
        
        if mode == 'jsonpickle':
            self.serializer = jsonpickleSerializer()
        
        if mode == 'yaml':
            self.serializer = yamlSerializer()
        
        if mode == 'msgpack':
            self.serializer = msgpackSerializer()
        
    
if __name__ == '__main__':
    pass