public function filter()
    {

        $keepUs = call_user_func_array([$this, 'normaliseFilterArgs'], func_get_args());

        $itemsToKeep = [];
        foreach ($this->items as $item) {
            $keepItem = true;
            foreach ($keepUs as $column => $value) {
                if ((is_array($value) && !in_array($this->extractValue($item, $column), $value))
                    || (!is_array($value) && $this->extractValue($item, $column) != $value)
                ) {
                    $keepItem = false;
                    break;
                }
            }
            if ($keepItem) {
                $itemsToKeep[] = $item;
            }
        }

        $list = clone $this;
        $list->items = $itemsToKeep;
        return $list;
    }