I've come across a function that I think may be wrong.
Consider changing
public function inGroups(array $groups) {
foreach($this->Groups() as $group)
$memberGroups[] = $group->Title;
return count(array_intersect($memberGroups, $groups)) > 0;
}
To:
public function inGroups(array $groups) {
foreach($this->Groups() as $group)
$memberGroups[] = $group->ID;
return count(array_intersect($memberGroups, $groups)) > 0;
}
To check a member's permissions by group Title is unreliable as a title can duplicated.