Class metatable index is acting very weird

Here is my module script:

function Module:NewBoid(Origin, Environment)
	local NewBoid = setmetatable(Classes.Boid, {})
	NewBoid.Environment = Environment
	NewBoid.Body = Templates.Body:Clone();
	NewBoid.Speed = 1;
	NewBoid.Range = 15;
	NewBoid.Fov = 0.5;
	NewBoid.Enabled = true;
	
	-- Body
	
	NewBoid.Body.Parent = NewBoid.Environment
	NewBoid.Body.Position = Origin
	
	
	return NewBoid
end

function Classes.Boid:Update()
	local LookDirection = self.Body.CFrame.LookVector
	local BoidsInRange = {}
	
	for BoidI, Boid in pairs(self.Environment:GetChildren()) do
		if Boid:IsA("BasePart") then
			local Sub = Boid.Position - self.Body.Position
			local Distance = Sub.Magnitude
			local LookDot = LookDirection:Dot(Boid.CFrame.LookVector)
			
			if Distance <= self.Range and LookDot > self.Fov then
				table.insert(BoidsInRange, Boid)
			end
		end
	end
	
	for BoidI, Boid in pairs(BoidsInRange) do
		local Sub = Boid.Position - self.Body.Position
		local Distance = Sub.Magnitude
		local Ratio = math.clamp(Distance / 4, 0, 1)
		
		LookDirection -= Ratio * Sub
	end
	
	self.Body.Position += (LookDirection / 4) * self.Speed
	self.Body.CFrame = CFrame.lookAt(self.Body.Position, self.Body.Position + LookDirection)
end

function Classes.Boid:Destroy()
	self.Body:Destroy();
	self.Range = nil;
	self.Enabled = nil;
	
	self = nil
end


return Module

If you can’t tell, I am trying to simulate boids/birds, It’s not finished though.