i did this a few times, but as far there is no (working) way to add abilities to hero without using abilities.
The way i used was simply and, as you put it, lengthy:
event: unit aquires item
cond:
start or
itemtype = ability_item_1
itemtype = ability_item_2
...
end or
event:
if itemtype = ability_item_1 then
add (ability_1) to (hero manipulating item)
call makeAbilityPermanent(ability_1)
endif
another way would be with custom code, i guess that would be way shorter, but you would need 2 instead of 1 trigger, but they are way shorter.
I'll write it as good as i can remember the propber jass code:
function init takes nothing returns nothing
//do this for each item/ability you want
//you cannot add more than one ability per item
StoreInteger(<your gamecache>, "Abilities", I2S('your item code here'), 'your ability code here')
//e.g. StoreInteger(udg_gamecache, "Abilities", I2S('I000'), I2S('A000'))
endfunction
function LearnAbilityFromItem takes unit whichHero, item whichItem returns nothing
//i dunno the exact function name, but i hope you understanad what i mean
local ability whichAbility = GetInteger(<your gamecache>, "Abilities", I2S('itemtype of(whichItem)'))
addAbilityToUnit(whichHero, whichAbility)
endfunction