ExampleFu = FuBarPlugin:new({
	name          = ExampleFuLocals.NAME,
	description   = ExampleFuLocals.DESCRIPTION,
	version       = "0.1.0",
	releaseDate   = "03-29-2006",
	aceCompatible = 103,
	fuCompatible  = 100,
	author        = "Mr. Plugin Writer",
	email         = "plugin@writer.com",
	website       = "http://plugin--writer.wowinterface.com/",
	category      = "others", -- Set this to the appropriate category.
	db            = AceDatabase:new("ExampleFuDB"),
	defaults      = {
		value = false,
	},
	cmd           = AceChatCmd:new(ExampleFuLocals.COMMANDS, ExampleFuLocals.CMD_OPTIONS),
	loc           = ExampleFuLocals,
	hasIcon       = false,
	showOnRight   = false,
	updateTime    = 1.0,
	-- Methods
	IsValue = function(self)
		-- self.data is a database provided for you (inside ExampleFuDB) that is specific to the current profile.
		return self.data.value
	end,
	
	ToggleValue = function(self, loud)
		self.data.value = not self.data.value
		if loud then -- loud will be set to a string if called from the command line, thus being non-false.
			self.cmd:status(self.loc.ARGUMENT_VALUE, self.data.value and 1 or 0, FuBarLocals.MAP_ONOFF)
		end
		self:Update()
		return self.data.value
	end,
	
	Initialize = function(self)
		-- put something that would be run only once, at the start
		-- you can check if self.data.version is a previous version here, and if you do provide adequate steps for backwards-compatibiliy.
	end,
	
	Enable = function(self)
		-- put something that would be run every time this is enabled. Happens at the very start as well, after Initialize.
		
		self:RegisterEvent("UNIT_TARGET_CHANGED", "OnUnitTargetChanged")
	end,
	
	Disable = function(self)
		-- you do not need to unregister the event here, all events/hooks are unregistered on disable implicitly.
	end,
	
	Report = function(self)
		-- this is run when the user types /bpex report
		self.cmd:report({
			{text=self.loc.ARGUMENT_VALUE, val=(self:IsValue() and 1 or 0), map=FuBarLocals.MAP_ONOFF},
		})
	end,
	
	MenuSettings = function(self, level, value)
		-- this is run at the top of the dropdown menu, it is where you should allow your users to configure the plugin to their liking.
		UIDropDownMenu_AddButton({
			text = self.loc.MENU_CHANGE_VALUE,
			func = function()
				self:ToggleValue()
			end,
			checked = self:IsValue(),
			keepShownOnClick = TRUE
		})
	end,
	
	OnUnitTargetChanged = function(self)
		-- do something here.
		-- this is called every time UNIT_TARGET_CHANGED is fired.
	end,
	
	OnUpdate = function(self, t)
		-- this is run once every `self.updateTime` seconds.
		self:Update()
	end,
	
	UpdateData = function(self)
		-- calculate data you would use in both UpdateText() and UpdateTooltip() here.
		-- even if you only use one, it is typically better structure to calculate your data here anyway.
		self.textValue = 500
	end,
	
	UpdateText = function(self)
		self:SetText(FuBarUtils.White(self.textValue))
	end,
	
	UpdateTooltip = function(self)
		FuBarTooltip:AddCategory("ALPHA", "Alpha")
		FuBarTooltip:AddCategory("BRAVO", "Bravo")
		
		FuBarTooltip:AddLine("BRAVO", "boom")
		FuBarTooltip:AddLine("ALPHA", "apple")
		FuBarTooltip:AddLine("BRAVO", "beauty")
		
		--[[
		currently, it will look like:
		-----
		Alpha
		apple
		
		Bravo
		boom
		beauty
		-----
		even though boom is declared before apple, it is under the BRAVO category, which comes after ALPHA. beauty will come after boom, though, since in the category lines are assigned chronologically.
		
		The point to categories is to provide a consistent and clean interface for the user, as well as providing some cool theoretical tricks for later.
		]]--
		
		FuBarTooltip:SetHint("Click to do something")
		-- as a rule, if you have an OnClick or OnDoubleClick or OnMouseUp or OnMouseDown, you should set a hint.
	end,
	
	OnClick = function(self)
		-- do something
	end,
})

ExampleFu:RegisterForLoad()