Preheat your oven to 375°F.
Cook the pasta according to package instructions until al dente. Drain and set aside.
In a large saucepan, melt the butter over medium heat.
Add the flour to the saucepan and whisk until smooth. Cook for 1-2 minutes, stirring constantly.
Gradually add the milk to the saucepan, whisking constantly to prevent lumps from forming.
Add the salt and black pepper to the saucepan and stir to combine.
Continue cooking the sauce until it thickens, stirring frequently. This should take around 10 minutes.
In a large pan sauté the chopped onions with minced garlic and ground meat until caramelised and translucent.
Add the spices and when aromatic add the tomato paste with 1 cup of water. Place the lid on top of the pan allow to cook on low for 15 minutes. Mix often to make sure the meat doesn't burn at the bottom.
If using any optional ingredients, add them to the sauce and stir to combine.
Add a few ladles of the béchamel sauce to the cooked pasta and stir to coat evenly.
Pour 1/2 of the pasta mixture into a large baking dish and flatten to cover the base evenly.
Pour the ground meat mixture on top of the pasta and flatten to cover the pasta.
Then pour the rest of the pasta on top followed by all the remaining béchamel sauce.
Bake the pasta for 30-45 minutes, or until the top looks broiled and bubbly.
Let the pasta cool for a few minutes before serving.