public function microPostList($filter, $sortBy = 'ID', $since = 0, $before = false, $topLevelOnly = true, $tags = array(), $offset = 0, $number = 10) {
		if ($topLevelOnly) {
			$filter['ParentID'] = '0';
		}

		$filter['Deleted'] = 0;
		
		if ($since) {
			$since = Convert::raw2sql($since); 
			$filter['ID:GreaterThan'] = $since;
		}
		
		if ($before !== false) {
			$before = (int) $before;
			$filter['ID:LessThan'] = $before;
		}

        if (!isset($filter['Hidden'])) {
            $filter['Hidden'] = 0;
        }

		$sort = array();

		if (is_string($sortBy)) {
			if (in_array($sortBy, $this->canSort)) {
				$sort[$sortBy] = 'DESC';
			} 

			// final sort as a tie breaker
			$sort['ID'] = 'DESC';
		} else if (is_array($sortBy)) {
			// $sort = $sortBy;
			foreach ($sortBy as $sortKey => $sortDir) {
				if (in_array($sortKey, $this->canSort)) {
					$sort[$sortKey] = $sortDir;
				} 
			}
		} else {
			$sort = array('ID' => 'DESC');
		}

		$offset = (int) $offset;
		$limit = $number ? $offset . ', ' . (int) $number : '';

		if (count($tags)) {
			$filter['Tags.Title'] = $tags;
		}
		

		$this->recordUserAction();
		$list = MicroPost::get()->filter($filter)->sort($sort)->limit($limit);
		$list = $this->updatePostList($list)->restrict();
        
		// if we're only allowing singe votes, we need to get _all_ the current user's votes and
		// mark the individual posts that have been voted on; this allows the toggling 
		// of the vote options
		if ($this->singleVotes && $this->securityContext->getMember()) {
			$ids = $list->column('ID');
			$votes = MicroPostVote::get()->filter(array(
				'UserID'		=> $this->securityContext->getMember()->ID,
				'PostID'		=> $ids,
			));
			$map = $votes->map('PostID', 'Direction')->toArray();
			foreach ($list as $post) {
				if (isset($map[$post->ID])) {
					$post->UserVote = $map[$post->ID] > 0 ? 'upvote' : 'downvote';
				}
			}
		}

		return $list;
	}