find model instances based on given filter (spec)
        The filter is based on available server-calls, so some values might not be available for filtering.
        Multiple filter-values is going to do multiple server-calls.
        For complex filters in small datasets, it might be faster to fetch all and do your own in-memory filter.
        Empty filter will fetch all.

        :param model: subclass of EConomicsModel
        :param spec: mapping of values to filter by
        :return: a list of EConomicsModel instances

def __find_handles(self, model, **spec):
        """ find model instances based on given filter (spec)
        The filter is based on available server-calls, so some values might not be available for filtering.
        Multiple filter-values is going to do multiple server-calls.
        For complex filters in small datasets, it might be faster to fetch all and do your own in-memory filter.
        Empty filter will fetch all.

        :param model: subclass of EConomicsModel
        :param spec: mapping of values to filter by
        :return: a list of EConomicsModel instances
        """
        server_calls = []
        filter_names = dict([(f['name'], f['method'],) for f in model.get_filters()])
        if not spec:
            server_calls.append({'method': "%s_GetAll" % model.__name__, 'args': []})
        else:
            for key, value in spec.items():
                if not key in filter_names:
                    raise ValueError("no server-method exists for filtering by '%s'" % key)
                args = []
                if not hasattr(value, '__iter__'):
                    value = [value]

                if key.endswith('_list'):
                    vtype = type(value[0]).__name__
                    # TODO: this surely does not cover all cases of data types
                    array = self.soap_factory.create('ArrayOf%s' % vtype.capitalize())
                    getattr(array, "%s" % vtype).extend(value)
                    args.append(array)
                else:
                    args.extend(value)

                method = "%s_%s" % (model.__name__, filter_names[key])
                if filter_names[key].startswith('GetAll'):
                    args = []
                server_calls.append({'method': method, 'args': args, 'expect': "%sHandle" % model.__name__})

        handles = [
            map(Handle, self.fetch_list(scall['method'], scall.get('expect'), *scall['args']))
            for scall in server_calls
        ]
        return [h.wsdl for h in reduce(set.intersection, map(set, handles))]