Need help making interactables class more expandable

the code is a class for an interactable object, it contains generic functionality that an interactable class should have. However, I worry that it isn’t very expandable, i.e. I don’t have a clear idea whether or not I can produce more classes like items and levers. Help cleaning up the code would be very much appreciated!

also note that when I say generic, I mean it’s a base class function.

local Interactables = {}
Interactables.__index = Interactables
-- generic methods 
function Interactables:Generic_BindToInput(input: Enum.KeyCode, length: deprecated) 
	self.Input = input
	self.InputLength = length  
	self._Events.OnStatusChanged:Fire()
	return true;
end
function Interactables:Generic_SetModel(model: model)
	self.Model = model
	self.ModelHierachy = model:GetChildren()
	self._Events.OnStatusChanged:Fire()
	return true; 
end
function Interactables:Pop()
	warn("Imploding an interactable instance/n")
	self._Events = {}
	self._Data = {}
	self._Constants = {}
	self = {}
	self = nil
	return true, "popped"
end
--Manipulation
function Interactables:FireEvent(nothing)
	warn("Function Deprecated")
	self._Events.OnInteract:Fire()
	return true;
end
function Interactables:Generic_FireEvent(event)
	local tableofgenericevents = {
		["StatusChanged"]= self._Events.OnStatusChanged;
		["OnInteract"]= self._Events.OnInteract
	}
	tableofgenericevents[event]:Fire()
	return true;
end
-- initialization
function Interactables.Init(Model,input)
	local returntable = setmetatable({
		_Events = {
			OnInteract = Instance.new("BindableEvent");
			OnStatusChanged = Instance.new("BindableEvent")
		};
		_Data = {
			Model = Model or nil;
			InputLength = 0;
			Input = input or nil
		};
	
		
		
	}, Interactables)
	
	return returntable
	
end
return Interactables

using the module script above, i created a simple DOOR class to show what it does

local interactClass = require(script.Parent)

local module = {}

module.__index = interactClass.Init()
module.__Metatable = warn("Cannot Change Value In Metatable 'Door'")
function module.new(model, input)
	local self = setmetatable({
		_Data = {
			doorOpen = false;
			Model = model;
			InputLength = 0;
			Input = input
		};
		_Constants = {
			hinge = model.Hinge;
			closeCFrame =  hinge.CFrame * CFrame.Angles(0, 0, 0);
			OpenCFrame = hinge.CFrame * CFrame.Angles(model:GetAttribute("Angle"), math.rad(0), 0);
		}
	}, module)
	game:GetService("ServerStorage").Bindables.Door.Event.Event:Connect(function(door)
		if door == self._Data.Model then 
			self:FireEvent()
		end
	end)
	
	self._Events.OnInteract.Event:Connect(function()
		local door = self._Data.Model.door
		local TweenService = game:GetService("TweenService")

		local hinge = door.Hinge
		local prompt = door.Door.ProximityPrompt

		local tweenInfo = TweenInfo.new(1)
		local tweenOpen = TweenService:Create(hinge, tweenInfo, self._Constants.OpenCFrame)
		local tweenClose = TweenService:Create(hinge, tweenInfo, self._Constants.closeCFrame)


		if prompt.ActionText == "Close" then
			self._Data.doorOpen = false
			door.Sounds.DoorClose:Play()
			tweenClose:Play()
			prompt.ActionText = "Open"
		else
			self._Data.doorOpen = true
			door.Sounds.DoorOpen:Play()
			tweenOpen:Play()
			prompt.ActionText = "Close"
		end
	end)
end


return module