Easiest way to learn self and setmetatable

Basically, i see a lot of developers using metatable for modules and since i’m learning the freedom of using module instead of standart scripts.

There i found PlayerModule in PlayerScripts:

--[[
	PlayerModule - This module requires and instantiates the camera and control modules,
	and provides getters for developers to access methods on these singletons without
	having to modify Roblox-supplied scripts.

	2018 PlayerScripts Update - AllYourBlox
--]]

local PlayerModule = {}
PlayerModule.__index = PlayerModule

function PlayerModule.new()
	local self = setmetatable({},PlayerModule)
	self.cameras = require(script:WaitForChild("CameraModule"))
	self.controls = require(script:WaitForChild("ControlModule"))
	return self
end

function PlayerModule:GetCameras()
	return self.cameras
end

function PlayerModule:GetControls()
	return self.controls
end

function PlayerModule:GetClickToMoveController()
	return self.controls:GetClickToMoveController()
end

return PlayerModule.new()

Is there a way to explain what is a metatable and why it is usefull and what it can give me as a learning scripter?

image
I’m willing to spend hours learning this roblox function so do you guys have any fast learning method?

self is a table that is passed automatically when a function is called with : that is all what it is
–example

local tbl = {TEST = 5}

function tbl:TestMethod()
	-- self is passed automaticly and self is tbl or the value before :
	
	print(self.TEST)
	-- the previous line is the same as
	print(tbl.TEST)
end
-- the previoud function is the same as
function TestFunction(tbl)
	print(tbl.TEST)
end

metatables are a way to add extra functionality to tables
this video helped me understand it

Metatables - Roblox Scripting Tutorial - YouTube