:cls        (class) <Class> of the object requested
        :route      (dict) Debris route schema
        :args       (list) of argument provided for initializing
        :kwargs     (dict) of given data to construct the object

def get(cls, route, args, kwargs):
        """
        :cls        (class) <Class> of the object requested
        :route      (dict) Debris route schema
        :args       (list) of argument provided for initializing
        :kwargs     (dict) of given data to construct the object
        """
        # ---------
        # Namespace
        # ---------
        if None in args:
            namespace = None
        else:
            namespace = call(route.get('namespace'), args, kwargs) if route.get('namespace') \
                        else ".".join(map(str, [cls.__name__] + list(args)))

        # bool, can store in memory
        # _in_memory = route.get('memory', True)

        # ---------------
        # Get from Memory
        # ---------------
        # if _in_memory and namespace:
        # check for this namespace
        try:
            return debris.services.memory.get(namespace)
        except LookupError:
            pass

        # ------------------------
        # Constructed w/ init args
        # ------------------------
        # - this method bypasses many of the debris
        #   features for cacheing because the 
        #   kwargs should contain all the construction information
        # - replaces existing object in memory beceause this data is 
        #   given to be "newer" data
        if len(kwargs) > 0:
            cls = call(route.get('substitute'), args, kwargs) or cls
            obj = cls.__new__(cls, *args, **kwargs)
            obj.__init__(*args, **kwargs)
            if namespace:
                debris.services.memory.set(namespace, obj)
            return obj

        elif not namespace:
            raise LookupError("No id/key provided to initialize object "+namespace.replace('.', '(', 1).replace('.', ', ')+")")

        # -----------------
        # Retrieve the Data
        # -----------------
        insp = inspect.getargspec(cls.__init__)
        data = None
        if route.get('get'):
            for r in route['get']:
                if r['service'] == 'postgresql':
                    iwargs = dict([(k, args[i] if len(args) > i else None) for i, k in enumerate(insp.args[1:])])
                    data = r["bank"].get(r['query'], **iwargs)
                else:
                    data = r["bank"].get(namespace)
                if data:
                    break

            # -----------------
            # Retrieve the Data
            # -----------------
            if not data:
                raise LookupError("Data could not be found for "+namespace.replace('.', '(', 1).replace('.', ', ')+")")

        if not data:
            data = {}

        # --------------------
        # Manage Args / Kwargs
        # --------------------
        # remove the default "self" argument
        insp.args.pop(0)
        [data.pop(k) for k in insp.args if k in data]

        # substiture class w/ known data
        if route.get('substitute'):
            cls = callattr(cls, route['substitute'], args, data) or cls

        # ----------------
        # Initialize Class
        # ----------------
        obj = cls.__new__(cls, *args, **data)
        obj.__init__(*args, **data)

        # ---------------
        # Store in Memory
        # ---------------
        if namespace:
            debris.services.memory.set(namespace, obj)

        # return the constructed object
        return obj