@Override
	public boolean canBeLearnedBy(MOB teacherM, MOB studentM)
	{
		if(!super.canBeLearnedBy(teacherM,studentM))
			return false;
		if(studentM==null) return true;
		final CharClass C=studentM.charStats().getCurrentClass();
		if(CMLib.ableMapper().getQualifyingLevel(C.ID(), false, ID())>=0)
			return true;
		final boolean crafting = ((classificationCode()&Ability.ALL_DOMAINS)==Ability.DOMAIN_CRAFTINGSKILL);
		final AbilityMapper.AbilityLimits remainders = CMLib.ableMapper().getCommonSkillRemainder(studentM, this);
		if(remainders.commonSkills<=0)
		{
			teacherM.tell(_("@x1 can not learn any more common skills.",studentM.name(teacherM)));
			studentM.tell(_("You have learned the maximum @x1 common skills, and may not learn any more.",""+C.maxCommonSkills()));
			return false;
		}
		if(remainders.specificSkillLimit<=0)
		{
			teacherM.tell(_("@x1 can not learn any more @x2crafting common skills.",studentM.name(teacherM),(crafting?"":"non-")));
			final int max = crafting ? C.maxCraftingSkills() : C.maxNonCraftingSkills();
			studentM.tell(_("You have learned the maximum @x1@x2crafting skills, and may not learn any more.",""+max,(crafting?" ":" non-")));
			return false;
		}
		return true;
	}